# Welcome to SEO Utils

### Overview

SEO Utils is a desktop application that provides a set of essential tools and utilities for your SEO tasks, including Backlink Analytics, Traffic Analytics, Keyword Clustering, etc.

### Supported Platforms

* macOS Monterey 12.0+ (Intel and Apple Silicon)
* Windows 10/11 (AMD64)
* Windows 10/11 (ARM64) (Working on)
* Linux — Ubuntu 22.04 and above, or any distribution with GTK 3 and WebKit2GTK 4.1

### Features

| Feature                                                           | Description                                                                                                                                                                                                                                                            | DataForSEO Required (\*)? |
| ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------- |
| Backlinks Analytics                                               | Provides detailed insights into the backlink profile of any website, including the number, quality, and sources of backlinks.                                                                                                                                          | Yes                       |
| Traffic Analytics                                                 | Unleash your marketing potential! Uncover rivals' traffic stats, identify growth opportunities, organic keywords, and supercharge your strategy.                                                                                                                       | Yes                       |
| [Semantic Keyword Clustering](/guide/semantic-keyword-clustering) | Do you often wonder if two keywords can be targeted together on a page or struggle with a large list of keywords that ChatGPT or other tools can't cluster due to token limits or cost? This tool resolves all those issues.                                           | No                        |
| [SERP Clustering](/guide/serp-clustering)                         | Same as Semantic Clustering, but use SERP data to cluster keywords.                                                                                                                                                                                                    | No (or Yes)               |
| Sitemap Extractor                                                 | Extract all URLs from a sitemap                                                                                                                                                                                                                                        | No                        |
| SERP Similarity                                                   | Quickly shows the overlap between two keywords, helping to decide if they can be targeted together on the same page.                                                                                                                                                   | Yes & No                  |
| SERP UULE                                                         | Check Google Search Results for different locations.                                                                                                                                                                                                                   | No                        |
| [SERP Extractor](/guide/serp-extractor)                           | Extract detailed SERP data including titles, URLs, featured snippets, and other SERP features for any keyword.                                                                                                                                                         | Yes & No                  |
| Keyword Explorer                                                  | Comprehensive solution for researching and analyzing keywords. It helps you discover relevant keywords, understand their search volume, competition level, and trends, and rank competitors on SERP.                                                                   | Yes                       |
| Content Gap                                                       | Easily pull and bulk check all mentions of your keywords with a single click, helping you understand and enhance their ranking.                                                                                                                                        | Yes                       |
| Bulk Analysis                                                     | Run backlink, traffic analysis on 1,000 URLs per time.                                                                                                                                                                                                                 | Yes                       |
| [Google Search Console Integration](/guide/google-search-console) | Providing advanced features such as checking if a keyword appears in the title, headings, and body of a page.                                                                                                                                                          | No                        |
| Bulk Google PAA                                                   | Automatically extract information from the "People Also Ask" section by clicking through multiple layers for a large number of keywords all at once.                                                                                                                   | No                        |
| Bulk Bing/Google Autocomplete                                     | Extract all keywords from Google/Bing Autocomplete with many keyword modifiers.                                                                                                                                                                                        | No                        |
| [Auto Indexing](/guide/auto-indexing-tool)                        | Use your personal Google Service Account to automatically submit many URLs for indexing.                                                                                                                                                                               | No                        |
| [IndexNow](/guide/indexnow)                                       | Automatically submit URLs to Bing, Yandex, Naver, Seznam.cz, and Yep.                                                                                                                                                                                                  | No                        |
| [Bulk SEO Metadata Optimizer](/guide/bulk-seo-metadata-optimizer) | Allows you to optimize **titles, meta descriptions, and H1 headings** across multiple pages using AI models (Cloud or Local). This tool is perfect for SEOs looking to save time while enhancing metadata for better search engine visibility and click-through rates. | No                        |
| [Content Struct](/guide/content-struct)                           | Scrapes all headings, metadata, and main content from the top 20 URLs on the SERP, and allows you to generate a content outline using either cloud-based AI or local AI models.                                                                                        | No                        |
| Backlink Gap                                                      | Compares your website's backlink profile with those of your competitors, identifying opportunities where you can build more backlinks to improve your site's search engine ranking.                                                                                    | Yes                       |
| [GMB Rank Tracker](/guide/google-my-business-rank-tracker)        | This tool lets you track your Google Business profile's ranking on Google Maps search results for specific locations. It also provides insights about your competitors, helping you develop strategies to improve your ranking.                                        | Yes & No                  |
| [N.A.P Finder](/guide/n.a.p-finder)                               | Automates citation tracking by scanning the web for variations of a business’s name, address, and phone number, making it easy to spot inconsistent or rogue listings.                                                                                                 | Yes & No                  |
| Content Explorer (Coming soon)                                    | Find the ideas for your content.                                                                                                                                                                                                                                       | Yes                       |
| [Organic Rank Tracker](/guide/organic-rank-tracker)               | Keep track of how keywords rank on desktop, mobile, and local search results. Also, include an analysis of competitor performance.                                                                                                                                     | No (or Yes)               |
| SERP Diff (Coming soon)                                           | Keep an eye on the search engine results page (SERP) and get notified when there are changes or when differences are spotted between two dates.                                                                                                                        | No                        |
| [NLP Text Analysis](/guide/nlp-text-analysis)                     | Extract key topics and entities from text or URLs, powered by Google NLP, TextRazor, and Dandelion, supporting 20+ languages.                                                                                                                                          | No                        |
| [White-labeled Client Report](/guide/white-labeled-client-report) | Create a white-labeled client report with your logo, domain, and optional password. Share the link so clients can view their ranking data.                                                                                                                             | No                        |
| [Log File Analysis](/guide/log-file-analysis)                     | Track and optimize for these AI bots, alongside traditional search engine crawlers like Googlebot and Bingbot.                                                                                                                                                         | No                        |
| [LLM Rank Tracker](/guide/llm-rank-tracker)                       | Monitor your brand’s visibility, sentiment, and citations in AI search results like Google AI Overview, AI Mode, ChatGPT. Track mentions, analyze competitors, and measure trends over time.                                                                           | Yes                       |
| [SEO Tests](/guide/google-search-console/seo-tests)               | *Time-based, URL Switch, and Split Tests* — to run controlled experiments and see the real impact of your changes with Google Search Console data.                                                                                                                     | No                        |
| [Saved Keywords](/guide/saved-keywords)                           | Create keyword lists, import metrics from CSV/Excel, check search volume and difficulty, and organize keywords with tags.                                                                                                                                              | No                        |
| [Bulk Check Mentions](/guide/bulk-check-mentions)                 | Import a list of keywords and URLs, then bulk check if each keyword is mentioned in the title, headings, meta description, and body of each page.                                                                                                                      | No                        |
| [Automations](/guide/automations)                                 | Automate actions when rank tracking completes. When an Organic Rank Tracker or Google Business Rank Tracker snapshot finishes, you can automatically export PDFs, send emails to clients, or trigger webhook URLs.                                                     | No                        |
| [Workspace](/guide/workspace)                                     | Organize and separate your projects, clients, or different SEO campaigns. Each workspace maintains its own set of data.                                                                                                                                                | No                        |
| [Embedding Database](/guide/embedding-database)                   | Convert text into mathematical representations (embeddings) that capture semantic meaning                                                                                                                                                                              | No                        |
| [MCP Server (AI Integration)](/guide/mcp-server)                  | Connect AI assistants like Claude Desktop, Claude Code, or any MCP client to query your SEO data using natural language. Run reports, analyze rankings, fetch backlinks — all with plain English prompts.                                                              | No                        |

(\*) You are required to use your own [DataForSEO account](/guide/seo-data-source) or [rent an API Key from SEO Utils](/guide/rent-dataforseo-api-key).

### Download Links & License Key

After you [purchase a license key](https://larseo.lemonsqueezy.com/checkout/buy/630311af-3d08-47e3-9e29-9531b7ea60e0), you will see the download app links for all platforms and the license key on the checkout page or in your email inbox.

### App Updates

One license key allows you to use the current app version indefinitely. They are also eligible for one year of free updates.

If you don't want to renew the license after one year, you can continue to use the last version of the app that you have access to.

### Troubleshooting

Need help? Visit our [Troubleshooting page](/troubleshooting) for easy solutions and quick fixes to common problems.

### Guides

{% content-ref url="/pages/UGEP7HzFTFJgu8RC3A14" %}
[SEO Data Source](/guide/seo-data-source)
{% endcontent-ref %}

{% content-ref url="/pages/BrPo3MhcgMQZFVKEnoFe" %}
[Semantic Keyword Clustering](/guide/semantic-keyword-clustering)
{% endcontent-ref %}

### Support

* Facebook Group: <https://www.facebook.com/groups/seoutils>


# Feature Demo

Here is a demo that quickly showcases some of the current features of SEO Utils.

### Keyword Clustering

I ran keyword clustering on over 8,000 keywords, and it only took 2 minutes to finish.

{% embed url="<https://drive.google.com/file/d/1NLTe2JVi8TF3pbyJUKd-c6Uflqr5umxW/view?usp=drive_link>" fullWidth="true" %}

### SERP Similarity

{% embed url="<https://drive.google.com/file/d/13EmxhG2xlwQWL_7D8D03KH60LI1PHUiy/view?usp=drive_link>" fullWidth="true" %}

### Traffic Analytics

{% embed url="<https://drive.google.com/file/d/1F-XI_Sv_JKLPiXLHMHsic3EWAFA1ixuZ/view?usp=drive_link>" fullWidth="true" %}

### Backlinks Analytics

{% embed url="<https://drive.google.com/file/d/13cLdKNs0W6BcPRd5OM9DXW4WsOy2_2rs/view?usp=drive_link>" fullWidth="true" %}

### Bulk Google PAA Scrapping

{% embed url="<https://www.youtube.com/watch?v=qa4GTnMxcE8>" %}


# Troubleshooting

Encountering issues? Our Troubleshooting Hub is here to help. Find quick fixes, step-by-step guides. Let's get you back on track!

### macOS

When installing the app on macOS, if you see this kind of message:

<figure><img src="/files/6nqH8C4VXvLpLdz23QNy" alt="" width="375"><figcaption><p>“SEO Utils” can’t be opened because Apple cannot check it for malicious software.</p></figcaption></figure>

1. Please open the **System Settings**
2. Go to the **Privacy & Security** menu
3. Hit the **Open Anyway** button

<figure><img src="/files/DEc42w6JyzCFtArsnFhj" alt="" width="563"><figcaption></figcaption></figure>

If you cannot upgrade the app, please move the SEO Utils app to the **Applications** folder

<figure><img src="/files/dQmcg9a2NUec0V8U9o1N" alt="" width="563"><figcaption><p>Move the SEO Utils app to the Applications to folder</p></figcaption></figure>

And please make sure you allow SEO Utils to access your Downloads folder.

<figure><img src="/files/9XTNPMGNnrpmlxjhucrC" alt="" width="375"><figcaption><p>Allows SEO Utils to access the Downloads folder in macOS</p></figcaption></figure>

### Windows

If you encounter a permission error or the program exits when clustering keywords on Windows, please ensure that you run SEO Utils as an administrator. This will allow the app to write the cluster data into a CSV file on your machine.

<figure><img src="/files/6zJm5qepsJIeKvvyvdYm" alt=""><figcaption><p>Permission denied</p></figcaption></figure>

You can do that by right-clicking on the SEO Utils shortcode, going to the **Compatibility** tab, and selecting "**Run this program as an administrator**." So, each time you run it, it will always run as an administrator.

<figure><img src="/files/R7mckfoxChAm2X3UGckj" alt=""><figcaption><p>Run "SEO Utils" as an administrator</p></figcaption></figure>

### Linux

If you can't open the app and see an alert like this.

<figure><img src="/files/erhe1dMop6ocKgM0M3bx" alt="" width="563"><figcaption><p>Cannot open the app in Linux</p></figcaption></figure>

Right-click on the app > **Properties** > **Permissions** > Check "**Allow executing file as program"**.

<figure><img src="/files/4Lbsn8rLbOk7Zl6jUWo4" alt="" width="563"><figcaption></figcaption></figure>

***

If you're running Ubuntu 24.04 (or similar distro) and the app doesn't launch, try running it from the terminal. If you see this error:

```
./SEO Utils: error while loading shared libraries: libwebkit2gtk-4.0.so.37: cannot open shared object file: No such file or directory
```

This happens because Ubuntu 24.04 ships with WebKitGTK 4.1 instead of 4.0. The `libwebkit2gtk-4.0-dev` package is not available in the default repositories for this distro version.

**Solution:** Create symbolic links to alias version 4.1 to version 4.0:

```bash
sudo ln -sf /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.1.so.0 /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37
sudo ln -sf /usr/lib/x86_64-linux-gnu/libjavascriptcoregtk-4.1.so.0 /usr/lib/x86_64-linux-gnu/libjavascriptcoregtk-4.0.so.18
```

Credit: [BambuStudio GitHub Issue #3973](https://github.com/bambulab/BambuStudio/issues/3973#issuecomment-2097651206)

***

If the app crashes on launch with an error like:

```
Overriding existing handler for signal 10. Set JSC_SIGNAL_FOR_GC if you want WebKit to use a different signal
...
fatal error: non-Go code set up signal handler without SA_ONSTACK flag
```

This is a signal-handling conflict between WebKit and the Go runtime, most commonly seen on Ubuntu 26.04 and other distros shipping a newer WebKitGTK.

{% hint style="success" %}
**Fixed in SEO Utils 1.48.0 and later.** The app now reconfigures these signal handlers automatically at startup. If you see this crash, update to the latest version and relaunch — no environment variables required.
{% endhint %}

<details>

<summary>Workaround for older versions (pre-1.48.0)</summary>

If you can't update right now, set an environment variable before launching the app to tell WebKit to use a non-conflicting signal:

```bash
JSC_SIGNAL_FOR_GC=SIGUSR2 ./SEO\ Utils
```

Or export it for the session:

```bash
export JSC_SIGNAL_FOR_GC=SIGUSR2
./SEO\ Utils
```

</details>


# Changelog

### v2.1.0

*Released Aug 10, 2026*

* Added the ability to [recover already-paid DataForSEO SERP results](/guide/manage-serp-data#dataforseo-serp-data-getter) directly into Organic Rank Tracker reports, restoring missing rankings to their original dates without paying to run the keywords again.
* Added a new [DataForSEO Task Monitor](/guide/dataforseo-task-monitor).
* Added a live Organic Rank Tracker run-status panel showing the run status, trigger, reference date, and progress for each keyword, including completed, failed, capped, and still-processing keywords.
* Improved Organic Rank Tracker DataForSEO runs so already-paid tasks are preserved and can continue collecting results even when the standard queue takes several hours.
* Improved protection against duplicate DataForSEO charges by limiting automatic submissions, preserving uncertain submissions instead of automatically retrying them, and requiring confirmation before an additional paid retry.
* Improved recovery from app restarts and interrupted DataForSEO runs. Pending tasks can resume automatically instead of losing already-paid results.
* Improved SERP data settings layout for smaller windows.
* Improved the Organic Rank Tracker date filter so it automatically follows newly completed snapshots while preserving manually selected or historical date ranges.
* Fixed an issue where zero-result SERPs could cause Organic Rank Tracker keywords to be repeatedly submitted.

### v2.0.4

*Released Aug 6, 2026*

* Improved the update process when reports or bulk actions are still running. SEO Utils now shows which tasks are active and lets you choose to wait for them or update immediately and re-run any interrupted tasks afterward.
* Fixed tasks that failed early sometimes remaining marked as running indefinitely.
* Fixed newly added competitor domains in Organic Rank Tracker getting stuck on “Calculating…” after their data finished syncing.
* Fixed an issue where pausing background work for an update, backup, or restore could accidentally resume another paused operation too early.

### v2.0.3

*Released Aug 5, 2026*

* Added bulk actions for the Organic Rank Tracker list. You can now delete multiple trackers at once or add the same keywords to multiple trackers in a single step.
* Fixed an issue where switching workspaces while the app was busy could occasionally cause data to be read from or saved to the wrong workspace.
* Fixed an issue where deleting an Organic Rank Tracker did not remove all of its associated data.

### v2.0.2

*Released Aug 5, 2026*

* Fixed an issue where the MCP server could stop responding about 15 minutes after startup. Tool requests now either complete successfully or return a clear timeout instead of hanging indefinitely.
* Fixed an issue where Google Search Console, Google Analytics, Google Drive, and Google Docs requests could hang indefinitely if Google stopped responding.
* Fixed an issue where app settings could be left partially saved if a disk write was interrupted.
* Fixed an issue where sending an email could hang indefinitely when an attachment was unavailable.
* Fixed an issue where requesting autocomplete keywords with an invalid limit could return the entire database instead of a single page of results.
* Fixed an issue where the app could freeze on macOS with an unresponsive “Move to Applications” prompt on first launch after downloading.
* Improved license validation so a temporary network issue no longer signs you out.

### v2.0.1

*Released Aug 4, 2026*

{% hint style="warning" %}
**macOS users: please download this version manually — one time only.** The updater in earlier versions cannot install v2 releases on macOS. Get the new version from [your downloads page](https://app.seoutils.app/downloads?key=%5Byour-license-key%5D), install it, and automatic updates will work again from then on. Windows and Linux users can update from inside the app as usual.
{% endhint %}

* Fixed macOS updates breaking the app when a release changed more than the app's core file. The updater now downloads the complete app, verifies it is genuine and correctly signed before installing, and keeps your previous version as a backup until the new one starts successfully.
* Improved update safety on all platforms. The app now refuses updates that would install an older version, and rejects downloads that fail verification.

### v2.0.0 🎉🎉🎉

*Released Aug 4, 2026*

* Added the SEO Utils v2's foundation 🔥.
* Added business-hours scheduling for the [Organic Rank Tracker](/guide/organic-rank-tracker). You can now choose the tracking time window, timezone, and days of the week for each report, just like the GMB Rank Tracker.
* Added the ability to rotate the MCP Server authentication token.
* Added bulk bot classification for the [Log File Analysis tool](/guide/log-file-analysis). Review all newly detected bots in one dialog, paste an AI-generated classification, and confirm the entire batch with a single click.
* Added the ability to manually refresh sitemap URLs with the new Fetch URLs action.
* Added a Last Fetched column to the Sitemaps page so you can quickly see when each sitemap was last updated.
* Improved the data freshness widget so the Refresh button is no longer shown immediately after data has been updated, helping prevent accidental paid re-fetches.
* Fixed the Sitemap tool so URLs are fetched immediately after adding a sitemap instead of waiting until the next day.

### v1.48.1

*Released July 24, 2026*

* Added the ability to rename saved keyword lists.
* Added a "Track disappearing reviews" option to Review Fetcher. Turn it on to fetch a business's complete review list on every run so removed reviews can be detected. It can also be set when creating a business through the MCP server.
* Added a Visibility Status column to Review Fetcher exports, showing whether each review is new, visible, missing or reinstated.
* Fixed an issue where Organic Rank Tracker could show the wrong page URL when a keyword ranked with multiple pages.
* Fixed an issue where some Google Business Profile reviews were incorrectly reported as disappeared from Google.
* Fixed Review Fetcher exports ignoring the filters and view toggle shown on screen, so the downloaded file did not match the table.
* Fixed reviews collected earlier disappearing from the Review Fetcher review list after a later, smaller fetch.
* Fixed a review that was edited or retranslated after it was first collected being reported as a brand new review, which triggered new-review alerts and automations.
* Fixed an issue where Organic Rank Tracker and GMB Rank Tracker reports could get stuck on “Running…” with an empty log and no new data.

### v1.48.0

*Released July 7, 2026*

* Added the ability for AI assistants to run NLP text and entity analysis through the MCP server.
* Added the ability for AI assistants to create and run SERP Clustering reports through the MCP server.
* Added the ability for AI assistants to create Content Struct reports and generate AI content outlines through the MCP server.
* Added workspace support for MCP tools. AI assistants can now work inside a selected workspace, and that workspace applies to every MCP tool, report list, and status check.
* Added the ability to set up and run Google Business Profile review tracking through the MCP server.
* Added the ability to identify businesses by pasting a Google Maps link when setting up review tracking.
* Added the ability to create and run LLM Rank Tracker reports through the MCP server.
* Added the ability to edit Brand Variants on an existing LLM Rank Tracker report. Historical data is recalculated automatically without re-querying AI engines.
* Fixed automations and exports only running for reports in every workspace, not just the currently opened one.
* Fixed Review Fetcher hanging forever when DataForSEO fails to return results.
* Fixed the MCP server always returning an empty list for LLM Rank Tracker reports.
* Fixed MCP report-list errors being silently ignored.
* Fixed LLM Rank Tracker running while DataForSEO sandbox mode is enabled, which could save test data into snapshot history.
* Fixed LLM Rank Tracker citation metrics undercounting brand citations when AI responses spell the brand differently from the configured variants.

### v1.47.7

*Released Jun 29, 2026*

* Added search in the workspace switcher so you can quickly find the workspace you need.
* Added alphabetical sorting in the workspace switcher to make long workspace lists easier to manage.
* Fixed the “View on Google” links in Review Fetcher reviews not opening when clicked.
* Fixed Search Console properties repeatedly syncing when using multiple workspaces. They now sync once per day as expected.
* Fixed Scheduled Organic Rank Tracker reports re-running every day when using multiple workspaces. They now follow the configured “Rerun Every X days” schedule correctly.
* Fixed the demographics layer on the Google Business map not showing data for US locations.

### v1.47.6

*Released Jun 11, 2026*

* Added support for timestamp-first access log formats in the [Log File Analysis tool](/guide/log-file-analysis).
* Improved the Sitemap Extractor tool with a new results view that shows extracted URLs directly in the app, including stats, site section breakdowns, filtering, copy, and CSV export options.
* Fixed an issue where People Also Ask and SERP scraping could freeze the app until Force Quit.
* Fixed an issue where disabling the MCP Server could show a false error when a client was still connected.
* Fixed internal error handling warnings to improve app stability.

### v1.47.5

*Released Jun 9, 2026*

* Fixed the GMB Rank Tracker map editor showing only “Failed to load Google Maps” after Google removed the Maps Drawing library.
* Restored the map drawing tools in GMB Rank Tracker, including Shift + drag to select grid points and Polygon mode for drawing custom areas.
* Improved the Google Maps error message to explain common setup issues, such as an invalid Google Places API key, Maps JavaScript API not being enabled, inactive billing, or referrer restrictions.

### v1.47.4

*Released Jun 4, 2026*

* Added the ability to filter Organic SERP Extractor results by domain.
* Improved the app update warning when bulk operations are still running. The message now shows which reports are still running instead of only showing a generic warning.
* Fixed the Submit Index action showing “Successfully submitted 0 out of N URLs for indexing” without explaining why no URLs were submitted.
* Fixed grouped table headers in reports such as the Organic Rank Tracker Overview, where domain heading rows like “Pos. example.com” did not display correctly.
* Fixed Bing index checks incorrectly reporting every page as “Not Indexed” when using the Bing Webmaster Tools API.
* Fixed sitemap extraction failing on Cloudflare-protected sites with the “invalid exec pool flag” error.
* Fixed the formatting issue in the “What’s new in v…” modal where bullet points with inline links were displayed incorrectly.

### v1.47.3

*Released May 27, 2026*

* Added a drag-and-play [timeline scrubber to the Organic Rank Tracker Competitors Discovery map](/guide/organic-rank-tracker#competitors-discovery-tab).
* Added drag-and-drop card reordering on the Google Search Console Insights tab.
* Added undo and redo for marker edits on the GMB Rank Tracker grid map.
* Added native desktop notifications support.
* \[Agent Skills]: Added the ability to remove keywords from Organic Rank Tracker reports via Claude Desktop or any MCP client.
* Redesigned the Settings → Services page with left navigation and instant search.
* Improved DataForSEO error messages and retry behavior across tools that use the DataForSEO API.
* Fixed SEO Utils hanging on startup on Windows, causing very high CPU usage and sometimes filling the C: drive with temporary files.
* Fixed Organic Rank Tracker reports with pixel tracking enabled running a full SERP rescan every day instead of following the report schedule.
* Fixed two crashes when sorting tables in the LLM Rank Tracker.
* Fixed the first-time setup error in Embedding Settings when loading the embedding model list.
* Fixed shrunken icons and clipped category labels in the global command palette when item titles are very long.
* Fixed IndexNow failing when Bing Webmaster Tools has not crawled a URL yet.

### v1.47.2

*Released May 15, 2026*

* Added the ability to [create and update Organic Rank Tracker reports](/guide/mcp-server#create-and-update-organic-rank-trackers) from Claude Desktop or any MCP client.
* Added the ability to [create, update, and run GMB Rank Tracker reports](/guide/mcp-server#create-and-update-gmb-rank-trackers) from Claude Desktop or any MCP client.
* Added the ability to [create and update SEO Tests](/guide/mcp-server#seo-tests) from Claude Desktop or any MCP client.
* Added the ability to [create and rename workspaces](/guide/mcp-server#workspaces) from Claude Desktop or any MCP client.
* Added a test connection button on the MCP Server settings page.
* \[Agent Skills]: Added GMB Rank Tracker grid visualization support with Leaflet maps for MCP clients.
* Fixed the UULE Geo Target encoding issue when using certain location names in in-app SERP scraping.
* Fixed GMB Rank Tracker grid queries in Claude Desktop showing the “no such column: disabled” error.
* Fixed “Last updated” timestamps not refreshing after saving edits.
* Fixed exported PDF and HTML reports missing maps or lazy-loaded content.
* Fixed automated GMB Rank Tracker exports failing on the first attempt or generating incomplete reports.
* Fixed the app crash or launch failure when the network is slow during startup or on some Linux systems.

### v1.47.1

*Released May 12, 2026*

* Added the ability to [track pixels from the top in Organic Rank Tracker](/guide/organic-rank-tracker#pixels-from-top-display) to measure real on-screen visibility, not just ranking position.
* Added a copy service account email button on the GA4 add property page.
* Improved the N.A.P Finder run form to open as a full page instead of a cramped modal.
* Improved the Organic Rank Tracker create and edit forms to open as full pages instead of cramped modals.
* Fixed the Indexing Pages “Select all” and CSV export actions ignoring active filters.
* Fixed the average position change in SEO Test time-based performance overview showing as an improvement when the position got worse.
* Fixed the confusing database error when adding a GA4 property that already exists in another workspace.
* Fixed the issue where Google AI Mode could not be deselected in LLM Rank Tracker when a non-English language is selected.
* Fixed Linux WebKit signal override issue.
* Fixed links in the “What’s new” release notes popup not opening.
* Fixed the updater restart and progress state.

### v1.47.0

*Released May 5, 2026*

* Added [People Also Ask source tracking](/guide/organic-rank-tracker#paa-source-tracking) for the Organic Rank Tracker.
* Added a new card view for GMB Rank Tracker reports and report groups.
* Added workspace support for Google Analytics (GA4) properties.
* Added [Recent Searches and Local Cache](/guide/recent-searches-and-cache) for DataForSEO tools.
* Added a macOS prompt on first launch to move SEO Utils to the Applications folder.
* Added a Geo Target field in SERP Similarity when adding a keyword.
* Added bulk export for NLP Text Analysis reports, allowing users to download all items as a ZIP file with per-article Excel files.
* Added an onboarding page with a guided setup checklist.
* Added a “What’s new” release notes popup on the Dashboard with Agent Skills updates.
* Added [Organic Rank Tracker write tools](/guide/mcp-server#organic-rank-tracker) for MCP.
* Added [Log Analyzer AI ](/guide/mcp-server#ai-log-analysis-aeo-geo)upgrade support for MCP.
* Added a custom Chrome executable path setting.
* Improved [Log File Analysis with AI View](/guide/log-file-analysis), robots.txt compliance, better bot buckets, source management, auto-import, and AEO dashboard data.
* Improved Log File Analysis by filtering static-asset noise and clarifying empty states.
* Improved Log File Analysis with persistent import logs, better error-log detection, CSV exports, and more reliable import recovery.
* Improved Log File Analysis parser support for Combined-format logs.
* Fixed LLM Rank Tracker scheduled runs repeating across workspaces.
* Fixed sitemap imports failing when URLs have empty, zero, or RFC1123 date values.
* Fixed IndexNow failing with an “invalid date format” error for users in positive UTC timezones.
* Fixed empty space below the MCP Server section when opening Settings via deep link.
* Fixed “-752 minutes ago” showing in Bot Activity Details.
* Fixed saving tags failing with a “database is locked” error under heavy activity.
* \[Agent Skills]: Updated the MCP guide so LLM pick the right tool and table when answering questions about the new [Log Analyzer AI features](/guide/mcp-server#ai-log-analysis-aeo-geo) — bot categories, log sources, AI request stats, robots.txt compliance, and AI traffic trends.

### v1.46.1

*Released Apr 17, 2026*

* Added the ability to select a Log Analyzer report for each property in the Indexing dashboard, with automatic matching as a fallback.
* Improved the initial scan experience in the Indexing dashboard with clearer live progress updates.
* Improved the link crawler to handle slow-loading websites more reliably.
* Changed the URLs button on the Sitemaps page to open the new Indexing dashboard.
* Fixed the sitemap errors banner showing an outdated 200 status.
* Fixed the repeated toast notification issue on the Sitemaps page.

### v1.46.0

*Released Apr 17, 2026*

* Added [GMB Report Groups](/guide/google-my-business-rank-tracker/report-groups) for multi-location businesses.
* Added the new [GSC Indexing Dashboard](/guide/google-search-console/indexing-dashboard).
* Added [MCP indexing support](/guide/mcp-server#url-indexing).
* Added MCP GMB Report Groups support.
* Added a collapsible filter panel mode for tables.
* Fixed tab switching flicker across all Tabs components.
* Fixed an issue where Insights Content and Topic Clusters cards only showed up to 6 rows.
* Fixed a silent validation error in polygon mode in the GMB Rank Tracker form.

### v1.45.0

*Released Mar 30, 2026*

* Added [Keyword Insights](/guide/organic-rank-tracker#insights-tab) with GA4 Key Events integration.
* Added [Google Analytics 4 integration](/guide/google-analytics-4)
* Added the [MCP Keyword Insights tools](/guide/mcp-server#keyword-insights) to get insight counts (trending up/down, pogo sticking, flickering, key events) for a organic rank tracker report.
* Added the MCP send email tool for sending emails via SMTP.
* Added the ability to import historical rank tracking data from SERanking.
* Added a [Manage Devices button](/guide/manage-license-key) on the license page with your license key and email prefilled.
* Improved Google Search Console property list loading speed.
* Fixed PDF export in Automations failing on Windows because of broken file paths.
* Fixed the Sitemap Extractor working on sites with bot protection such as Cloudflare.
* Fixed Windows detection for the Claude Desktop MSIX config path during Auto Install.
* Fixed the Keyword Fluctuation table columns not sorting correctly.
* Fixed Bing Keyword Explorer crashing with non-US locations.
* Fixed US/Canada demographics overlap for border locations.

### v1.44.1

*Released Mar 23, 2026*

* Fixed Windows Claude Desktop Install button.

### v1.44.0

*Released Mar 23, 2026*

* Added [MCP Server](/guide/mcp-server) with automation support and integrations across SEO tools.
* Added demographics support for Google Business Rank Tracker in [Canada, Australia, and the UK](/guide/google-my-business-rank-tracker#demographics-layer-census-data).
* Fixed DataForSEO task collectors randomly stopping.

### v1.43.3

*Released Mar 16, 2026*

* Added [custom polygon grid shape](/guide/google-my-business-rank-tracker#custom-polygon-grid) for the GMB Rank Tracker with support for random and grid-based pin distribution.
* Added automation support for Content Struct outline generation with Markdown and ZimmWriter export.
* Added [automatic detection and disabling of grid markers placed in uninhabited areas](/guide/google-my-business-rank-tracker#auto-disable-uninhabited-markers) in the GMB Rank Tracker.
* Fixed the issue where tabs on the Automation detail page did not switch properly between Execution History and Actions.

### v1.43.2

*Released Feb 20, 2026*

* Fixed an issue where content clusters could be created even when no matching pages were found.
* Fixed scheduled background tasks not running for reports in non-active workspaces.

### v1.43.1

*Released Feb 18, 2026*

* Added the [SERP Extractor tool](/guide/serp-extractor) for extracting and analyzing search engine results.
* Added SERP Item metric filters to help you find keyword opportunities inside SERP Extractor.
* Improved the error message when the S3 bucket region is incorrect.
* Fixed an issue where interactive map HTML exports did not respect marker size, color variants, and glow effect settings.
* Fixed unranked grid points showing as green instead of gray in HTML exports.
* Fixed an issue where filter inputs lost focus after the data table refreshed.

### v1.43.0

*Released Feb 13, 2026*

* Added [S3-compatible storage](/guide/data-sharing-with-s3) for caching DataForSEO API responses (supports Amazon S3, Cloudflare R2, DigitalOcean Spaces, MinIO).
* Added [Interactive Maps option when exporting HTML reports](/guide/google-my-business-rank-tracker#interactive-maps-in-html-exports) in the GMB Rank Tracker.
* Added Copy to Clipboard bulk action for Saved Keywords lists.
* Added CSV export for Keyword Fluctuation view in Rank Tracker.
* Improved page loading speed in SEO Test creation with Load More pagination.
* Improved helpful tip when searching for homepage in SEO Test page filters.
* Fixed unclear error message when Google Maps API key is invalid in Rank Tracker.
* Fixed Control Period and Test Period cards showing no data in time-based SEO Tests.
* Fixed issue where Search Console property could not be added when using Google OAuth tokens.
* Fixed Annotation date picker not allowing selection of past dates.
* Fixed clickable links not opening when URL contains special characters.

### v1.42.0

*Released Feb 2, 2026*

* Added a new [Keyword Fluctuation tab](/guide/organic-rank-tracker#keyword-fluctuation-tab) in the Organic Rank Tracker to track ranking changes over time.

  You can see start vs current position, 1-day, 7-day, 30-day, and lifetime changes, with quick rank filters like Top 3, Top 10, and Top 20. Local Pack rankings are highlighted with a map pin.
* Added [Saved Keywords](/guide/saved-keywords) feature to organize keywords into lists.

  Save keywords from Keyword Explorer, Google PAA, Autocomplete, Organic Keywords, and Ads Vision into named lists by location and language. You can add tags, import metrics from CSV/Excel, export to CSV, and bulk check keyword metrics.
* Added [annotations support for Google Search Console](/guide/google-search-console/annotations) performance charts.
* Added automatic keyword metrics caching when browsing Organic Keywords or Keyword Suggestions.

  This helps reduce repeated API calls and lowers DataForSEO costs.
* Improved error reporting by filtering out user-side issues.
* Improved AI token usage for the LLM Rank Tracker and other AI-powered features, helping reduce token consumption and costs.
* Improved the property selector when adding Google Search Console properties by adding search support.
* Fixed browser autosuggestion showing up in dropdown search fields.
* Fixed the issue where the annotations list did not refresh after deleting an annotation.

### v1.41.3

*Released Jan 14, 2026*

* Added a sticky table header to the SERP Clustering report so column headers stay visible while scrolling.
* Added phone numbers and caller names to the Money Map tooltips.
* Added the ability to add keywords to the Rank Tracker directly from the Organic Keywords and Keyword Suggestions tables, removing the need to copy and paste.
* Fixed the Sitemap Extractor so it works correctly with sites that have bot protection enabled.
* Fixed an SQLite error when saving large numbers of reviews by batching inserts to avoid the “too many SQL variables” limit.
* Improved database stability by adding retry logic when saving ChatGPT cache during temporary database locks.

### v1.41.2

*Released Jan 10, 2026*

* Added bulk action to fetch reviews for multiple Google Business profiles at once.
* Added rating and total review count columns to the Google Business Reviews list page.
* Added review visibility tracking for Google Business Reviews, allowing you to see when reviews are new, visible, missing, or reinstated.
* Added bulk delete keywords by entering or pasting a list of keyword names.
* Added daily schedule option for GMB Rank Tracker reports.
* Added the ability to export multiple rank tracker reports as a single combined PDF from the dashboard.
* Added manual business coordinate adjustment by dragging the marker directly on the map.
* Improved the delete keyword confirmation to clearly warn about permanent loss of historical ranking data.
* Improved the Organic Rank Tracker dashboard to show the report name instead of the target domain when available.
* Fixed empty stars in rating displays now showing as filled gray instead of outline only.
* Fixed tab labels overflowing in the GMB Rank Tracker form.
* Fixed PDF export crashing when generating reports.

### v1.41.1

*Released Dec 31, 2025*

* Fixed SERP UULE search not working with multi-word keywords.

### v1.41.0

*Released Dec 30, 2025*

* Added census data overlay layers to the GMB Rank Tracker map, including population density, median household income, homeowner percentage, and median age.
* Added Ring Tonic API integration to display visits and calls data on the Money Map inside the GMB Rank Tracker.
* Optimized the GMB Rank Tracker database by only storing the top 20 results.
* Improved settings links so they scroll directly to the relevant section.
* Fixed the issue where auto indexing settings were not saved when reopening the settings modal.
* Fixed the GMB Rank Tracker schedule day selection for monthly and twice-per-month frequencies.

### v1.40.2

*Released Dec 18, 2025*

* Made Ads Vision consistently return ads on the SERP.
* Added ad placement detection and grouped display in the Ads Vision tool, allowing ads to be organized by Top, Bottom, Sidebar, and Middle positions.
* Added a contextual empty state message in the SERP data slide-over, based on what actions are available to the user.
* Improved the UI for the Organic Rank Tracker domain column.
* Fixed an issue where SERP HTML filenames could conflict by ensuring unique filenames using timestamps.
* Fixed a crash on Linux caused by a WebKitGTK signal conflict.

### v1.40.1

*Released Dec 16, 2025*

* Added support for more LLM models, including Claude Opus 4.5, Sonnet 4.5, Haiku 4.5, GPT-5.1, and GPT-5.2.
* Added a report name field for the Organic Rank Tracker so reports are easier to recognize.
* Added a business name filter for the Organic Rank Tracker tool.
* Added a location column to the Google Business Reviews list page.
* Added a scheduling logger for the GMB Rank Tracker.
* Added the Google Local Finder API endpoint.
* Switched the extraction process to use gpt-5-mini for better performance and lower cost.
* Fixed an issue where the LLM Rank Tracker showed outdated Google AI data from the wrong date.
* Fixed an issue where the position domain column visibility could not be toggled in the Organic Rank Tracker.
* Fixed a “too many variables” issue when loading content clusters in the GSC integration.

### v1.40.0

*Released Dec 4, 2025*

* Added Ads Vision tool.
* Added the “New” badge for keywords that appear in the current period but not in the comparison period in the GSC Integration.
* Added SERP features for the Organic Keywords tool.
* Added the ability for CSV exports in the Organic Rank Tracker to include the position type (Organic or Local Pack) and all detected SERP features.
* Added workspace support for the Google Business Reviews Fetcher tool.
* Added the ability to backup SERP HTML files and prune old SERP HTML files.
* Added the ability to force fresh SERP data within the same date/snapshot.
* Added Manage Snapshots for the Organic Rank Tracker tool.
* Added the Analyze SERP button for the Organic Rank Tracker tool.
* Added the Google Business Reviews Fetcher instruction link.
* Fixed the ranking display issue when tracking Local Pack in the Organic Rank Tracker tool.
* Fixed a style issue on the Workspace Switcher.
* Fixed the Average Position chart tooltip not appearing in the Organic Rank Tracker tool.

### v1.39.0

*Released Nov 25, 2025*

* Added [Google Business Reviews Fetcher tool](/guide/google-business-reviews-fetcher).
* Added review count over time chart in the GMB Rank Tracker tool.
* Added total/disabled/enabled keyword columns to the GMB Rank Tracker Reports.
* Added support for shortened Google Maps URLs in the GMB Tank Tracker tool.
* Added "Check on Google" button for Organic Rank Tracker tool.
* Added the copy button for Response Body and colored status codes for Webhook actions in the Automations tool.
* Improved Search Console property validation to check across all workspaces and show the workspace name when duplicate domains exist.
* Fixed an issue that prevented using the SERP Comparison tool.
* Fixed an issue when fetching Google Maps URL in the GMB Rank Tracker tool.

### v1.38.7

*Released Nov 10, 2025*

* Added the ability to run Organic Rank Tracker on selected keywords ([partial scan](/guide/organic-rank-tracker#run-partial-scan))
* Added Depth columns to the Organic Rank Tracker reports page.
* Fixed the Search Volume Trend chart to display data from oldest to newest.

### v1.38.6

*Released Nov 5, 2025*

* Added the ability to bulk update schedules for both Organic Rank Tracker and GMB Rank Tracker tools.
* Made the Google Drive service account portable in app configuration backups.
* Fixed the wrong folder ID issue when exporting Content Struct reports to Google Drive.
* Fixed the error when calculating total earned CTR.
* Fixed the arrow up/down keys not working in the Automation tool.

### v1.38.5

*Released Oct 27, 2025*

* Fixed an issue when deleting DataForSEO Post Tasks.
* Improved stability by skipping “file not found” errors when collecting DataForSEO Post Tasks.

### v1.38.4

*Released Oct 25, 2025*

* Added the ability to add Google Search Console queries to the Organic Rank Tracker.
* Added a disk full alert on the dashboard to warn users before running out of storage.
* Improved keyword metric checking — now it only re-checks keywords that haven’t been checked in the last 30 days and allows you to only check metrics for queries that have at least x impressions.
* Disabled spellcheck, autocorrect, and autocapitalize for the Command Palette on macOS.
* Updated the new app icon.

### v1.38.3

*Released Oct 15, 2025*

* Added the ability to run your GMB Rank Tracker twice per month.
* Added the ability to disable auto-sync for specific GSC properties.
* Added tags for Google Business Rank Tracker keywords.
* Added title and domain details in the SERP Analysis report.
* Added “Check for Updates” menu option for macOS.
* Added the ability to re-check branded keywords after auto-pull in Google Search Console integration.
* Improved data loading in Google Search Console integration.
* Improved initial sync speed for Google Search Console integration, now up to 10× faster.
* Updated DataForSEO SERP API estimation price in the Organic Rank Tracker tool.
* Fixed the issue where newly added site domains were not updated in IndexNow.
* Fixed crash on embedding database settings when no GSC data is available.
* Fixed chart display issue on Google Search Console site with big data.
* Fixed title bar display issue on macOS Tahoe v26.0.
* Fixed “tail command not found” error on Windows.
* Disabled spellcheck, autocorrect, and autocapitalize for input fields on macOS.

### v1.38.2

*Released Sep 22, 2025*

* Added support for Workspaces in the SEO Tests tool.
* Added Ranking Coverage and Visibility Score metrics to the Performance chart in Organic Rank Tracker.
* Fixed the issue where the SERP Clustering tool returned a *“too many SQL variables”* error in some cases.
* Fixed the tooltip not appearing on Organic Rank Tracker charts.
* Show a “—” symbol when there’s no data available on the Organic Rank Tracker Dashboard chart.

### v1.38.1

*Released Sep 17, 2025*

* Added a progress indicator for the clustering step in the SERP Clustering tool, so you can track progress when running large batches.
* Updated Automation variables and improved email formatting.
* Fixed an issue where long descriptions in the Rank Tracker tool did not display well on small screens.

### v1.38.0

*Released Sep 17, 2025*

* Added Automations allows you to send an email, export a PDF, and call a webhook URL when the [Organic Rank Tracker ](/guide/organic-rank-tracker)or [GMB Rank Tracker](/guide/google-my-business-rank-tracker) snapshot is finished tracking.
* Added ChatGPT Scrapper.
* Added **ChatGPT** as an AI engine in LLM Rank Tracker.
* Added **ChatGPT – Web Search** as an AI engine in LLM Rank Tracker.
* Added the ability to merge competitor brands in LLM Rank Tracker.
* Made total URLs clickable in SERP Clustering to view all ranked URLs.
* Added the Depth field across multiple tools.
* Made clusters collapsible in SERP Clustering for easier navigation.
* Improved dark mode display in SERP Clustering tool.
* Show all AI engines in tooltips on the LLM Rank Tracker page.
* Auto-refresh enabled for DataForSEO Post Tasks card.
* Made Excluded Domains optional.
* Fixed Next Run date issue in Organic Rank Tracker.
* Fixed styling issues in the SERP Clustering keywords sheet.
* Fixed issue when cleaning up DataForSEO tasks.

<mark style="color:red;">**Critical Update and Required Action:**</mark>

**Google dropped the num parameter** recently, and it hit almost every SERP API and rank tracker out there, even the big guys like DataForSEO, SEMrush, and Ahrefs. In **SEO Utils v1.38.0**, I've rolled out updates to adapt to DataForSEO’s new SERP API changes.

**What’s changing on DataForSEO SERP API after September 19, 2025 (10:00 UTC)**

* **Base coverage now = Top 10 results (first page)**
* **Additional pages = 25% off** the base price
* Base price **stays the same**, but only for page 1 (10 results):
* $0.002 → Live
* $0.0006 → Normal queue
* $0.0012 → High queue

Extra pages cost less (25% off):

* $0.0015 → Live
* $0.00045 → Normal
* $0.0009 → High

👉 Example: Instead of paying **$0.60** for scraping 100 results × 1,000 keywords, you’ll now pay **$4.65**.

🧰 **Tools affected in SEO Utils**:

1. Organic Rank Tracker
2. SERP Clustering
3. NAP Finder
4. Content Struct
5. Keyword Explorer
6. SERP Similarity

{% hint style="info" %}
Read **update details and my suggestions on the Depth parameter** at <https://www.facebook.com/groups/seoutils/posts/1190999032863701/>
{% endhint %}

### v1.37.3

*Released Sep 9, 2025*

* Added an alert in the LLM Rank Tracker tool when AI extraction is not configured.
* Fixed an issue where the vector database migration was not found on Windows.

### v1.37.2

*Released Sep 9, 2025*

* Fixed vector database is not loaded in macOS.

### v1.37.1

*Released Sep 8, 2025*

* Fixed vector database is not loaded in macOS.

### v1.37.0

*Released Sep 8, 2025*

* Added [SEO Tests](/guide/google-search-console/seo-tests).
* Added tags to the Organic Rank Tracker exported file.
* Fixed vector database initialization issue.
* Fixed the embedding database guide link.
* Fixed an issue where HTML exports didn’t include all Organic Rank Tracker keywords.
* Fixed styles in the exported PDF file for GSC Insights.

### v1.36.0

*Released Sep 1, 2025*

* Added [Embedding Database](/guide/embedding-database).
* Added [Topic Clusters](/guide/google-search-console/topic-clusters) for the GSC integration.
* Added the ability to check keyword metrics for GSC queries (including volume, CPC, KD, intents, and trends).
* Added the ability to analyze SERP for GSC queries.
* Added export option for LLM Rank Tracker reports.
* Added native dark mode support for Google Maps.
* Added glow effect for markers in the GMB Rank Tracker tool.
* Added download button for Queries Overtime charts and Traffic Sources cards.
* Improved delete flow for GSC properties.
* Fixed display issues when exporting GMB Rank Tracker reports in dark mode.
* Fixed dark mode issue in the Competition Map chart.
* Fixed display error in GSC performance chart tooltips.
* Showed a more friendly error message when no results are found, plus added debug handling for over-token-limit errors.

### v1.35.2

*Released Aug 18, 2025*

* Improved the recent page titles in the Command Palette to make them more user-friendly.
* Fixed an issue in the LLM Rank Tracker where results could exceed the context limit.
* Removed unnecessary error alerts in the GMB Rank Tracker when no results are found.

### v1.35.1

*Released Aug 16, 2025*

* Added a command palette (Cmd/Ctrl + K) for quick tool access.
* Added a search bar in the sidebar for easier navigation.
* Added table view for Google Search Console integration.
* Added query word count filter for GSC integration.
* Made the Update Modal content scrollable.
* Fixed the issue where GMB Rank Tracker reports could disappear after updating.
* Fixed several display issues and made various styling improvements.

### v1.35.0

*Released Aug 14, 2025*

* Added [Workspace](/guide/workspace).
* Improved GMB Rank Tracker cloud sync.
* Fixed an issue where a specific grid point in the GMB Rank Tracker didn’t load the correct data.
* Fixed display issue on the Google Search Console average position metric.
* Fixed table appearance in dark mode.

### v1.34.6

*Released Aug 12, 2025*

* Fixed reactive issues on the GMB Rank Tracker keywords page.
* Fixed minor display glitches in the GMB Rank Tracker tool.

### v1.34.5

*Released Aug 12, 2025*

* Fixed an issue in the GMB Rank Tracker where snapshots and competitor lists might not appear in some cases.

### v1.34.4

*Released Aug 11, 2025*

* Added Content Cluster feature for Google Search Console integration.
* Added a copy button for keywords in the Bulk Autocomplete tool.
* Enhanced the display for GSC Insights and Preview pages.

### v1.34.3

*Released Aug 8, 2025*

* Added a SoLV column to the competitors list in the GMB Rank Tracker tool.
* Added an empty state message for the Overview tab when the selected keyword has no data for the current snapshot.
* Hide no ranking keywords from the GMB Rank Tracker preview report.
* Improved the display style of the GMB Rank Tracker preview report.
* Improved the website favicon fetching process.
* Prevented cloud syncing when the snapshot is empty.
* Fixed broken documentation links.
* Fixed an issue where the Organic Rank Tracker export did not include competitors’ data.
* Fixed the cost estimation button triggering form submission unexpectedly.

### v1.34.2

*Released Aug 7, 2025*

* Added GPT-5 models for all AI tools.
* Increased waiting time for DataForSEO post tasks.

### v1.34.1

*Released Aug 6, 2025*

* Added an AI Filter to the Google Search Console integration to let you filter data using natural language queries.
* Automatically switches to the *Queries* tab when clicking on the branded column.
* Prevents multiple initial syncs from running at the same time in the GSC integration.
* Fixed "database is locked" in the GSC integration.

### v1.34.0

*Released Aug 5, 2025*

* Added Google Search Console integration v2.
* Supported [Google OAuth flow](/guide/google-oauth-token): You can now connect using a Google OAuth Token or a Service Account to pull your site’s GSC data.
* Added thinking mode for Ollama provider.
* Added a Refresh Location button in the Services page to fetch updated location data from DataForSEO.

{% hint style="info" %}
Make sure to export data from GSC v1 before updating. After updating, double-check the site access of each Google Service Account used for submitting index requests in the Google Services Account page.

<img src="/files/nH7wX8lzOfAhfLDoDIdq" alt="" data-size="original">
{% endhint %}

### v1.33.7

*Released Aug 4, 2025*

* Improved the GMB Rank Tracker to automatically resync if a report is missing.
* Cleaned up unused fields in GMB Rank Tracker cloud sync.
* Fixed the tag filter not working on the GMB Rank Tracker compare page.
* Fixed an issue where tag filters didn’t load properly on the first visit.
* Fixed the sorting issue on the Traffic Competitors page.
* Hid the measuring tool on the GMB Rank Tracker compare page.

### v1.33.6

*Released Aug 3, 2025*

* Added support for showing existing tags when using the bulk update tags action in the LLM Rank Tracker and Organic Rank Tracker tools.
* Added an empty state message for the competitors list tab in the GMB Rank Tracker tool.
* Added the Latest Rank column to the keywords management page in the GMB Rank Tracker tool.
* Prevented multiple instances of the app from running at the same time.
* Optimized table loading performance.
* Improved performance when saving metadata.

### v1.33.5

*Released Aug 3, 2025*

* Added an example template link for the map keyword data feature.
* Improved bulk update tags action to display existing tags.
* Fixed the issue where the GMB Rank Tracker Keywords page didn’t show total count and pagination.
* Fixed the bug where the keywords slide-over panel in GMB Rank Tracker couldn’t be opened.
* Fixed the “No Search Results” error.
* Fixed the “database is locked” error.

### v1.33.4

*Released July 30, 2025*

* Added a tags filter to the keyword list slide-over in the GMB Rank Tracker’s map view.
* Added the ability to [map external keyword metrics](/guide/organic-rank-tracker#map-external-keyword-data) (search volume, CPC, KD, search intents) and tags for Organic Rank Tracker keywords.
* Added “Previous Position” and “Position Difference” columns to the CSV export of Organic Rank Tracker reports.
* Added a Page filter to the Top Pages by Traffic view.
* Tags filter is now preserved when navigating reports in both the Organic Rank Tracker and GMB Rank Tracker.
* Improved the disk full check.
* Fixed an issue in the Keyword Explorer tool that could cause the app to crash.
* Minor style improvements.

### v1.33.3

*Released July 26, 2025*

* The Organic Rank Tracker dashboard chart now displays disconnected line segments between tracking periods to avoid showing misleading ranking drops.
* Added internal logger for ready tasks to improve tracking and debugging.
* Fixed some minor issues in the DataForSEO Post/Ready/Get task system.

### v1.33.2

*Released July 25, 2025*

* Added autocomplete keyword suggestions for the Keyword Explorer tool.
* Added support for using OpenRouter as the extraction model in the LLM Rank Tracker tool.
* Added the ability to tag keywords in the GMB Rank Tracker.
* Added stuck task detectors and a collector status to help identify and resolve processing issues.
* Improved timezone handling across tools for more accurate data display.
* Improved GSC integration by skipping unverified sites when fetching data.
* Improved handling of disk full situations by showing an alert in the DFS Post Tasks page.

### v1.33.1

*Released July 23, 2025*

* Added the DFS Post Task list page.
* Added the ability to check internet connection status.
* Added support for pasting multiple values into the Brand Variants field.
* Added pagination and improved the UI for the Organic Rank Tracker dashboard.
* Fixed the issue where the backup database process gets stuck.
* Fixed timezone comparison issues by ensuring UTC consistency with the database.
* Improved error handling by ignoring certain OpenAI errors.
* Removed the old Post Task model.

### v1.33.0

*Released July 22nd, 2025*

* Added [LLM Rank Tracker](/guide/llm-rank-tracker).
* Added Bing as a supported search engine in the Keyword Explorer tool.
* Added a log file feature to help track internal activity and debugging info.
* Improved the Task Post/Ready/Get system to reduce stuck tasks when using the DataForSEO queue.
* Removed the unnecessary srsltid parameter from URLs in the Organic Rank Tracker tool.
* Fixed the issue where the Entities and Topics tab couldn’t be opened in the Text Analysis tool.
* Fixed the bulk update tags form not allowing users to add new tags.
* Fixed a bug where the migration screen ran multiple times during app startup.
* Fixed the issue where Anthropic model responses were cut off and returned incomplete data.
* Fixed the timezone mismatch on the Organic Rank Tracker Pages tab and the IndexNow feature.

### v1.32.3

*Released June 23rd, 2025*

* Added the ability to prevent time from crossing midnight when syncing SERP data.
* Set the GMB Rank Tracker export preview sheet to be scrollable.
* Fixed organic rank tracker dashboard doesn't set a fallback date when having only one snapshot.
* Fixed the timezone issue on the scheduled GMB Rank Tracker report.
* Fixed the "Desktop" text on the Organic Rank Tracker Dashboard page.

### v1.32.2

*Released June 20th, 2025*

* Fixed the DataForSEO priority issue.

### v1.32.1

*Released June 20th, 2025*

* Fixed the issue when the organic rank tracker could not find the correct position for the keyword from SERP data.

### v1.32.0

*Released June 19th, 2025*

* Added [SERP Features](/guide/organic-rank-tracker#serp-features-tracking) for the Organic Rank Tracker tool.
* Added [Local Pack position tracking](/guide/organic-rank-tracker#basic-fields).
* Added the ability to resync the organic rank tracker report when the Include Subdomains field is updated.
* Added the ability to customize the number of exported keywords in the PDF organic rank tracker report.
* Added the ability to include/exclude search volume from the PDF of the organic rank tracker report.
* Added another format for Export Grid Points With Businesses action.
* Added the ability to remember selected date range across tabs in the Organic Rank Tracker tool.
* Fixed timezone issues.
* Fixed the issue when unable to toggle the Include Subdomains field.
* Fixed the issue when the sync GMB Cloud is still running without an API key.
* Fixed issue where default data was not populating on the Bulk Autocomplete modal re-open.
* Fixed some style issues on the organic rank tracker dashboard.
* Fixed text and docs link.
* Removed reports that don't have data from the organic rank tracker dashboard chart.

### v1.31.2

*Released June 12th, 2025*

* Added Bot Distribution chart for the Log File Analysis tool.
* Added the ability to export competitors for the Top Performing Business for the Keyword table.
* Added the ability to export all businesses found at each grid point location for detailed\
  geographic competitor analysis.
* Added reasoning models across all AI tools.
* Updated app icon for Windows.
* Fixed the auto theme mode issue in macOS.

### v1.31.1

*Released June 10th, 2025*

* Added the ability to delete the cloud report.
* [Log File Analysis](/guide/log-file-analysis) tool is free to access without a license key.

### v1.31.0

*Released June 9th, 2025*

* Added [Log File Analysis](/guide/log-file-analysis) tool.
* Fixed average position column sorting in competitors discovery.

### v1.30.0

*Released May 30th, 2025*

* Added SERP API: [Larseo](https://api.larseo.app/)
* Added [Organic Rank Tracker Dashboard](/guide/dashboard/organic-rank-tracker) — get a quick overview of all your reports in one place.
* Added [measuring tool](/guide/google-my-business-rank-tracker#use-measuring-tool) for GMB Rank Tracker.
* Added [Strict Algorithm](/guide/serp-clustering#clustering-algorithm) for SERP Clustering tool.
* Added [annotation feature](/guide/google-my-business-rank-tracker#annotations) for GMB Rank Tracker.
* Rebuilt the GMB Rank Tracker snapshot timeline UI.
* Added report type filter for annotation list.
* Fixed the issue that prevented pulling new Google Updates.

### v1.29.2

*Released May 7, 2025*

* Added the ability to copy competitor coordinates in Google Business Rank Tracker.
* Enhanced web scraping functionality with retry logic to improve reliability.
* Refactored heading extraction logic in Content Struct to exclude style and script tags during text processing.
* Fixed the issue where the user dropdown could not be opened when the sidebar was not pinned.
* Fixed an issue accessing metadata properties in Content Struct to prevent potential errors.

### v1.29.1

*Released April 28, 2025*

* Added the ability to delete cloud snapshot.
* Added the ability to delete cloud GMB Rank Tracker report.
* Added the ability to update the business coordinates in the GMB Rank Tracker tool.
* Added a message when the cloud database is not setup when sharing the report.
* Added the ability to allow users to import a mismatched version backup file.
* Fixed optional chaining for Geo Target value in Content Struct form.
* Fixed the check index using Google Webmaster Tool doesn’t work properly in some cases.

### v1.29.0

*Released April 24, 2025*

* Dropped support for Linux 20.04.
* Added [shareable link for GMB Rank Tracker tool](/guide/white-labeled-client-report).
* Added global settings for the Content Struct tool.
* Fixed the format issue in the "copy headings as the Zimmwriter" button.

### v1.28.3

*Released April 7, 2025*

* Fixed the issue on Bulk Google PAA tool when it doesn't return content when using UULE.
* Fixed the Content Struct's exclude domain field doesn't work with the www version.
* Fixed the issue when the target is not removed spaces before sending to DataForSEO.
* Fixed the worker validation errors on the cloning organic rank tracker report.

### v1.28.2

*Released Mar 31, 2025*

* Used the new endpoint for the Check Keyword Metrics tool.
* Added the ability to include clickstream data for the Check Keyword Metrics tool.
* Added search intents for keyword metrics data.
* Added the ability to sort by the indexed column in GSC sites.
* Added the ability to asynchronously load historical traffic data in the Traffic Analytics tool.
* Removed impressions info data because it's not maintained by DataForSEO anymore.
* Fixed the issue when cannot press backspace or delete on the form in GMB Rank Tracker.
* Fixed the traffic format number.
* Fixed the search intents filter when it doesn't show the selected value when re-opening the Sheet.

### v1.28.1

*Released Mar 28, 2025*

* Added excluded domains setting for Content Struct tool.
* Fixed the performance issues when scraping URLs in the Content Struct tool.
* Fixed the excluded domain field doesn't add new value in the N.A.P Finder tool.

### v1.28.0

*Released Mar 27, 2025*

* Added [Content Struct](/guide/content-struct) tool.
* Added NLP Text Analysis instruction link.
* Added a schedule filter for the GMB Rank Tracker reports list page.
* Added the ability to paste multiple URLs in NLP Text Analysis.
* Added 2 more multiple languages for Semantic Clustering tool.
* Enhanced the multiple marker movement feature in the GMB Rank Tracker tool allows you to see all selected markers move in real-time while dragging.
* Updated new assets for GMB Rank Tracker Bird View.
* Added rate limiting for Text Razor driver.
* Added an alert to show NLP text analysis error message in the report detail page when an API request fails.
* Fixed an issue in the GMB Rank Tracker tool where drawing mode could get stuck if the mouse was released before the Shift key when selecting multiple markers.
* Fixed the issue of not being able to find the seed keyword in the Google PAA tool.
* Fixed cannot edit the organic rank tracker report.

### v1.27.2

*Released Mar 14, 2025*

* Added the report name to the filename when saving the NLP Text Analysis report.
* Fixed the tag issue when exporting organic rank tracker report.
* Fixed language mapping in TextRazor API Driver.
* Removed Dutch from Google NLP because Google doesn't support it for the Entities Extractor endpoint.

### v1.27.0 + v1.27.1

*Released Mar 13, 2025*

* Added [NLP Text Analysis](/guide/nlp-text-analysis) (including Entities + Topic Extractor).
* Rebuilt tags system.
* Added DataForSEO Post Task stat card.
* Added the documentation link for the Delete DataForSEO Post Tasks action.
* Fixed the phones input doesn't accept new values in the N.A.P Finder tool.
* Removed the time from the snapshot in the exported GMB Rank Tracker report.
* Ensured all the maps are loaded before exporting the GMB Rank Tracker report.

### v1.26.5

*Released Mar 9, 2025*

* Fixed the date issue when viewing SERP data in the Organic Rank Tracker tool.
* Skip keywords without SERP data when syncing.

### v1.26.4

*Released Mar 4, 2025*

* Added the ability to disable/enable GMB Rank Tracker keywords.
* Added the ability to select the DataForSEO priority queue for GMB Rank Tracker tool.
* Fixed the issue when the URL is not exported in the SERP Clustering and Organic Rank Tracker tools.

### v1.26.3

*Released Feb 26, 2025*

* Added the ability to include subdomain when tracking organic keywords.
* Added the ability to save multiple positions when a domain ranks for multiple pages for a keyword.
* Added the Competitor Discovery report for the Organic Rank Tracker tool.
* Remember the selected domain in the Organic Rank Tracker Pages tab.
* Fixed the issue where the snapshot date could not be fetched in the rankings distribution tab.
* Fixed an issue when parsing date in SERP exporter/importer.
* Fixed the SERP importer/exporter validation.
* Fixed the other traffic card of the Traffic Analytics tool that does not show data in some cases.
* Added validation rule: Request Delay must be at least 3 seconds when scraping with own IP.
* Fixed the error in fetching the trends chart in the GMB Rank Tracker tool.

### v1.26.2

*Released Feb 9, 2025*

* Added fetch business detail button for the N.A.P Finder tool.
* Bypass the new Google bot detection when using the own IP or proxy method in Organic Rank Tracker, SERP Clustering, N.A.P Finder tool.
* Fixed the user agent not respecting device type.
* The fixed output log is not printing when using its own IP or proxy method.

### v1.26.1

*Released Feb 4, 2025*

* Bypass the new Google bot detection to scrape Google PAA.
* Added DataForSEO SERP API for Bulk Google PAA.
* Added the ability to show all breaking changes when upgrading.
* Added total seed keywords and total keywords for the Google PAA reports page.
* Added the ability to remember Click Depth & Scrape SERP With fields on Bulk Google PAA form.
* Added RSS Sitemap support for the Sitemap Extractor tool.
* Added favorite geo targets for the SERP UULE tool.
* Added the ability to select country & language in the SERP UULE tool.
* Fixed seed keywords filter doesn't show options on the Google PAA detail page.
* Fixed the issue where the completed PAA report cannot be seen when another report is in process.

### v1.26.0

*Released Jan 19, 2025*

{% hint style="danger" %}
**Encryption Algorithm Update**

In previous versions, SEO Utils utilized encryption for sensitive data, which inadvertently caused some antivirus software and Apple Gatekeeper to flag the application as malware. To address these issues, the encryption feature has been removed.
{% endhint %}

<mark style="color:red;">**Action Required:**</mark>

Before upgrading to this version, please visit the Services page and copy all the API keys & passwords including Google Places, IndexNow, OpenAI, DataForSEO password, Open Router, and Anthropic.

<figure><img src="/files/b6jJql6LDgL1zmN8MWxb" alt=""><figcaption><p>Backup API keys and passwords.</p></figcaption></figure>

After upgrading to version 1.26.0, please re-enter your license key by following [this guide](https://help.seoutils.app/guide/manage-license-key#deactivate-the-license-key-from-a-device). If you previously used any of these keys—Google Places, IndexNow, OpenAI, DataForSEO password, Open Router, or Anthropic—please re-enter them as well.

***

* Removed the encryption code that inadvertently caused some antivirus software and Apple Gatekeeper to flag the application as malware.
* Notarized the app with Apple.
* Added the ability to show break changes alert before updating to a new version.

### v1.25.5

*Released Jan 15, 2025*

* Fixed SERP clustering; it doesn't re-cluster keywords when the number of keywords to scrape is 0.

### v1.25.4

*Released Jan 15, 2025*

* Added a German embedding model for the Semantic Clustering tool.
* Fixed an issue when fetching backlinks metric in the SERP analysis card.
* Fixed all issues that caused the SERP Clustering tool to crash on a huge keyword list.

### v1.25.3

*Released Jan 8, 2025*

* Added Portuguese models (PT-PT & PT-BR) for the Semantic Clustering tool.
* Added more logs for the Free GMB Pending Snapshots action.

### v1.25.2

*Released Jan 7, 2025*

* Added the "Free stuck organic SERP tasks" action.
* Fixed the SERP Clustering tool; it is stuck at the step of checking keyword metrics.

### v1.25.1

*Released Jan 7, 2025*

* Fixed Google Drive cache issue.
* Fixed an issue on the Google Business Rank Tracker Trends view.

### v1.25.0

*Released Jan 5, 2025*

* Added Windows ARM64 support.
* Added the Rankings Distribution report to the Organic Rank Tracker tool.
* Added the ability to export the Organic Rank Tracker report as PDF or HTML.
* Added the ability to preserve keyword cases in the SERP Clustering tool.
* Added the ability to disable snapshot dates in the Date Range picker when unavailable.
* Updated update source.
* Fixed some issues that cause SERP Clustering to crash.

### v1.24.3

*Released Dec 28, 2024*

* Added the ability to bypass site protection for the Sitemap Extractor tool.
* Added the ability to bypass site protection for the Bulk SEO Metadata Optimizer tool.
* Fixed a chart issue in the GMB Rank Tracker Trends view.
* Fixed the issue with sorting by keyword metrics in the Organic Rank Tracker tool.
* Fixed an issue where the Get Metrics modal cannot be opened multiple times in the SERP Analysis tool.

### v1.24.2

*Released Dec 20, 2024*

* Added the ability to clean up temporary files after checking keyword mentions.
* Fixed the Bulk SEO Metadata Optimizer tool; it couldn't find HTML files on Windows.

### v1.24.1

*Released Dec 17, 2024*

* Added the ability to run the optimizer with multiple workers, making it faster to optimize SEO metadata.
* Add a bulk action for deleting items for the Bulk SEO Metadata Optimizer tool.
* Added loading indicator publishing action in the Bulk SEO Metadata Optimizer tool.
* Added a button to refresh the AI model list.
* Updated message to support only post, page, and WooCommerce product types for WordPress integration.
* Updated guide link for the Bulk SEO Metadata Optimizer tool.
* Fixed the HTML file is not found in some cases when optimizing SEO metadata.
* Fixed the issue when GSC sites are not showing up.
* Fixed a style issue in the Bulk SEO Metadata Optimizer tool.

### v1.24.0

*Released Dec 16, 2024*

* Added new tool: [Bulk SEO Metadata Optimizer](/guide/bulk-seo-metadata-optimizer).
* Added site integrations.
* Added a device indicator on the Organic Rank Tracker detail page.
* Add a column to show the month-over-month percentage change in search volume compared to the previous month on the Keyword Suggestions page.
* Added the ability to break the page when the keyword list is long in the GMB Rank Tracker export.
* Added the ability to select all keywords in the Organic Rank Tracker Keywords page.
* Added the ability to show the matched URL in the SERP clustering tool.
* Set the color to green when the average rank metric is down since it's a good sign in the GMB Rank Tracker tool.
* Fixed a timezone issue in the Organic Rank Tracker tool.
* Fixed the sorting issue that doesn't work in some cases in the Organic Rank Tracker tool.
* Fixed an issue that caused crashes in the Organic SERP data collector.
* Fixed the app crash when estimating SERP clustering costs in some cases.
* Fixed a chart issue in the GMB Rank Tracker Trend view.
* Fixed the traffic analytics; it doesn't work with Thai URLs in some cases.
* Updated documentations.

### v1.23.5

*Released Dec 5, 2024*

* Added the ability to redact sensitive information on the GMB Rank Tracker’s comparison page.
* Added the ability to adjust the previous snapshot date when comparing 2 GMB Rank Tracker snapshots by setting comparison days.
* Added previous snapshot info to the GBM Rank Tracker preview export.
* Added metric cards: DataForSEO Organic SERP Ready Tasks & DataForSEO Google Maps SERP Ready Tasks.
* Added Database Fragmentation card and the ability to maintain the database.
* Added the ability to remember keyword metric sort field in the Organic Rank Tracker Overview page.
* Added the ability to suppress toggle table columns dropdown close when selecting.
* Added the ability to run the process to optimize the database in the background.
* Added recommended text for the embedding model.
* Updated documentation links.
* Optimized loading for the organic rank tracker keywords page and overview page.
* Removed the database connection limitation.
* Fixed the "too many SQL variables" issue when exporting organic rank tracker reports and SERP Data.
* Printed meaningful error messages when semantic clustering failed.
* Trimmed empty spaces of keywords before running semantic clustering.

### v1.23.4

*Released Dec 3, 2024*

* Fixed an issue when the "Free Stuck GMB Rank Trackers" tool didn't work when ready tasks is over 1,000 items.

### v1.23.3

*Released Dec 2, 2024*

* Added the ability to generate a grid centered on a specific point with a defined radius in the GMB Rank Tracker tool.
* Added SoLV metric for GMB Rank Tracker tool.
* Add a search bar for Competitors and Ranking Keywords tabs in the GMB Rank Tracker tool.
* Added breadcrumbs for all pages.
* Added trend view for the GMB Rank Tracker tool.
* Added a tool to unstick stuck GMB Rank Tracker snapshots.
* Fixed the issue when the sort field doesn't work as expected when the domain contains "-" in the Organic Rank Tracker.
* Removed the down arrow icon when the average rank change was 0.0.
* Fixed a display issue to show the correct color for ranking in the GMB Rank Tracker.
* Fixed the change indicator background color in dark mode for the GMB Rank Tracker tool.
* Improved sitemap extractor to detect more content types.
* Forced to use Semantic Keyword Clustering version 2 on Linux.
* Forced UTF-8 encoding on keyword suggestions exported file.

### v1.23.2

*Released Nov 26, 2024*

* Added Semantic Keyword Clustering v2.
* Added the ability to select all check mentions items.
* Added the ability to export the comparison page in the GMB Rank Tracker tool.
* Added the ability to collect uncollected tasks before starting a new tracker in the Organic Rank Tracker tool.
* Added the back to the report button on the Google PAA visual graph page.
* Add subtitle for Geo-target combobox.
* Added Bulk Delete Organic Rank Tracker Keywords.
* Fixed the retry action of GMB Trank Tracker, which didn't work correctly.

### v1.23.1

*Released Nov 22, 2024*

* Added the ability to re-check mentions on selected items.
* Fixed the organic rank tracker overview chart doesn't show data.
* Fixed the GMB Rank Tracker comparison tool doesn't show competitors.
* Fixed link style issues in Organic Keywords & Top Pages By Traffic pages.

### v1.23.0

*Released Nov 21, 2024*

* Added Bulk Check Mentions tool.
* Added the ability to run the organic rank tracker in bulk.
* Added the ability to run the GMB rank tracker in bulk.
* Added filters "index checked at" and "index submitted at" for the Google Search Console Indexing tool.
* Added the ability to sort "index checked at" and "index submitted at" columns.
* Added the ability to sort "first seen" and "last seen" dates in the Backlinks view.
* Added the ability to check if any reports are running before updating the app.
* Added the ability to pause all background tasks before updating the app.
* Added the ability to save preset filters in the GMB Rank Tracker tool.
* Setting the light mode is the default value for the new installation.
* Changed the behavior of retry action in GMB Rank Tracker to collect ready tasks instead of creating new post tasks.
* Fixed Google Search Console index indication is not correct in some cases.
* Fixed the total URL count issue in the "URLs indexed on Bing" metric card when filtering.
* Fixed the filter style issue in GMB Bird View.
* Fixed the GMB Rank Tracker Comparison tool doesn't show enough info.
* Fixed an issue when the Organic Rank Tracker can cause duplicated snapshots in different time zones.
* Only allow to select ready snapshot when comparing in GMB Rank Tracker tool.

### v1.22.3

*Released Nov 18, 2024*

* Fixed in-app update issue in v1.22.2 that doesn't allow you to open the app after upgrading. Please visit the download page to download the latest version.

### v1.22.2

*Released Nov 17, 2024*

* Added the ability to clone the Organic Rank Tracker report
* Added the ability to remove extra spaces from URLs taken from the sitemap.
* Fixed an issue where the app cannot be opened on macOS Sequoia 15.1.
* Fixed an issue when decrypting license key status.
* Fixed the Thai URI issue on Top Pages by Traffic.
* Fixed the Thai URI issue on the Traffic Analytics tool.
* Fixed the Page tab in the Organic Rank Tracker tool when it sometimes doesn't show ranking keywords.
* Updated dependencies
* Updated app info & copyright.

### v1.22.1

*Released Nov 14, 2024*

* Added more context on restore backup error.
* Fixed dark mode style issues on the SERP Data table.
* Fixed a security issue on macOS installation.

### v1.22.0

*Released Nov 13, 2024*

* Added Backup Database tool.
* Added Backup App Configuration tool.
* Added SERP Comparison.
* Added the ability to view historical SERP data.
* Added the ability to analyze SERP for keywords in the Organic Rank Tracker tool.
* Added a mechanism to prevent getting stuck at the database migration screen.
* Added the ability to remember the selected keyword in GMB Rank Tracker report.
* Added the ability to pause background jobs.
* Encrypted sensitive app configuration.
* Fixed the validation rule of the "Rerun Every" field in the Organic Rank Tracker tool.
* Fixed an issue that cannot export the organic rank tracker report in the Pages tab.
* Fixed an issue when the keyword is not displayed in the SERP data table.
* Fixed the issue when seed keywords are not shown in the Autocomplete filter.
* Fixed an issue that caused the app to crash when checking search volume for autocomplete keywords.
* Changed the website icon for Google business.
* Moved the Check Metrics action to the Bulk Actions in the Organic Rank Tracker Keywords page.
* Do not insert a newline in the textarea when pressing a comma in the Thai keyboard layout.
* Decoded Thai URI.
* Optimized database settings.

### v1.21.3

*Released Nov 6, 2024*

* Added the ability to export keyword metrics in the Organic Rank Tracker tool.
* Added the ability to sort the keyword metrics in the Organic Rank Tracker tool.
* Improved “Expand” button to view the full map and ranking grid on one screen without scrolling.
* Optimized database settings.
* Fixed Bulk Google PAA doesn't click if the IP is from the EU.
* Fixed the center coordinate is not pulling ranking data when selecting the circle shape in the GMB Rank Tracker tool.
* Added "enter license key" menu item to the user dropdown.
* Added renew button.

### v1.21.2

*Released Nov 2, 2024*

* Added the ability to estimate the cost when re-running the cluster.
* Added the ability to include uncollected tasks when estimating the cost of SERP clustering.
* Added export button for the Organic Rank Tracker tool.
* Added the ability to check keyword metrics for keywords in the Organic Rank Tracker tool.

### v1.21.1

*Released Oct 31, 2024*

* Hotfix: The app crashed on the new installation.

### v1.21.0

*Released Oct 31, 2024*

* Made modal scrollable when content is too long.
* Added device indicator for the Organic Rank Tracker tool.
* Added geo-target indicator for Organic Rank Tracker tool.
* Added tagging support for Organic Rank Tracker reports.
* Added a validation rule for the "Saved Serp Days" field.
* Added the ability to exclude domains in the N.A.P Finder tool.
* Added the ability to add multiple phone number formats in the N.A.P Finder tool.
* Added the ability to set grid shape to Circle in the GMB Rank Tracker (square or circle).
* Added the ability to import SERP Data from external sources.
* Added the ability to delete DataForSEO Post Tasks.
* Added SERP Database Overview & Retention Settings to manage SERP Data.
* Added the cost estimation for the SERP Clustering tool.
* Added the ability to set marker size smaller in the GMB Rank Tracker grid.
* Added a search bar for the Organic Rank Tracker overview page.
* Improved DataForSEO balance loading on the Dashboard page.
* Improve PAA to work with other languages.
* Removed the date at the end of description when exporting PAA reports.
* Optimized SERP Clustering algorithm to run faster.
* Optimized SERP Clustering exporting to run faster.
* Optimized page load for GMB Rank Tracker report.
* Fixed some bugs in PAA that sometimes prevent questions from being found.
* Fixed the Keyword Explorer doesn't export all keywords in some cases.
* Fixed the "database is locked" issue in some spots.

### v1.20.2

*Released Oct 24, 2024*

* Added city, state, and postal code fields for the N.A.P Finder tool.
* Fixed the UTF-8 encoding issue on GMB Rank Tracker.
* Fixed the mapping columns UI when the column is too long in the SERP clustering tool.
* Fixed "database is locked" in the SERP Clustering tool.
* Fixed Google Update annotations issue cannot be loaded.

### v1.20.1

*Released Oct 23, 2024*

* Added a visual graph for the Google PAA report.
* Added Google Update annotations.
* Added annotation types filter for Organic Rank Tracker chart.
* Fixed the user dropdown being hidden by the Log Panel on some screens.
* Fixed the issue where the "Scrape SERP With" selection isn't saved properly in the N.A.P Finder tool.
* Fixed the N.A.P Finder instruction link.
* Fixed the Google PAA description is not extracted correctly when depth > 0.
* Fixed an issue when adding over 10,000 keywords in the Organic Rank Tracker.
* Fixed the "max run" issue in the SERP Clustering tool.
* Fixed the "min updated date" issue in the SERP Data Exporter.

### v1.20.0

*Released Oct 21, 2024*

* Add N.A.P Finder.
* Added the ability to bulk add Google Search Console queries to Organic Rank Tracker.
* Added a section to manage license key.
* Added validation rules for SERP data importer.
* Forced UTF-8 encoding for Semantic Keyword Clustering tool.
* Fixed a glitch in the combobox filter.

### v1.19.8

*Released Oct 15, 2024*

* Added an "Export SERP Data" option has been added to allow you to choose whether or not to include SERP data.
* Updated sitemap extractor user-agent.
* Dropped geo targets table.
* Enhanced the error message for an invalid API key rental.
* Enforced UTF-8 encoding when exporting Google PAA reports.
* Enforced UTF-8 encoding when exporting Google/Bing Autocomplete reports.

### v1.19.7

*Released Oct 14, 2024*

* Fixed an issue that caused the app to crash.

### v1.19.6

*Released Oct 14, 2024*

* Fixed Geo Target issue on Google PAA.
* Fixed tag issue.
* Added an error alert when failing to fetch ready tasks from DataForSEO.
* Added a mechanism to prevent the ready tasks endpoint from being full.

### v1.19.5

*Released Oct 11, 2024*

* Added SERP Data Exporter & Importer.
* Added preset filters for Organic Rank Tracker.
* Added new sidebar layout setting: Full - No Dropdown.
* I updated the Geo Target list to include more locations and fix incorrect location names.
* The default sort has been changed to the Last Run At column when loading GMB Rank Tracker reports.
* Fixed an issue that caused the rank tracker reports to be stuck.
* Fixed the "too many SQL variables" issue when exporting a SERP clustering report.

### v1.19.4

*Released Oct 7, 2024*

* Optimized database settings.
* Fixed ranking keywords do not appear on the initial load.
* Fixed additional countries are not selected.
* Fixed some sidebar UI issues.
* Fixed "too many SQL variables" error when exporting SERP Clustering report.

### v1.19.3

*Released Oct 5, 2024*

* Added a new full sidebar layout and an option to change the sidebar layout.
* Added the option to hide the form on the GMB Rank Tracker tool.
* Added sorting for Organic Rank Tracker - Overview tab.
* Included Guernsey and Jersey as countries in the GSC site editing modal.
* Corrected an incorrect location name.
* Ensure Windows users run the app as an admin when updating.
* Fixed the issue with SERP clustering not working without geo-targeting.

### v1.19.2

*Released Oct 1, 2024*

* Fixed timezone issue on the Organic Rank Tracker tool.

### v1.19.1

*Released Sep 30, 2024*

* Fixed issue where rank tracker could not be created without a geo target.

### v1.19.0

*Released Sep 30, 2024*

* Added Organic Rank Tracker.
* Added the ability to save historical SERP data.
* Added Jersey and Guernsey as countries when adding Google Search Console sites.
* Fixed the Geo Target's default value not being fetched.
* Set the timeout for the sitemap extractor to 60 seconds.
* Fixed the auto zoom not working well on the preview page.
* Fixed the incorrect display of the lack of SERP data alert after clustering.

### v1.18.3

*Released Aug 30, 2024*

* Added tagging feature for GMB Rank Tracker reports.
* Added a switch button to display additional color variants for the ranking grid points.
* Added loading state for Competitors and Ranking Keywords table.
* Added opening hours for competitors table in GMB Rank Tracker tool.
* Added a button to open Google Business's website.
* Fixed some glitches in table filters.
* Fixed row action dropdown is not centered vertically.
* Fixed issue when exporting SERP data in the Keyword Explorer tool.
* Fixed some spacing issues.
* Fixed Created At column is updated to an empty value when updating the GMB Rank Tracker report.

### v1.18.2

*Released Aug 25, 2024*

* Added the ability to show or hide ranking changes indicator on the grid points.
* Added the ability to export grid points of the current snapshot.
* Added [comparison tool](/guide/google-my-business-rank-tracker#how-to-use-comparison-tool) for GMB Rank Tracker tool.
* Added "Last Run" column for the GMB Rank Tracker Reports table.
* Added "Clone" action for GMB Rank Tracker report.
* Fixed an issue where cannot set a timezone for the GMB Rank Tracker report.
* Fixed the GMB Rank Tracker report is not refreshed when the last snapshot is deleted.
* Fixed an issue where cannot edit the GMB Rank Tracker report when the schedule is not set.

### v1.18.1

*Released Aug 21, 2024*

* Added database migration loader.

### v1.18.0

*Released Aug 21, 2024*

* The new UI supports color changes and dark mode 🔥🔥🔥.
* Optimized queries to work with large reports.
* Allow to name the exported files.
* Added pagination and search input for all data tables.
* Only show 1000 lines of log.
* Fixed "database is locked" in some spots.
* Fixed Geocoding failed when editing the GMB Rank Tracker reports with Service Area Businesses.
* Fixed an issue where can't decode the Google Maps URL when no rating service API is added.
* Fixed minor issues.

{% hint style="warning" %} <mark style="color:orange;">**Important**</mark>

After upgrading, the app will run some migrations to optimize the database. During this time, the app may appear blank for 30 seconds to 2 minutes, depending on the size of your database. **Please don't close the app.**

Also, when upgrading to this version, all preset filters will be deleted. You'll need to re-add them because I’ve changed their format for better performance.
{% endhint %}

### v1.17.9

*Released Aug 7, 2024*

* Improve how the app manages "database is locked" issues when processing a huge amount of Google Maps SERP tasks.
* Improve how the app manages "database is locked" issues when counting uncollected SERP tasks.

### v1.17.8

*Released July 31, 2024*

* Improve how the app manages "database is locked" issues when processing SERP Clustering for over 100,000 keywords.

### v1.17.7

*Released July 26, 2024*

* Fixed the "database is locked" error when visiting a SERP Clustering report with over 60,000 clustered keywords.
* Only check the DataForSEO and Renting API service balance when credentials are filled out.

### v1.17.6

*Released July 20, 2024*

* Fixed the GMB Rank Tracker tool cannot export report on Windows.

### v1.17.5

*Released July 12, 2024*

* Fixed an issue when exporting a large list of keyword clusters (over 40,000 keywords).

### v1.17.4

*Released July 10, 2024*

* Fixed the exported GMB Rank Tracker report doesn't show the correct ranking.
* Fixed ranking data is not updated when changing keywords or when the report has a new snapshot.
* Fixed an issue when exporting a GMB Rank Tracker report after visiting the Bird's Eye view.
* Show unranked keywords when exporting GMB Rank Tracker report.

### v1.17.3

*Released July 9, 2024*

* Fixed the exported GMB Rank Tracker report doesn't show correct stats.
* Fixed the "file already closed" issue when exporting the GMR Rank Tracker report.

### v1.17.2

*Released July 7, 2024*

* Added the ability to export selected snapshot instead of the latest snapshot.
* Add the "Ranking Keywords" tab for the GMB Rank Tracker tool.
* Fixed the snapshot is stuck when using DFS API in GMB Rank Tracker tool.
* Fixed styles are not loaded in exported GMB Rank Tracker reports.
* Fixed the competitors are not loaded when clicking on a grid point.
* Fixed the average rank badge color is not shown correctly.

### v1.17.1

*Released July 3, 2024*

* Fixed the markers that are not loaded.

### v1.17.0

*Released July 3, 2024*

* Added the ability to export the GMB Rank Tracker report as PDF and HTML.
* Added Bird's Eye View for the GMB Rank Tracker report.
* Added the ability to schedule specific days to run the GMB Rank Tracker reports.
* Added the ability to retry stuck snapshots in the GMB Rank Tracker tool.
* Added log to show how many tasks are left from DataForSEO API.
* Added the center map button.
* Fixed cannot delete the current snapshot when pending.

### v1.16.3

*Released June 26, 2024*

* Added the ability to bulk check search intents of keywords.
* Fixed an issue when saving a large list of backlinks and traffic data.
* Fixed an issue when determining keywords to scrape SERP in the SERP Clustering tool.

### v1.16.2

*Released June 25, 2024*

* Added the ability to check the index of URL using [Bing Webmaster Tools API](/guide/indexnow#two-checking-index-methods).
* Fixed the position is not set correctly when using proxies to scrape SERP.
* Added View Google Drive Folder button.
* Fixed the "Analyze SERP" action that doesn't work when the domain count is over 100.

### v1.16.1

*Released June 24, 2024*

* Fixed an issue that caused the app to crash.

### v1.16.0

*Released June 24, 2024*

* Added the ability to distribute keywords to existing clusters in the SERP Clustering tool.
* Added the ability to view ranking for a target domain in the SERP Clustering tool.
* Added SERP Clustering Ranking metric cards.
* Added the ability to set the primary keyword of a cluster by using CPC.
* Added the ability to map CPC and Search Intent columns in the SERP Clustering tool.
* Added HTML sitemap support for the sitemap extractor tool.
* Added a help text about the HTML sitemap limitation.
* Added the ability to delete the current snapshot of the GMB Rank Tracker tool.
* Added rank changes for each marker on the GMB Rank Tracker map.
* Added cards to the Dashboard page that show your current balances with DataForSEO and the Renting API Service.
* Show cluster count and non-clustered keyword count, and update the algorithm to not group clusters that have one keyword.
* Handle auto-zoom better to fit the grid inside the GMB Rank Tracker map.
* Fixed the query and performance issues when running SERP clustering on a huge set of keywords.
* Fixed the SERP table doesn't show the correct ranking for child keywords.
* Fixed the Google Autocomplete tool does not return all keywords in non-UTF-8 charset.

### v1.15.4

*Released June 14, 2024*

* Fixed unknown time zone issue in some systems

### v1.15.3

*Released June 13, 2024*

* Added the ability to set a time window for running scheduled GMB rank tracker reports.
* Added the ability to add businesses via Google Maps URL.
* Added validation rule for "Scrape Data With" field.
* Added the ability to view competitor's ranking on the map.
* Added the ability to delete multiple selected markers.
* Added the ability to move one or many markers.
* Fixed Average Rank calculation.
* Fixed SERP data is not exported all in the SERP Clustering tool.
* Fixed an issue that caused the app to crash when scraping data from DataForSEO API.

### v1.15.2

*Released June 9, 2024*

* Fixed another issue that causes the GMB rank tracker to run multiple times when the Schedule field is set to Weekly.

### v1.15.1

*Released June 9, 2024*

* Fixed the GMB rank tracker running multiple times when the Schedule field is set to Weekly.
* Added SERP clustering and SERP analyzing loading indicator on the reports page.

<figure><img src="/files/utji2wCsVGCBTtkH3QBV" alt=""><figcaption><p>Loading indicators</p></figcaption></figure>

* Fixed the organic keywords filter that doesn't work with URL.
* Added the ability to clear cache after saving settings.

### v1.15.0

*Released June 7, 2024*

* Added Google My Business Rank Tracker tool.
* Moved out the "Analyze SERP" action from the other actions button.

### v1.14.2

*Released May 20, 2024*

* Improved the textarea field when copying data.
* Do not send a request to DataForSEO if there is no SERP clustering report running.
* Added a loading indicator for SERP clustering report when running.
* Added a loading indicator for the Bulk Analysis tool.
* Added the ability to split requests if the domain count is over 100.
* Only save organic SERP items when clustering for consistency.
* Use the new filter syntax from DataForSEO for the include/exclude filters.
* Renamed Keyword Bulk Analysis to Bulk Keyword Metrics.

### v1.14.1

*Released May 17, 2024*

* Fixed the SERP position is saved as "0".

### v1.14.0

*Released May 17, 2024*

* Added SERP API.
* Fixed the external search volume that was not ordered correctly when exporting the SERP clustering report.
* Fixed numbers are exported as a string on the SERP Clustering report.

### v1.13.1

*Released May 15, 2024*

* Fixed the issue where data was not cached correctly in some tools.

### v1.13.0

*Released May 15, 2024*

* Added bulk delete proxies.
* Added a loading indicator when adding GSC sites.
* Added default filters for backlinks, traffic, and keyword tools.
* Added sorting, filtering, and an export button for the backlinks tools.
* Hide alert: "No available Google service accounts. Stopping further submissions.". Only show it in the log panel.
* Added Geo Target (UULE) for Bulk Google PAA tool.
* Removed the draggable attribute from clickable elements in the sidebar and header.
* Added the ability to clear cached data on Google Drive.

### v1.12.3

*Released May 10, 2024*

* Fixed: The app crashed on the new installation.

### v1.12.2

*Released May 10, 2024*

* Fixed: The volume history chart does not appear in the Bulk Autocomplete report.
* Added the Legacy Bulk Analysis back.
* Added back-off time for SERP Clustering tool.
* Improved UX of set column header button when importing keywords.
* Fixed the issue when the SERP data sheet is blank.
* Updated SERP Clustering view to view clusters easily.
* Added the ability to map external search volume when importing keywords.
* Added the ability to sort/filter on external search volume.
* Added the ability to remember the last selection of the check search volume field.
* Improved the SERP Clustering report export.
* Fixed the issue where the "Enter License Key" dropdown is not displayed.
* Added intersection mode for Backlink Gap.

### v1.12.1

*Released May 6, 2024*

* Added an alert message when a keyword is missing SERP data in the SERP clustering report.
* Added the ability to set the delay time between requests when scraping SERP data for keywords.

### v1.12.0

*Released May 4, 2024*

* Added SERP Clustering tool.
* Bulk analysis tool and SERP analysis of Keyword Explorer now utilize the Pages Summary endpoint from DataForSEO, which offers an affordable price.
* Added the ability to enter multiple keywords with an include/exclude filter.
* Filtered out invalid keywords before checking search volume.
* Fixed: The Indexed URLs page doesn't refresh the site data after updating the site.
* Added enter license key menu item.
* Added pagination for SERP Clustering, Autocomplete, and Google PAA reports.

### v1.11.1

*Released April 24, 2024*

{% hint style="danger" %}
This version will delete all the **autocomplete keywords** due to the database structure changes. If you wish to retain these keywords, please ensure you export them prior to the update. Otherwise, no action is needed.
{% endhint %}

* Fixed an issue where some Autocomplete keywords are not saved due to changes in the database structure.

### v1.11.0

*Released April 22, 2024*

* Added Backlink Gap tool.
* Added the ability to override the re-check & re-submit index behavior of IndexNow.
* Added the ability to override the re-check & re-submit index behavior of Google Search Console API.
* Added the ability to set names for Google Service Accounts.
* Improved UI/UX for editing the GSC site modal and GSC site listing page.
* Fixed the indexed count indicator is not updated when changing the site.

### v1.10.1

*Released April 17, 2024*

* Fixed an issue where the app crashed due to changes in the database structure.

### v1.10.0

*Released April 17, 2024*

* Added the ability to export and filter the top pages by traffic of a website.
* Added the ability to import proxies in bulk and enable/disable them.
* Added a metric card to indicate how many URLs are indexed on Bing.
* Added the ability to connect many Google Service Accounts for Google Search Console integration.
  * If you have already added a site from Google Search Console, you will need to take [this extra step](/guide/google-search-console#supports-multiple-google-service-accounts-updated-on-april-17-2024) after upgrading to v1.10.0 to continue pulling your keyword data.
* Added the ability to assign tasks for Google Service Accounts.
* Added the ability to check keyword search volume, CPC, and keyword difficulty for the Bulk Autocomplete tool.
* Added the ability to sort the data by clicking on the table column in the Traffic Analysis tool.
* Validate and fix the date-time error when adding a sitemap URL.
* Fixed the issue where traffic competitor filters didn't work with the Renting API Key service.
* Fixed the keyword includes/excludes filters didn't work right when adding multiple keywords.

### v1.9.0

*Released Mar 31, 2024*

* Add the ability to extract keywords from Google/Bing Autocomplete with multiple keyword modifiers and seed keywords.
* Fix an issue where URLs cannot be imported if the sitemap LastMod date field doesn't include time.
* Include a "Refresh Site Domains" button for the Google Search Console tool.
* Add a loading indicator when adding a Google Search Console Site page.
* Fix the issue where URLs are not displayed when adding a sitemap URL.
* Allow free users to access the app and use free tools.
* Implement sitemap URL validation.

### v1.8.0

*Released Mar 22, 2024*

* Added [IndexNow](/guide/indexnow) tool for submitting index to Bing, Yandex, Naver, Seznam.cz, and Yep.
* Added [Page view for Google Search Console integration](/guide/google-search-console#pages-view-updated-on-may-22-2024).
* Added OpenAI integration.
* Added "Insert keywords with AI" tool.
* Added the ability to [set which Google Service Accounts you want to use on specific sites](/guide/auto-indexing-tool#updates-on-march-22-2024).
* Bunches of fixes and improvements.

### v1.7.3

*Released Mar 4, 2024*

* Sanitized the URL to prevent unexpected formatting errors.
* Added Google UULE tool.
* Implemented a new index-checking method using the Google Search Console URL Inspection API.
* Included filters for the Indexed URLs page.
* Executed three concurrent requests when checking an index using the "site:url" operator and proxies.
* Removed the "required" rule for username and password fields when adding a proxy.
* Provided the option to enable/disable Google Service Accounts.
* Fixed an issue where the app crashed when entering a license key.

### v1.7.2

*Released Feb 26, 2024*

* Fixed an issue where the app crashed on the new computer.

### v1.7.1

*Released Feb 25, 2024*

* Fixed an issue where sitemap URLs could not be saved if the Last Mod field is empty.

### v1.7.0

*Released Feb 25, 2024*

* Added Auto Indexing tool
* Automatically check if your sitemap is an index. It will start with the /sitemap\_index.xml file and then go through all other XML files to extract every URL.
* Added Proxy supporting
* The bulk check mentions feature applies the current filters, allowing you to check mentions for specific keywords instead of checking all keywords.
* The Page filter in the Google Search Console now loads data asynchronously, preventing the app from freezing when loading more than 10k pages.

### v1.6.0

*Released Feb 4, 2024*

* Added Google PAA Scrapper
* Add an export button for the Traffic Competitors page
* Add filters for the Traffic Competitors page
* Added Avg Position metric for Traffic Competitors page
* Fixed "Invalid filters" issue for Content Gap

### v1.5.0

*Released Jan 24, 2024*

* Added Content Gap feature
* Added a new Bulk Analysis feature. Now, you can perform all your bulk analyses in one convenient location
* Added Linux support
* Added Word Count filter for Organic Keywords page
* Added User-Agent "SEO Utils Headless Chrome" when scraping HTML content
* Made the keyword clustering script downloadable to reduce the app size
* Fixed the issue where the title extraction functionality returned an incorrect title when checking mentions.

### v1.4.3

*Released Jan 15, 2024*

* Fixed the issue with no windows appearing
* Fixed the issue that caused the app to crash when there was no backlink data from DataForSEO when checking bulk backlinks

### v1.4.2

*Released Jan 15, 2024*

* Added 15 fresh filters for Organic Keywords.
* Added 24 new filters for Backlinks.
* Added a button to export all backlinks.
* The app now remembers your window size and position for next time.
* Show a friendly message when there's no DataForSEO data during bulk processes.
* Added an option to hide "Chat with GSC Data Analyzer".
* Added "Check Mentions Workers" setting.
* Added "New Update" badge for latest version alerts.

### v1.4.1

*Released Jan 10, 2024*

* Added *Not Mentioned In Title* filter for Google Search Console keywords
* Added *Not Mentioned In Meta Description* filter for Google Search Console keywords
* Added *Not Mentioned In Headings* filter for Google Search Console keywords
* Added *Word Count* column and *Word Count* filter for Google Search Console keywords
* Added the ability to export all organic keywords instead of the current page
* Added a button to chat with the GSC Data Analyzer GPT

### v1.4.0

*Released Jan 9, 2024*

* Added [Google Search Console integration](https://help.seoutils.app/guide/google-search-console)
* Fixed some localhost links

### v1.3.2

*Released Dec 28, 2023*

* Fixed the issue where it doesn't allow users to use traffic and keyword tools without entering DataForSEO credentials.

### v1.3.1

*Released Dec 27, 2023*

* Added [Renting API for Traffic + Keyword tools](https://help.seoutils.app/guide/rent-dataforseo-api-key#updated-dec-27-2023-added-api-endpoints-for-traffic-and-keyword-tools)
* Added Ranked Keyword Info on the Backlinks page

<figure><img src="/files/DzIegD9qf4vmYc739gJH" alt="" width="375"><figcaption><p>Ranked Keyword Info</p></figcaption></figure>

* Fixed the route could not be found issue
* Fixed the issue when links are not clickable in some places

### v1.3.0

*Released Dec 26, 2023*

* Added Keyword Explorer
* Added Links card on the Dashboard page
* Trimmed spaces in the domain/URL before running bulk analysis.

### v1.2.0

*Released Dec 10, 2023*

* Added Bulk Backlinks Analysis
* Added Bulk Referring Domains Analysis
* Added Bulk Traffic Analysis
* Added Bulk Keywords Analysis
* Fixed the issue when cannot disable the Renting Backlinks API

### v1.1.1

*Released Nov 30, 2023*

* Show the backlink search bar when using renting API Key
* Added data-sharing support for other endpoints

### v1.1.0

* Added Renting API Key for Backlinks API. [Read instruction](/guide/rent-dataforseo-api-key).
* Added Google Drive for sharing data. [Read instruction](/guide/data-sharing-with-s3).
* Added changelog link
* Added error monitor

### v1.0.1

* Added self-update button

<figure><img src="/files/5x1JJwZmomz9BdmmMg0F" alt="" width="188"><figcaption></figcaption></figure>

### v1.0.0

Added the following features:

* Backlinks Analytics
* Traffic Analytics
* Semantic Keyword Clustering
* Sitemap Extractor
* SERP Similarity


# Manage License Key

### Access the License Key Manager

You can access the License Key Manager from the user dropdown in the app.

<figure><img src="/files/dZNQ5QFNu8pE2vuG9vK0" alt=""><figcaption><p>License Key Manager</p></figcaption></figure>

{% hint style="success" %}
**Important:** You can also access the License Manager via this URL <https://app.lemonsqueezy.com/my-orders>.
{% endhint %}

### Deactivate the License Key From a Device

There are two ways to deactivate a device from your license key.

#### Option 1: Manage Devices Page

Visit <https://app.seoutils.app/manage-devices> to view and deactivate all devices activated on your license — even devices you no longer have access to.

{% stepper %}
{% step %}
**Enter Your License Key and Email**

Enter your license key and the **email address used to purchase** the license, then click **"Continue"**.
{% endstep %}

{% step %}
**Verify Your Email**

A verification link will be sent to your email. Click the link in the email to verify ownership. The link expires in 10 minutes.

{% hint style="info" %}
Your session is remembered for 30 days, so you won't need to verify again on the same browser.
{% endhint %}
{% endstep %}

{% step %}
**Deactivate Devices**

You'll see a list of all devices activated on your license. Click **"Deactivate"** next to any device you want to remove.
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
Only the license key owner (the email used during purchase) can access the Manage Devices page. This prevents unauthorized deactivation.
{% endhint %}

#### Option 2: From the Lemon Squeezy Dashboard

To deactivate the license key from your current device and activate it on a new one, go to the [License Key Manager](#access-the-license-key-manager) and follow these steps.

<figure><img src="/files/DIZJ56GPuiDN4Ne2lLfE" alt=""><figcaption><p>Deactivate a device</p></figcaption></figure>

### Renew Your License Key

To renew your license key please visit this URL <https://app.seoutils.app/renew-license-key>.

{% hint style="danger" %}
You can re-activate your license on new devices as long as it’s valid. However, once it expires, re-activation is no longer possible due to Lemon Squeezy’s system.
{% endhint %}


# Workspace

Workspaces in SEO Utils allow you to organize and separate your projects, clients, or different SEO campaigns. Each workspace maintains its own set of data, making it easy to manage multiple projects without mixing information.

## What are Workspaces?

Workspaces act as separate containers for your SEO data. When you switch between workspaces, you're essentially switching between different databases of:

* [Organic Rank Tracker reports](/guide/organic-rank-tracker)
* [GMB Rank Tracker reports](/guide/google-my-business-rank-tracker)
* [LLM Rank Tracker reports](/guide/llm-rank-tracker)
* [Content Structs](/guide/content-struct)
* [Google Search Console properties](/guide/google-search-console)
* And many more...

### Default Workspace

Every SEO Utils installation comes with a **Default** that cannot be deleted. This ensures you always have at least one workspace to work with.

## Managing Workspaces

### Accessing Workspaces

You can access the workspace switcher from the sidebar. The current active workspace is displayed with its logo (if set) or a default icon.

<figure><img src="/files/S4KGThsuzbZLXkxnp4w5" alt=""><figcaption><p>Workspace switcher in the sidebar</p></figcaption></figure>

### Creating a New Workspace

#### Step 1

Click on the workspace switcher in the sidebar to open the dropdown menu.

#### Step 2

Click on the **"Add workspace"** button at the bottom of the dropdown.

#### Step 3

Enter a **name** for your workspace and optionally add a **logo URL** to help identify it visually.

<figure><img src="/files/SCwuKhEiHurqDcGio0IB" alt="" width="563"><figcaption><p>Create workspace modal</p></figcaption></figure>

Click **"Create"** to create the workspace, or **"Create & Switch"** to create and immediately switch to the new workspace.

### Editing a Workspace

To edit an existing workspace:

1. Open the workspace dropdown
2. Hover over the workspace you want to edit
3. Click the **pencil icon** that appears
4. Update the name or logo URL
5. Click **"Save"** to apply changes

<figure><img src="/files/D9vJdSHKoIUBSMk32gOH" alt="" width="288"><figcaption><p>Edit workspace by clicking the pencil icon</p></figcaption></figure>

### Deleting a Workspace

{% hint style="warning" %}
You can only delete workspaces that contain **no data**. If a workspace has any reports, tracked keywords, or other data, you must first delete or move that data before deleting the workspace.
{% endhint %}

To delete a workspace:

1. Open the workspace dropdown
2. Hover over the workspace you want to delete
3. Click the **trash icon** that appears
4. Confirm the deletion in the modal

{% hint style="info" %}
The **Default Workspace** cannot be deleted.
{% endhint %}

## Switching Between Workspaces

### Using the Dropdown

Click on any workspace in the dropdown to switch to it. The app will reload with the selected workspace's data.

### Using Keyboard Shortcuts

You can quickly switch between workspaces using keyboard shortcuts:

* **Mac**: `⌘1` through `⌘9`
* **Windows/Linux**: `Ctrl+1` through `Ctrl+9`

The number corresponds to the workspace's position in your list. For example, `⌘1` switches to the first workspace, `⌘2` to the second, and so on.

### Reordering Workspaces

You can reorder workspaces to customize your keyboard shortcuts:

1. Open the workspace dropdown
2. Hover over a workspace to see the **drag handle** (grip icon)
3. Click and drag the workspace to your desired position
4. Release to save the new order

<figure><img src="/files/Jt3iCNZJ2HWwejX5Sa5r" alt="" width="288"><figcaption><p>Drag workspaces to reorder them</p></figcaption></figure>

## Moving Data Between Workspaces

You can move existing data from one workspace to another using the bulk move feature:

### Moving Multiple Records

1. Select the records you want to move (using checkboxes in any data table)
2. Click on **"Bulk Actions"** button
3. Select **"Move to Workspace"**
4. Choose the target workspace from the dropdown
5. Click **"Execute"** to move the selected records

<figure><img src="/files/wp5HfCzbr8FLb0T1ASEz" alt=""><figcaption><p>Bulk move records to another workspace</p></figcaption></figure>

## Use Cases for Workspaces

### Client Management

Create separate workspaces for each client to keep their SEO data isolated:

* **Client A Workspace**: Contains all rank tracking, backlinks, and reports for Client A
* **Client B Workspace**: Separate data for Client B
* **Personal Projects**: Your own website's SEO data

### Project Organization

Organize different projects or websites:

* **E-commerce Site**: Track product page rankings and organic traffic
* **Blog Network**: Monitor multiple blog sites
* **Local Business**: Track Google Business rankings and local SEO

### Team Collaboration

Different teams or departments can have their own workspaces:

* **Content Team**: Focus on content analysis and optimization
* **Link Building Team**: Track backlink campaigns
* **Technical SEO**: Monitor site health and technical metrics

## Important Notes

* Each workspace maintains completely **separate data**
* Switching workspaces will **refresh the current view** to show the new workspace's data
* Workspace settings are **saved locally** and persist between app sessions
* The active workspace is **remembered** when you close and reopen the app
* All API keys and service accounts are **shared across all workspaces**

## Best Practices

1. **Name workspaces clearly**: Use descriptive names like "Client - ABC Corp" or "Project - Summer Campaign"
2. **Add logos**: Upload client logos or project icons to quickly identify workspaces visually
3. **Organize by priority**: Place your most-used workspaces at the top for quick keyboard access
4. **Regular cleanup**: Delete empty workspaces you no longer need to keep your list organized
5. **Move data carefully**: Double-check the target workspace before moving important data


# SEO Data Source

What is the source of backlinks and traffic data in SEO Utils?

First, you need to know that, SEO Utils is just a desktop application that provides you with a set of SEO tools including Backlinks Analytics and traffic Analytics. SEO Utils doesn't have a backlinks or keyword database.

The main database is from DataForSEO.

## What is DataForSEO

[DatForSEO](https://dataforseo.com/?aff=134458) is a solution that provides comprehensive SEO and digital marketing data via API. Currently, DataForSEO database has over 9 billion keywords (Google + Bing) and over 2.81 trillion backlinks

<figure><img src="/files/ubdoxzuFNEa47p73q2NN" alt=""><figcaption><p>Source: <a href="https://dataforseo.com/our-data/?aff=134458">https://dataforseo.com/our-data</a></p></figcaption></figure>

Ahrefs boasts the most extensive backlink database in the market, while SEMrush leads with the largest collection of keywords. DataForSEO stands out for its highly competitive pricing, complemented by a database that is equally formidable.

You **don't need a subscription**. With DataForSEO, you pay only for the individual services you consume. The **pay-as-you-go** pricing model is designed to help you minimize costs, increase resource efficiency, and build operational resilience.

If you're seeking a budget-friendly alternative to Ahrefs or SEMrush, this option is ideal. Even for those already using Ahrefs or SEMrush, adding an additional data source can significantly enhance your SEO insights. A rich keyword database helps in identifying trending topics, enabling you to create content that better resonates with your audience and aligns with their interests.

{% hint style="info" %}
**Read more:** [Backlink APIs: An In-Depth Comparison of DataForSEO, Ahrefs, and Semrush](https://dataforseo.com/blog/backlink-api-comparison-dataforseo-ahrefs-semrush/?aff=134458)
{% endhint %}

### What Are the Roles of SEO Utils?

You might wonder why you need SEO Utils when you can directly access data from DataForSEO. The key difference is that DataForSEO only offers data through an API, without the user-friendly interface (UI) you see in tools like Ahrefs or SEMrush. So, if you don't have coding skills or are not familiar with using APIs, SEO Utils steps in to fill this gap.

Understanding the importance of data presentation, SEO Utils provides a smart and clean UI to help you interact with the data effectively.

<figure><img src="/files/D4QZPR7DhQywCKcNKcVi" alt=""><figcaption><p>SEO Utils</p></figcaption></figure>

Also, SEO Utils adds a cache layer to help you save costs when pulling data from DataForSEO.

For example, when you check a website's backlinks, SEO Utils saves the first page's data in the cache. If you go to the second page and then come back to the first, it uses the saved data instead of making another API request. This way, you don't end up pulling the same data twice for the same page or filters, saving both time and resources.

Besides Backlinks and Traffic Analytics, SEO Utils offers more handy tools. This includes [Keyword Clustering](/guide/semantic-keyword-clustering) for grouping a million keywords, a Sitemap Extractor to easily understand website structure, and an AI Content Writer to help you create great content quickly and easily.

### How to Connect Your DataForSEO Account to SEO Utils?

1. First, you need to register a DataForSEO account at: [https://app.dataforseo.com/register](https://app.dataforseo.com/register/?aff=134458)

{% hint style="success" %}
If you don't have a **business email**, please use this form for registration [https://dataforseo.com/registration-request](https://dataforseo.com/registration-request/?aff=134458)
{% endhint %}

2. Visit <https://app.dataforseo.com/api-access> to grab your API login & API password

<figure><img src="/files/BEWv2NhTUEHvic3UXiOH" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
API login and API password are **NOT** the username and password you use to log in to the DataForSEO dashboard.
{% endhint %}

3. Open SEO Utils on your computer, and click on the App dropdown in the top-left of the app.

<figure><img src="/files/C5H8Awh7SYFsSKdYQREf" alt=""><figcaption></figcaption></figure>

4. Scroll down to the DatForSEO section, and enter your login + password.

<figure><img src="/files/Se4qoUlGLtefswoFEhu6" alt=""><figcaption></figcaption></figure>

5. Start using SEO Utils to pull backlinks, traffic, and keyword data.

{% hint style="info" %}
**Your API credentials will be saved locally, nothing leaves your computer.**
{% endhint %}


# Semantic Keyword Clustering

Do you frequently question if two keywords can be targeted together on a page, or struggle with a large list of keywords that ChatGPT or other tools can't cluster due to token limits or cost?

### What Are the Differences Between SEO Utils' Keyword Clustering and Other Tools?

Here are 2 of the main differences:

#### Flexible to Switch the Embedding Model

Embedding models in Natural Language Processing (NLP) are designed to convert words, phrases, sentences, or entire documents into numerical vectors. These vectors represent the linguistic features of the text, allowing machines to process and analyze language in a meaningful way.

To do keyword clustering well, you need a good model that's already been trained. With AI growing fast, new models are coming out almost every day. You can visit [HuggingFace](https://huggingface.co/), a website, to get a free model and use it with SEO Utils to find one that's best for your type of business.

You can also take one of these models and train it more on words specific to your niche or industry. Then, use this customized model in SEO Utils for even better keyword clustering, which can improve your SEO results.

#### Unlimited Keywords for Clustering

With SEO Utils, you're not restricted in the number of keywords you can cluster. This is a big advantage over other tools that limit you to clustering between 5,000 to 10,000 keywords at a time. Since SEO Utils runs on your computer, it can handle as many keywords as you need, going way beyond these limits.

There's also no credit-based system, meaning you don’t have to pay extra no matter how many keywords you cluster. This can mean big savings, especially in large niches like Gym or Fitness where you might need to cluster a million keywords.

You might think, "*Can't I just cluster keywords with ChatGPT or the OpenAI API?*" While it's true you can cluster a few hundred keywords with these tools, they hit a limit when you try more than 10,000 keywords due to token limitations. Even with GPT-4 Turbo, which allows more tokens, the quality of clustering decreases with more keywords. It often loses context, doesn't follow instructions well, and misses keywords because you cannot control the `temperature` parameter in ChatGPT. You can do it with OpenAI API, but the cost is too high.

That's where a dedicated keyword clustering tool like SEO Utils makes a big difference.

### Semantic Clustering vs SERP Clustering

In my experience, SERP Clustering always gives you the best result of clustering. However, it comes with many technical issues like proxy rotation, time-consuming, server resources, etc.

Take [Larseo's SERP Clustering](http://larseo.app/), for example. It lets you cluster unlimited keywords, but clustering 1 million keywords takes a really long time and can cost about $2,900 (at 0.5 credit per keyword).

On the other hand, using the Semantic Clustering feature in SEO Utils is a different story. You don't have to pay extra, and you can get results as good as SERP Clustering. You can achieve this by fine-tuning your model to suit your specific needs.

{% hint style="info" %}
SEO Utils will support fine-tuning soon!
{% endhint %}

### How to Download Embedding Models and Use It on SEO Utils?

{% hint style="danger" %}
This documentation is for Semantic Clustering v1. For a better experience and improved performance, please refer to the [documentation for Version 2](#updated-nov-26-2024-semantic-keyword-clustering-v2).

Also, version 1 is not available for Linux.
{% endhint %}

{% embed url="<https://drive.google.com/file/d/1XckX_Or6LZDeDk7rLjWQY3v-QgrFV8Zc/view?usp=sharing>" fullWidth="true" %}
SEO Utils - How to use Semantic Keyword Clustering
{% endembed %}

1. First, you can visit this leaderboard: <https://huggingface.co/spaces/mteb/leaderboard>
2. Click on the "Clustering" tab, and then select the language that matches your keywords.

<figure><img src="/files/3G5vFKR2XOtqWzU9uNWK" alt=""><figcaption><p>List of top embedding models</p></figcaption></figure>

3. You will see the top embedding models based on their clustering task performance.
4. Select one model, for example, <https://huggingface.co/thenlper/gte-large>

{% hint style="warning" %}
Only select the mode that can be used with **Sentence Transformers**.
{% endhint %}

<figure><img src="/files/Ih21pDALuh9jC4zXpsPy" alt=""><figcaption><p>Example a model can be used with Sentence Transformers.</p></figcaption></figure>

5. Click on the Clone repository to download a model with GIT `git-lfs`

<figure><img src="/files/hBE8M9WKN2C6KIWogYae" alt=""><figcaption><p>Download a model</p></figcaption></figure>

```
# Make sure you have git-lfs installed (https://git-lfs.com)
git lfs install
git clone https://huggingface.co/thenlper/gte-large

# if you want to clone without large files – just their pointers
# prepend your git clone with the following env var:
GIT_LFS_SKIP_SMUDGE=1
```

{% hint style="info" %}
I will provide a [list of popular models on Google Drive](#popular-models) so that you can easily download them.
{% endhint %}

5. After downloading a model, open SEO Utils on your machine.
6. Click on the App dropdown, and go to the Settings page.

<figure><img src="/files/C5H8Awh7SYFsSKdYQREf" alt=""><figcaption></figcaption></figure>

7. Scroll down to the **Keyword Clustering** section and enter the path to the downloaded model on your machine. Then hit the Save button.

<figure><img src="/files/mFr3h8Ut9WVrYpy8vvvN" alt=""><figcaption></figcaption></figure>

8. That's all. Now, you can go to the Keyword Clustering page and kick off the process.

### Popular Models

<details>

<summary>English</summary>

**thenlper/gte-large**

* Download: <https://drive.google.com/file/d/1O4lm4hnqXoCDloqaw_exWiz9a-Vy0ZZK/view?usp=sharing>
* More info: <https://huggingface.co/thenlper/gte-large>

**BAAI/bge-large-en-v1.5**

* Download: <https://drive.google.com/file/d/1e3C2t3r1UrYgiAJf8GipmEUpXFK7zThz/view?usp=sharing>
* More info: <https://huggingface.co/BAAI/bge-large-en-v1.5>

**sentence-transformers/sentence-t5-xl**

* Download: <https://drive.google.com/file/d/15ijnzpEfbZG0dTiXq6Gyyesqj5DCDaEU/view?usp=sharing>
* More info: <https://huggingface.co/sentence-transformers/sentence-t5-xl>

</details>

<details>

<summary>Dutch</summary>

**NetherlandsForensicInstitute/robbert-2022-dutch-sentence-transformers**

* Download: <https://drive.google.com/file/d/1sbQ60drQeuqVTFYlbeuDp-Ds8Eoxts8D/view?usp=sharing>
* More info: <https://huggingface.co/NetherlandsForensicInstitute/robbert-2022-dutch-sentence-transformers>

**textgain/allnli-GroNLP-bert-base-dutch-cased**

* Download: <https://drive.google.com/file/d/1MKDmybaQihStFcV6N4hxaRz3TINZ5B_4/view?usp=sharing>
* More info: <https://huggingface.co/textgain/allnli-GroNLP-bert-base-dutch-cased>

</details>

<details>

<summary>Swedish</summary>

**KBLab/sentence-bert-swedish-cased**

* Download: <https://drive.google.com/file/d/1-eyV7KURYSd16pJeTWgMg9Sm_2DeEyDG/view>
* More info: <https://huggingface.co/KBLab/sentence-bert-swedish-cased>

</details>

<details>

<summary>Spanish</summary>

**hiiamsid/sentence\_similarity\_spanish\_es**

* Download: <https://drive.google.com/file/d/1a59Ld6LA_HCWwcEd7PQPogSCGr8_8yRU/view?usp=sharing>
* More info: <https://huggingface.co/hiiamsid/sentence_similarity_spanish_es>

</details>

<details>

<summary>Japanese</summary>

**colorfulscoop/sbert-base-ja**

* Download: <https://drive.google.com/file/d/1IMLy6YlVM1irIFwS3eNTrL9GZEdwfcJC/view?usp=sharing>
* More info: <https://huggingface.co/colorfulscoop/sbert-base-ja>

**sonoisa/sentence-bert-base-ja-mean-tokens**

* Download: <https://drive.google.com/file/d/1VmRKpCjnEpY-jY6o_6SYsqUPFajGhbmN/view?usp=sharing>
* More info: <https://huggingface.co/sonoisa/sentence-bert-base-ja-mean-tokens>

</details>

<details>

<summary>Filipino</summary>

**meedan/paraphrase-filipino-mpnet-base-v2**

* Download: <https://drive.google.com/file/d/1PToqNZKmc1GrrNxPIf2yDR9pC05kyfoD/view?usp=sharing>
* More info: <https://huggingface.co/meedan/paraphrase-filipino-mpnet-base-v2>

**danjohnvelasco/filipino-sentence-roberta-v1**

* Download: <https://drive.google.com/file/d/1GVzkYOCRuL2QHFOLCDKPRZlQqbGH5wqZ/view?usp=sharing>
* More info: <https://huggingface.co/danjohnvelasco/filipino-sentence-roberta-v1>

</details>

<details>

<summary>Chinese</summary>

**uer/sbert-base-chinese-nli**

* Download: <https://drive.google.com/file/d/16d_5UUxM8cUGy7TXCE0FJitg2NQNnpVc/view?usp=sharing>
* More info: <https://huggingface.co/uer/sbert-base-chinese-nli>

</details>

<details>

<summary>Thai</summary>

**mrp/simcse-model-m-bert-thai-cased**

* Download: <https://drive.google.com/file/d/16AukQ0XCBbWyBTTPl7mh6bTb7_chQtjz/view?usp=sharing>
* More info: <https://huggingface.co/mrp/simcse-model-m-bert-thai-cased>

</details>

<details>

<summary>Vietnamese</summary>

**keepitreal/vietnamese-sbert**

* Download: <https://drive.google.com/file/d/1xMx7x78Dgyv7HcFOYZJALDDEMX3p3an3/view?usp=sharing>
* More info: <https://huggingface.co/keepitreal/vietnamese-sbert>

</details>

<details>

<summary>Arabic</summary>

**medmediani/Arabic-KW-Mdel**

* Download: <https://drive.google.com/file/d/1dtvn7L4ItcCr3G5M0SOYIKyR4k8hkz1C/view?usp=sharing>
* More info: <https://huggingface.co/medmediani/Arabic-KW-Mdel>

</details>

<details>

<summary>Indonesia</summary>

**firqaaa/indo-sentence-bert-base**

* Download: <https://drive.google.com/file/d/1W6df3Ij-NPCgmdwgv9DyBO7XEe2-MBvM/view?usp=sharing>
* More info: <https://huggingface.co/firqaaa/indo-sentence-bert-base>

</details>

<details>

<summary>Universal</summary>

These models are pre-trained in multiple languages. If you cannot find a model that is pre-trained in a specific language, you can use these universal models.\
\
**sentence-transformers / all-mpnet-base-v2**

* Download: <https://drive.google.com/file/d/15ijnzpEfbZG0dTiXq6Gyyesqj5DCDaEU/view?usp=sharing>
* More info: <https://huggingface.co/sentence-transformers/all-mpnet-base-v2>

</details>

### Updated Nov 26, 2024: Semantic Keyword Clustering v2

With the release of [SEO Utils v1.23.2](https://help.seoutils.app/guide/pages/FYHJNu9cAi74Qc90ALo7#v1.23.2), I’ve introduced Semantic Keyword Clustering v2, which leverages a consistent [Docker environment](https://www.docker.com/) for running the clustering Python script. Here’s how this upgrade improves your experience:

* **Streamlined Model Selection:** No more manual downloads from HuggingFace—simply select your model from a dropdown menu, and SEO Utils takes care of the rest.
* **Faster Clustering with GPU Support:** Speed up keyword clustering with GPU support for Windows and Linux. While macOS only supports CPU, version 2 still delivers faster clustering compared to version 1!
* **Polished Output:** All formatting issues in the output file have been resolved.
* **Improved Reliability:** Minimize unexpected issues with a more stable setup.
* **Simplified Updates:** Updating the clustering script is now easier for me, as I no longer need to build separate executable scripts for each platform.

{% hint style="info" %}
**Why do I still keep version one?**\
\
Some users run SEO Utils on VPS, and not all VPS can support Docker. That’s why version 1 is still available as a backup option. If your setup supports Docker, I highly recommend using version 2!
{% endhint %}

#### How to Install Docker

* Visit <https://www.docker.com/>, download it, and install it as you normally would.
* Open Docker and follow the app’s instructions to start it as recommended.

<figure><img src="/files/05BWqLR2y2s8mnzJZNYz" alt="" width="375"><figcaption><p>Docker will be run in the background</p></figcaption></figure>

{% hint style="info" %}
You can close Docker if you’re not using Semantic Clustering version 2 anymore.
{% endhint %}

#### Switch to Version 2

**Step 1:** Go to Settings > Services from the left sidebar.

<figure><img src="/files/dxBbgqcN3jOYdhvhv537" alt="" width="375"><figcaption><p>Settings > Services</p></figcaption></figure>

**Step 2:** Select **Version 2** from the dropdown and click the Save button.

<figure><img src="/files/MvKrvyX7xCK18tTOdMOv" alt=""><figcaption><p>Select "Version 2" option</p></figcaption></figure>

**Step 3:** Open the Semantic Clustering tool as you normally would. You’ll notice a new field called “**Embedding Mode**l”. Simply choose a model from the dropdown based on your language to start clustering keywords.

<figure><img src="/files/sdmM1ugzAjQ2ZNDjb0Ty" alt=""><figcaption><p>Select an ebmedding model from dropdown.</p></figcaption></figure>

No more complicated setups or manual downloads! SEO Utils will automatically download the model and **cache it** for future use, so you won’t need to wait for it to re-download every time.


# SERP Clustering

### How Does the SERP Clustering Tool Work?

SEO Utils will cluster your keywords by scraping the search engine results page (SERP). If two keywords share more than four pages in search engine results (**similar results** on SERP), it will group them into a cluster.

Of course, you can adjust the **similar results number** from 3 to 7; the larger the number, the more relevant keywords are in a cluster.

The advantage of this method is that it leverages Google's ability to discern users' search intent. If Google shows many similar pages for two keywords, it indicates that Google recognizes these keywords as having the same search intent.

The only drawback is that it can be time-consuming for large keyword lists, as scraping SERPs is a detailed and cumbersome task.

### How to Cluster Keywords Using SERP Clustering Tool

There are two main processes when the SERP Clustering tool runs:

1. Scraping SERP data for all keywords.
2. Running the [clustering algorithm](#clustering-algorithm) after scrapping all SERP data.

To get started, head to the SERP Clustering in the left sidebar. Then, click the Cluster Keywords button.

<figure><img src="/files/YX7DnvXpDseGXLNlOzFZ" alt=""><figcaption><p>Access the SERP Clustering tool in the left sidebar</p></figcaption></figure>

A modal will be opened; it should look like this. We will go over each setting one by one.

<div data-full-width="true"><figure><img src="/files/jI4QhC9OglrwmHcxwN8l" alt=""><figcaption><p>SERP Clustering modal</p></figcaption></figure></div>

#### Keyword Files

SERP Clustering tool that lets you upload multiple files. It automatically combines the keywords and removes any duplicates. No need to mess with Excel anymore. This will save you some time.

After uploading files, you need to map the columns

* **Keyword column:** This column is required.
* **Search Volume column:** This is optional. You can map your external search volume, so you don't have to re-check the search volume for your keywords.

To map columns, click on the Column dropdown.

<figure><img src="/files/9IjmGhYNykFrj9IFk0jI" alt=""><figcaption><p>Map the keyword column</p></figcaption></figure>

{% hint style="info" %}
SEO Utils also automap columns if your files have a guessable column name.
{% endhint %}

{% hint style="success" %}
**Updated:** Since version 1.6.0, you can also map CPC and search intents columns.
{% endhint %}

#### Location / Language

Select the location that you want to target and the language of your keyword lists. SEO Utils uses this field for checking keyword search volume in most cases.

#### Geo Target (Optional)

This field allows for more precise geotargeting when scraping SERP. You can type a specific location like a city, country, etc.

<figure><img src="/files/RHriVTvqb9o7K9Lufsv6" alt=""><figcaption><p>You can type a city name like Seattle</p></figcaption></figure>

{% hint style="info" %}
When using this field, SEO Utils will ignore the location that you selected from the **Location / Language** field.
{% endhint %}

#### Desktop Devices

SEO Utils will check search results for desktop devices. If you want to check for mobile devices, please disable this setting.

#### Check Keyword Metrics

SEO Utils will use DataForSEO to check keyword metrics. This helps determine the **primary keyword** for a cluster, so it's recommended to enable this setting.

However, if your uploaded files already have search volume data and you mapped the Volume or CPC column, you can turn off this setting to save money.

{% hint style="info" %} <mark style="color:blue;">**Tip**</mark>: If your uploaded files don't have enough search volume data for all keywords, you can turn on the "Check Search Volume" field. SEO Utils only check the search volume for **keywords that are missing data**.
{% endhint %}

#### Cluster Strategy

When setting the primary keyword for clusters, SEO Utils will use the keyword that has the most search volume in a cluster, however, some users have mentioned that setting the primary keyword for a cluster based on Cost Per Click (CPC) provides better results when your keywords are transactional or commercial. You can now select the Cluster Strategy to use CPC instead.

<figure><img src="/files/esGsFKc6TENM8nGUkViJ" alt=""><figcaption><p>Using CPC to set the primary keyword for clusters.</p></figcaption></figure>

#### Clustering Algorithm

Since [version 1.30.0](https://help.seoutils.app/changelog#v1.30.0), SEO Utils offers three different clustering algorithms to suit different needs:

<figure><img src="/files/vPmOC4auVzeVuWWuOxWt" alt=""><figcaption><p>Select the clustering algorithm that best fits your needs</p></figcaption></figure>

**Default Algorithm**

* Groups keywords if they share X URLs with the primary keyword (highest search volume/CPC)
* Creates broader topic clusters
* Best for content hubs and category planning
* Fastest processing speed

**Strict Algorithm**

* Groups keywords only if ALL keywords in the cluster share X URLs with each other
* Creates very tight, highly relevant clusters
* Best for precise content targeting
* **Limitation**: May result in many single-keyword clusters due to "first-mover advantage"

**Balanced Strict Algorithm**

* Solves the Strict algorithm's limitation by using progressive thresholds
* Small clusters (2-5 keywords): requires 100% match (like Strict)
* Medium clusters (6-10): requires 80% match
* Large clusters (11+): requires 60% match
* **Why it's needed**: Prevents clusters from becoming "too strict" as they grow larger
* Best balance between quality and natural cluster growth

{% hint style="info" %} <mark style="color:blue;">**Why Balanced Strict was created**</mark>: The original Strict algorithm has a "first-mover advantage" problem where early keywords easily join clusters, but later keywords struggle to match ALL members in larger clusters. This often results in many single-keyword clusters. Balanced Strict solves this by relaxing requirements as clusters grow, allowing natural expansion while maintaining quality.
{% endhint %}

{% hint style="info" %} <mark style="color:blue;">**How to Choose**</mark>:

* **Default**: When you need broad topic grouping or have 100,000+ keywords
* **Strict**: When you need very precise clusters for competitive niches
* **Balanced Strict**: When you want quality clusters that can still grow naturally (recommended for most users)
  {% endhint %}

**Processing Time Comparison**

The more advanced algorithms take longer to process due to additional quality checks:

| Dataset Size     | Default Algorithm | Strict/Balanced Strict | Time Difference |
| ---------------- | ----------------- | ---------------------- | --------------- |
| 1,000 keywords   | 1-2 seconds       | 3-5 seconds            | 2-3x slower     |
| 10,000 keywords  | 5-10 seconds      | 15-30 seconds          | 2-3x slower     |
| 50,000 keywords  | 1-2 minutes       | 5-10 minutes           | 3-5x slower     |
| 100,000 keywords | 5-10 minutes      | 20-40 minutes          | 4-5x slower     |

{% hint style="warning" %} <mark style="color:orange;">**Performance Note**</mark>: Strict and Balanced Strict algorithms require more processing time but produce higher quality clusters. For very large datasets (100,000+ keywords), consider using the Default algorithm or breaking your keywords into smaller batches.
{% endhint %}

{% hint style="success" %}
SEO Utils' clustering algorithm is designed to handle large-scale keyword datasets efficiently. You can cluster between 50,000 to 200,000 keywords at once—a capability not many tools on the market offer. Most other tools typically allow clustering of only 5,000 to 10,000 keywords at a time.
{% endhint %}

#### Similar Results on SERPs

The value range is from **3 to 7**. For example, if you set this field to 4, SEO Utils will group 2 keywords into a cluster if they have at least **4 common URLs on SERPs**. The larger the number, the more relevant keywords are in a cluster.

{% hint style="info" %} <mark style="color:blue;">**Tip**</mark>: The recommended value is 4, but you are free to test a different value by using the ["Re-cluster keywords" button](#re-cluster-keywords).
{% endhint %}

#### Use Saved SERP Data For X Days

<figure><img src="/files/p1pvcmMCzFDxDJ5VUyfZ" alt=""><figcaption></figcaption></figure>

Enter the number of days you wish to use previously saved SERP data. By setting this duration, you can speed up the clustering process and save money as SEO Utils will reuse existing data without the need to re-scrape.

Choose a number that best balances freshness of data with processing speed.

Set '0' to always scrape fresh SERP data.

{% hint style="info" %} <mark style="color:blue;">**Tip**</mark>: This field is a great method for testing **Similar Results on SERPs** value since you don't have to re-scrape SERP data for all keywords.
{% endhint %}

#### Scrape SERP With

<figure><img src="/files/yqnmjBqLfoQJiuMMdSen" alt=""><figcaption><p>Select a method to scrape SERP</p></figcaption></figure>

There are 3 options for now:

* **My IP:** SEO Utils use your IP to scrape SERP data. This is not recommended if you have over 100 keywords.
* **Proxies:** Use proxies to scrape SERP data. See how to set up a proxy [here](/guide/how-to-use-proxies).
* **SERP API: DataForSEO:** Use SERP API from DataForSEO to scrape SERP data.

We will focus on Proxies & SERP API, so you can determine which method is best fit for you.

**SERP API Method**

DataForSEO provides a reliable API to scrape SERP data with 3 modes:

<figure><img src="/files/HmaIyiAZXmyAnPD22zgo" alt=""><figcaption><p>3 modes</p></figcaption></figure>

Since the Live mode is expensive, so SEO Utils doesn't support it. After selecting the SERP API method, you will able to select the mode in the **Priority** field.

<figure><img src="/files/PE0h2xSHFVon7wm61x4r" alt=""><figcaption><p>Select a mode</p></figcaption></figure>

I recommend using the **normal execution priority (Standard Queue)** option. I have tested to cluster 2,000 keywords, and it only took about 12 minutes to finish all processes. [See the video here](#video-running-serp-clustering-on-2-000-keywords-with-serp-api).

It only costs **$0.6 to scrape SERP & cluster 1,000 keywords**. This rate is much cheaper when compared to other tools on the market, which usually cost **$7-$12 for 1,000 keywords**.

Yes, you read that right! It's 11 times cheaper:v:.

{% hint style="info" %}
In v1.21.0, I added a cost estimation tool for the SERP API, allowing you to see the actual cost after deducting keywords that use saved SERP data. Please [click here](#cost-estimation-tool-for-serp-api-method) to learn more about it.
{% endhint %}

{% hint style="warning" %}
**Important:**

To use the SERP API, you must have your own DataForSEO account. [Renting API key services](/guide/rent-dataforseo-api-key) isn't viable because DataForSEO restricts certain endpoints that I utilized to implement the Queue mode. If multiple users rely on a rented API key from my account, it will slow down the process for everyone. For the quickest results, using your own DataForSEO account is the best approach.
{% endhint %}

**Proxies Method**

If you need to cluster 1 million keywords per month, using the SERP API Method would indeed be costly, amounting to $600.

This is where the Proxies method becomes valuable. By using your own proxies, you can significantly reduce the costs associated with such large-scale keyword clustering.

You can pay about **$80-$100** per month for a rotating residential proxy and you can cluster **millions of keywords**.

However, this method has more fields to set up.

<figure><img src="/files/DPuQITGXepRggHtch0Fh" alt=""><figcaption><p>3 important fields for Proxies method</p></figcaption></figure>

**Workers**

This is the number of concurrent requests SEO Utils will scrape SERP. You can enter from 1-50. If you have a good proxy provider, you can set it to 50 (my setting), so SEO Utils can send 50 requests in one second to scrape SERP data. This will increase the clustering process a lot.

If you are unsure about your proxy quality, go with 5-10 workers first.

**Request Delay**

Enter the number of seconds you wish to have between each request to scrape SERP data for keywords. The more delay time you set, the slower the process will be, but it will help you avoid being blocked by Google.

Set '0' to scrape SERP data without any delay.

{% hint style="success" %}
For example, if you set **Workers** to 10 and **Request Delay** to 1 second. SEO Utils will send 10 requests and then sleep for one second before sending another 10 requests.
{% endhint %}

**Back-off Time**

Enter the number of seconds you wish to wait before retrying the failed scraping request. SEO Utils retries the request up to 3 times before skipping a keyword. The more back-off time you set, the slower the process will be, but it will help you avoid being blocked by Google.

{% hint style="success" %}
For example, if you set **Workers** to 10, **Request Delay** to 1 second, and **Back-off Time** to 2 seconds. SEO Utils will send 10 requests and then sleep for one second before sending another 10 requests.\
\
However, while processing, if one request in 10 requests is failed, it will sleep for **2 seconds (back-off time)** before retrying the failed request.
{% endhint %}

{% hint style="info" %}
SEO Utils will retry a maximum of **three times** before skipping scraping a keyword. That keyword will end up with no SERP data.
{% endhint %}

{% hint style="info" %}
If you set the **Back-off Time** to '0', SEO Utils will use the default back-off time:

* 1 second for the 1st attempt
* 2 seconds for the 2nd attempt.
* 3 seconds for the 3rd attempt.
  {% endhint %}

Feel free to experiment with different settings for your proxies and usage. When testing these settings, as long as you don't encounter a "Too Many Requests" error message, it should indicate that your setup is functioning correctly.

\
Since SEO Utils automatically retries each request up to three times, you might see a message like:

`Attempt 1 failed to scrape SERP for keyword 'keyword': failed to visit URL: Too Many Requests.`

Don't worry if you see this message. SEO Utils will try two more times, so everything is still fine unless you see a failure message on the third attempt.

| SERP API                                                | Proxies                                                |
| ------------------------------------------------------- | ------------------------------------------------------ |
| Use when clustering **thousands** of keywords per month | Use when clustering **millions** of keywords per month |
| Less configuration and testing                          | More configuration and testing                         |

### Re-cluster Keywords

After clustering keywords, you can visit the report and re-cluster keywords.

<figure><img src="/files/zuKL9LgSy3BHLgiS3dgE" alt=""><figcaption><p>Click the Re-cluster Keywords button to re-cluster all keywords in the report</p></figcaption></figure>

You might need to re-cluster keywords in the following situations:

* When testing the **Similar Results field on SERPs** field.
* If you're adding more keywords to a report and need to cluster them with existing ones.
* To monitor the clusters before and after Google Core Updates to observe any impact.
* If some keywords are missing SERP data because some SERP scraping requests were failed.

SEO Utils will show this message if some keywords in your report are missing SERP data, so you know to re-run the clustering process.

<figure><img src="/files/tL4goDUrT3BnvZqus8vz" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
When re-clustering keywords, make sure you use the "[**Use Saved SERP Data For X Days**](#use-saved-serp-data-for-x-days)" field. This ensures that SEO Utils won't re-scrape SERP data, saving time and resources.
{% endhint %}

#### Distribute Keywords into Existing Clusters (Available since v1.16.0)

When re-clustering keywords, you'll be able to distribute new and non-clustered keywords into existing clusters, rather than rebuilding all clusters from scratch.

This is particularly useful if you've already used clusters to create articles on your website and you just want to add new keywords to existing articles (clusters).

A **"New" badge** will highlight these newly added keywords, and a **"Run #" label** will indicate which clustering run they were added in.

<figure><img src="/files/gGV1BNvA526Fwuv8LfaH" alt=""><figcaption><p>Enable the setting to distribute keywords into existing clusters</p></figcaption></figure>

<figure><img src="/files/go1z9X4JEVrbP7Ns0sOE" alt=""><figcaption><p>The "New" badge will help you determine the latest keywords just added to a cluster.</p></figcaption></figure>

### Analyzing SERP

After clustering your keywords, you can analyze the SERPs of the clustered keywords to see how your competitors are performing. This analysis can show you their monthly traffic, the keywords they rank for, and how many backlinks they have.

<figure><img src="/files/XzsGdI6uE5GW6DxbIjpR" alt=""><figcaption><p>Click the vertical three dots icon to start analyzing SERP</p></figcaption></figure>

You can choose the type of metric and specify the number of URLs on the SERP for each keyword you want to run the analysis for.

<figure><img src="/files/18IX6cdsYJAj3EgdJUpr" alt=""><figcaption><p>Analyze SERP for selected keywords</p></figcaption></figure>

After analysis, you can click on a keyword to view the SERP data with all metrics including traffic, backlinks, referring domains, spam score, keywords, etc for that keyword.

<figure><img src="/files/NWcuDWAQNjRz3XrWNgAN" alt=""><figcaption><p>SERP data for the keyword "vodka cocktails," including backlinks and traffic data</p></figcaption></figure>

The analyzed data is also included in the exported file under the second tab labeled "SERP Data."

<figure><img src="/files/FaSpIaoU2aWCSnLx8fT0" alt=""><figcaption><p>All backlinks &#x26; traffic data are included in the SERP data sheet</p></figcaption></figure>

### Ranking Data

You can add a target domain to a SERP Clustering report. This will show you the ranking data of that domain across all clusters, helping you identify which clusters you are ranking well in and which ones need improvement. This feature allows you to prioritize your efforts to boost your rankings effectively.

<figure><img src="/files/YGUFTj1tWPM0l8s4CpGu" alt=""><figcaption><p>Ranking data will be shown in the table after adding a target domain</p></figcaption></figure>

When viewing the SERP of a keyword, the target domain will be marked in green color.

<figure><img src="/files/TqMhf5LWCHKP3KPw3HNU" alt=""><figcaption><p>Target domain in SERP table</p></figcaption></figure>

{% hint style="success" %}
**Tip:** You can also change the target domain to a competitor's domain to see how well they are performing across different clusters. This can help you identify their strengths and areas where you might have an advantage.
{% endhint %}

SEO Utils also provides some metric cards to show you the cluster's key ranking data at a glance:

* View and filter the number of ranking clusters.
* View and filter the number of clusters without rankings.
* See and filter the rank distribution across clusters.

<figure><img src="/files/LNFsIPMmakNfbNEPEKlR" alt=""><figcaption><p>Metric cards and filters</p></figcaption></figure>

You can watch the video below to see the "Ranking Data" feature in action.

{% embed url="<https://drive.google.com/file/d/1se5GGf6U5Fzrhuv3GlZBAzPCrSBMlG25/view?usp=drive_link>" fullWidth="true" %}

### Cost Estimation Tool for SERP API Method

When using the SERP API to scrape SERP data, you can click the “Estimate Cost” button to view the actual cost. SEO Utils will read all keywords in your uploaded file, remove duplicates, and exclude keywords that already have saved SERP data, providing you with an accurate final cost.

In the screenshot below, I uploaded over **18,000 keywords** and used SERP data from the past 7 days. The cost came to just **$0.0390**, saving me **$11.2470**! SEO Utils only sent **65 keywords** to the SERP API for new data, as most of the keywords already had recent SERP data within 7 days.

<figure><img src="/files/AVZTBwZv79UoSvLGP9y3" alt=""><figcaption><p>Cost estimation tool for SERP API.</p></figcaption></figure>

### Video Running SERP Clustering on 2,000 keywords with SERP API

{% embed url="<https://drive.google.com/file/d/1UJr9PD-t2XNjRmaKL1VP840XajQoStV7/view?usp=sharing>" %}
Demo on clustering 2000 keywords
{% endembed %}


# SERP Extractor

SERP Extractor lets you extract Google search results for your keywords and analyze the competitor URLs found in those results. Use it to evaluate competitor strength, find keyword opportunities with weak competition, and export the data for further analysis.

<div data-full-width="true"><figure><img src="/files/5pR10orBEaXVQhA1hm0h" alt=""><figcaption><p>SERP Extractor</p></figcaption></figure></div>

## How It Works

The SERP Extractor follows a three-step workflow:

1. **Extract SERPs** — Scrape Google search results for each keyword to collect the top-ranking URLs.
2. **Analyze SERP URLs** — Run bulk analysis on the extracted URLs to get backlink and traffic metrics (Page Rank, Domain Rank, Backlinks, Referring Domains, Organic Traffic, Organic Keywords).
3. **Filter & Explore** — Use the SERP Item filter to find keywords where competitors match specific metric criteria, then drill into the expanded view to see individual SERP items with highlighted matches.

## Creating a Report

{% stepper %}
{% step %}
**Navigate to SERP Extractor**

Go to **SERP Extractor** in the sidebar and click the **"Extract SERPs"** button.
{% endstep %}

{% step %}
**Enter Keywords**

Type or paste your keywords into the text area, one keyword per line.

<figure><img src="/files/hctNhRBkezM8lj4i4BHx" alt=""><figcaption><p>Enter keywords to extract SERP data</p></figcaption></figure>
{% endstep %}

{% step %}
**Configure Settings**

* **Location & Language** — Select the country and language for the search results.
* **Geo Target** (optional) — Narrow results to a specific city or region for localized SERPs.
* **Desktop Device** — Toggle on for desktop results, toggle off for mobile results.
* **SERP Depth** — Choose how many top results to extract per keyword (10 to 100).
  {% endstep %}

{% step %}
**Select Scraping Method**

Choose how SEO Utils will scrape Google search results:

| Method              | Best For                                | Notes                                                                             |
| ------------------- | --------------------------------------- | --------------------------------------------------------------------------------- |
| Own IP              | Small batches (under 100 keywords)      | Request delay must be at least 3 seconds                                          |
| Proxies             | Large-scale extraction (thousands+)     | Requires proxy configuration. See [How to Use Proxies](/guide/how-to-use-proxies) |
| DataForSEO SERP API | Reliable extraction without proxy setup | Requires a DataForSEO account                                                     |

When using **Proxies**, you can configure **Workers** (concurrent requests), **Request Delay**, and **Back-off Time** — similar to the [SERP Clustering](/guide/serp-clustering) tool.

When using **DataForSEO SERP API**, you can choose between normal and high execution priority, and view a cost estimate before starting.
{% endstep %}

{% step %}
**Start Extraction**

Click **"Extract SERPs"** to begin. You will be redirected to the report detail page where you can monitor the progress.
{% endstep %}
{% endstepper %}

## Report Detail Page

After extraction completes, the report detail page shows a table of all keywords. If keyword metrics have been checked, you will also see Search Volume, Trend, Keyword Difficulty, and CPC columns.

<figure><img src="/files/l42NuiWscwgFgKP8K8pJ" alt=""><figcaption><p>SERP Extractor report detail showing keywords with their metrics</p></figcaption></figure>

## Analyzing SERP URLs

After extracting SERPs, you can analyze the URLs found in search results to get backlink and traffic data for each competitor page.

{% stepper %}
{% step %}
**Analyze All SERPs**

Click the **"Analyze All SERPs"** button in the top-right corner of the report detail page. Select which analysis types to run (backlinks, traffic, or both) and click **"Analyze SERP"**.

You can click **"Estimate Cost"** to see the DataForSEO cost before starting.

<figure><img src="/files/5p8fnsHl0wbYXdfqanU4" alt=""><figcaption><p>Analyze all SERPs with cost estimation</p></figcaption></figure>
{% endstep %}

{% step %}
**Analyze Selected Keywords**

Alternatively, select specific keywords using the checkboxes, then use **Bulk Actions > Analyze SERP** to analyze only the selected keywords.

<figure><img src="/files/o00mxZxoTtrKIQZAav3s" alt="" width="563"><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

{% hint style="info" %}
Analysis runs in the background. You'll see a notification when it completes.
{% endhint %}

## Checking Keyword Metrics

To get search volume, keyword difficulty, and CPC data for your keywords:

1. Select the keywords you want to check using the checkboxes.
2. Click **Bulk Actions > Check Keyword Metrics**.
3. Review the cost and click **"Execute"**.

{% hint style="info" %}
DataForSEO won't charge you for keywords that don't have search volume data, so the actual cost will be lower than the estimation.
{% endhint %}

## Viewing SERP Items

Click the **eye icon** on any keyword row to expand it and see the individual SERP items (competitor pages) for that keyword.

The expanded view shows the following metrics for each URL:

| Column    | Description                                                                                 |
| --------- | ------------------------------------------------------------------------------------------- |
| Pos       | Position in Google search results                                                           |
| Page      | The URL and page title                                                                      |
| PR        | Page Rank (0–1000) — the authority score of the specific page based on its backlink profile |
| DR        | Domain Rank (0–1000) — the authority score of the root domain                               |
| Backlinks | Total number of backlinks pointing to the page                                              |
| RD        | Referring Domains — number of unique domains linking to the page                            |
| Traffic   | Estimated monthly organic traffic to the page                                               |
| Keywords  | Number of organic keywords the page ranks for                                               |

{% hint style="info" %}
PR and DR scores range from 0 to 1000, where 0 means no backlinks and 1000 indicates extensive quality backlinks. Higher scores require exponentially more effort to achieve.
{% endhint %}

<figure><img src="/files/VZLzyoWC3vRRFZzpuOBI" alt=""><figcaption><p>Expanded SERP items showing competitor metrics with tooltips on column headers</p></figcaption></figure>

## Filtering by SERP Item Metrics

The **SERP Item** filter is one of the most powerful features. It lets you filter keywords based on the metrics of their competitor pages — helping you find opportunities where competition is weak.

### How It Works

Click the **"SERP Item"** filter button in the toolbar to open the filter popover.

<figure><img src="/files/EnYLY5eF6epLzzLhlP2o" alt=""><figcaption><p>SERP Item metric filter with range inputs for each metric</p></figcaption></figure>

### Filter Settings

| Setting      | Description                                                                                           |
| ------------ | ----------------------------------------------------------------------------------------------------- |
| Condition    | **AND** — a SERP item must match all metric ranges. **OR** — matching any single metric range counts. |
| Min. results | The minimum number of SERP items that must match for the keyword to appear.                           |
| Page Rank    | Filter by page authority score (0–1000).                                                              |
| Domain Rank  | Filter by domain authority score (0–1000).                                                            |
| Backlinks    | Filter by number of backlinks.                                                                        |
| Ref. Domains | Filter by number of referring domains.                                                                |
| Traffic      | Filter by estimated monthly organic traffic.                                                          |
| Keywords     | Filter by number of organic keywords.                                                                 |

Each metric has a **From** and **To** field. Leave a field empty to skip that bound.

### Example Use Cases

**Find keywords with weak competitors:**

* Set **Domain Rank** to 0–200, **Backlinks** to 0–100, **Condition** to AND, **Min. results** to 3
* This shows keywords where at least 3 of the top results have low page authority and few backlinks

**Find keywords with high-value SERPs:**

* Set **Traffic** from 10000, **Condition** to OR, **Min. results** to 1
* This shows keywords where at least one competitor gets significant organic traffic

### Highlighting

When a SERP Item filter is active and you expand a keyword row, matching SERP items are highlighted:

* **Row highlight** — Rows where all active conditions match (with AND) or any condition matches (with OR) get a colored background.
* **Cell highlight** — Individual metric cells that match their respective filter range are shown in green.

This makes it easy to quickly spot which competitors meet your criteria.

<figure><img src="/files/asBpqnWPVl0jIDIkT9h2" alt=""><figcaption><p>Expanded SERP items with filter highlighting showing matched metrics in green</p></figcaption></figure>

## Exporting to CSV

Click the **"Export CSV"** button in the top-right corner to download the report data. The export includes all keywords with their metrics and SERP item data.

## Best Practices

* **Start with extraction, then analyze** — Extract SERPs first, review the results, then run the analysis only on the keywords you care about to save costs.
* **Use the SERP Item filter to find opportunities** — Look for keywords where multiple competitors have low Page Rank and few backlinks — these are easier to rank for.
* **Combine keyword and SERP filters** — Use Volume and KD filters alongside SERP Item filters to find high-volume, low-competition keywords.
* **Use OR condition for broad discovery** — Switch to OR when you want to cast a wider net and find keywords where any single metric condition is met.
* **Check Min. results carefully** — Setting a higher minimum (e.g., 3–5) ensures the weak competition pattern is consistent across multiple results, not just one outlier.


# Rent DataForSEO API Key

Using DataForSEO's API has a major drawback: a required monthly fee of $100 to use their Backlinks API. SEO Utils has introduced a solution to this problem. We offer a feature where you can rent a DataForSEO API Key, eliminating the need for the monthly fee.

You simply purchase credits of $10, $20, or $50 and pay as you go. The best part? These credits never expire.

### How to Purchase Credits?

**Step 1:** Visit <https://app.seoutils.app/register> and register an account. You will need to verify your email address.

**Step 2:** After logging in, click the user dropdown in the top-right corner and select "Purchase Credits."

<figure><img src="/files/UFOS31iYqa1dFkasUbeB" alt="" width="375"><figcaption><p>Click Purchase Credits</p></figcaption></figure>

**Step 3:** Select the credit package that you would like to purchase and click the "Purchase" button. You will be redirected to the checkout page.

<figure><img src="/files/MKdBRRvWGjpEroHlBzRA" alt=""><figcaption><p>Select a credit package</p></figcaption></figure>

### How to Access Backlinks API on SEO Utils by Using Credits?

To access the Backlinks API, you will need an SEO Utils API Key.

**Step 1:** Visit <https://app.seoutils.app/> and click the user dropdown in the top-right corner and select "API Tokens".

<figure><img src="/files/2F8J7ZgEIz29OMSPHTEP" alt="" width="375"><figcaption><p>Select "API Tokens" menu item.</p></figcaption></figure>

**Step 2:** Enter the "Token Name" and ensure that you check the "Backlink" permission so that the Token can have access to the Backlinks API.

<figure><img src="/files/Sc02wWbzE6aGrDkJqQpY" alt=""><figcaption><p>Enter Token Name</p></figcaption></figure>

**Step 3:** Click on the "Create" button, and the system will display the API Token. Copy the token before clicking the "Close" button, as the token will never be displayed again.

<figure><img src="/files/c6rRVeDvvuSe2lKvWn1F" alt=""><figcaption><p>Copy the API Token</p></figcaption></figure>

**Step 4:** Open the SEO Utils app on your machine (Ensure that it is version 1.1.0 or newer). Go to the Settings page.

<figure><img src="/files/KEbq2GGVdbwp6O19lerU" alt="" width="365"><figcaption><p>Go to Settings page in SEO Utils app</p></figcaption></figure>

**Step 5:** Scroll down to the "**Renting DataForSEO API Key**" section. You will see the API Key input.

<figure><img src="/files/7Z0bEPD1wliDTCs1UKmM" alt=""><figcaption><p>Enter the API Key</p></figcaption></figure>

Paste the API token that you already copied in Step 3 into that input and make sure you check the **Backlink API** on the "**Use On**" field, so the app will know that you would like to use the API token for the Backlink API, not your DataForSEO account. Click the "Save" button.

Now you can access the Backlinks API of DataForSEO without paying the $100 monthly commitment.

{% hint style="info" %}
You can use the API token on multiple devices, or you can create multiple API tokens for multiple devices.
{% endhint %}

{% hint style="warning" %}
You cannot use the sandbox mode when using an API token to access the Backlinks API.
{% endhint %}

You can also delete an API Token by clicking the "Delet&#x65;**"** button.

<figure><img src="/files/tLHm8szGGjdNow5xXaK8" alt=""><figcaption><p>Delete API Token</p></figcaption></figure>

### View Credit Transactions

You can view all credit transactions by clicking the Transactions menu from the user dropdown menu.

<figure><img src="/files/FmHpvkD7ub8pQR9To2GU" alt="" width="360"><figcaption><p>View Transactions</p></figcaption></figure>

Use the "Type" filter to show the In/Out transactions. You can even search the transaction by "Note" or "Transaction ID".

<figure><img src="/files/96e6QQkDeV9frXYaJy9E" alt=""><figcaption><p>View All Credit Transactions</p></figcaption></figure>

{% hint style="success" %}
You can also [share the data](/guide/data-sharing-with-s3) with your teammates so that they can access the same information without incurring any extra fees.
{% endhint %}

### Why Do I Have to Pay $10.89 to Get $10?

While building this feature, I always wanted to keep the price as low as possible, so you will have seamless access to the Backlinks API. However, I have to pay the credit fee, server cost, API maintenance fee, etc., so you have to pay a little extra. Here is the breakdown:

* Stripe charges 2.9% + 30¢ per successful card charge.
* Stripe charges 0.5% per transaction when registered to collect taxes.
* SEO Utils charges 2.5% per transaction to maintain API and server.

### Updated Dec 27, 2023: Added API Endpoints for Traffic & Keyword Tools

Before December 27, 2023, SEO Utils only supported the Backlinks API for the renting service. However, now you can use credits from SEO Utils to pull traffic and keyword data.

<figure><img src="/files/SMiah2LnQ3bxoU6jw1Mx" alt=""><figcaption><p>Settings page</p></figcaption></figure>

{% hint style="info" %}
Make sure your **old API Key** has "**traffic-keyword"** permission on <https://app.seoutils.app/> (the new API Key will be included by default).

<img src="/files/aPhjlLaiTaTxxucDcaf7" alt="" data-size="original">
{% endhint %}


# S3 Cache for DataForSEO Data

SEO Utils can cache DataForSEO API responses using S3-compatible storage, so your teammates can access the same data without paying any extra fees.

For example, if you check the backlink data of site A, SEO Utils will upload that data to your S3 bucket. When your teammate also checks the backlink data for that site, it will pull data from S3 instead of requesting the DataForSEO API.

{% hint style="info" %}
S3 cache supports **AWS S3** (Recommended), **Cloudflare R2**, **DigitalOcean Spaces**, **MinIO**, and any other S3-compatible storage service.
{% endhint %}

{% hint style="success" %}
**S3 is the third of three cache tiers.** Each search first checks your in-memory cache, then your local SQLite database, then S3, and only then calls the DataForSEO API. See [Recent Searches & Cache](/guide/recent-searches-and-cache) for details on the local tiers and the search history list.
{% endhint %}

## Setting Up S3 Cache

{% stepper %}
{% step %}
**Create a Bucket**

{% tabs %}
{% tab title="AWS S3 (Recommended)" %}

1. Log in to [AWS Console](https://console.aws.amazon.com/)
2. Go to **S3** → **Create bucket** (search "S3" in the header search bar if you can't find it)
3. Enter a bucket name (e.g., `my-seo-cache`)
4. Select your preferred region (e.g., `us-east-1`)
5. Keep **Block all public access** enabled
6. Click **Create bucket**

<figure><img src="/files/YUlyOtzbolteWYj7RlZu" alt=""><figcaption><p>Create a S3 bucket on AWS</p></figcaption></figure>
{% endtab %}

{% tab title="Cloudflare R2" %}

1. Go to your Cloudflare dashboard
2. Navigate to **R2** and click **Create Bucket**
3. Enter a bucket name and select a location
   {% endtab %}

{% tab title="DigitalOcean Spaces" %}

1. Go to your DigitalOcean dashboard
2. Navigate to **Spaces** and click **Create Space**
3. Select a region and enter a name
   {% endtab %}

{% tab title="MinIO" %}
Run `mc mb myminio/my-seo-cache` from the MinIO client.
{% endtab %}
{% endtabs %}

{% hint style="warning" %}
The bucket should be **private**. SEO Utils authenticates using Access Key and Secret Key — no public access is needed.
{% endhint %}
{% endstep %}

{% step %}
**Get Your Access Credentials**

You'll need an **Access Key ID** and **Secret Access Key** with read/write permissions to the bucket.

{% tabs %}
{% tab title="AWS S3 (Recommended)" %}
**Create an IAM Policy**

1. Go to **IAM** in the AWS Console (search "IAM" in the header search bar)

<figure><img src="/files/xcJYloBo3nntZihqHOry" alt=""><figcaption><p>Search for IAM in the AWS Console</p></figcaption></figure>

2. Go to **Policies** → **Create policy**
3. Select **S3** as the service

<figure><img src="/files/YjAGn75qOmEliPnLQUwb" alt=""><figcaption><p>Select S3 as the service</p></figcaption></figure>

4. Click the **JSON** tab and paste:

```json
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "s3:GetObject",
            "s3:PutObject",
            "s3:DeleteObject",
            "s3:ListBucket"
         ],
         "Resource": [
            "arn:aws:s3:::YOUR-BUCKET-NAME",
            "arn:aws:s3:::YOUR-BUCKET-NAME/*"
         ]
      }
   ]
}
```

5. Replace `YOUR-BUCKET-NAME` with your actual bucket name
6. Click **Next** → Name it `SEOUtilsS3Access` → **Create policy**

**Create an IAM User**

1. Go to **IAM** → **Users** → **Create user**
2. Enter a name: `seo-utils-s3` → Click **Next**
3. Select **Attach policies directly**
4. Search for `SEOUtilsS3Access` and check the box
5. Click **Next** → **Create user**
6. Open the user → **Security credentials** tab
7. Click **Create access key** → Select **Third-party service**
8. Click **Create access key** → **Save both keys**

{% hint style="warning" %}
**Save your keys now.** The Secret Access Key is only shown once. Store it in a password manager.
{% endhint %}
{% endtab %}

{% tab title="Cloudflare R2" %}

1. Go to **R2 > Manage R2 API Tokens** in your Cloudflare dashboard
2. Click **Create API Token**
3. Select **Object Read & Write** permission
4. Copy the **Access Key ID** and **Secret Access Key**
   {% endtab %}

{% tab title="DigitalOcean Spaces" %}

1. Go to **API > Spaces Keys** in your DigitalOcean dashboard
2. Click **Generate New Key**
3. Copy the **Key** and **Secret**
   {% endtab %}
   {% endtabs %}
   {% endstep %}

{% step %}
**Configure S3 Cache in SEO Utils**

Open SEO Utils and go to **Settings > Services**.

Scroll down to the **S3 Cache Settings** section and fill in:

* **Access Key ID** — Your S3 access key
* **Secret Access Key** — Your S3 secret key
* **Bucket Name** — The name of the bucket you created
* **Region** — The region of your bucket (e.g., `us-east-1`). Leave empty or use `auto` for Cloudflare R2
* **Endpoint URL** — Leave empty for AWS S3. For other providers, enter the endpoint URL (e.g., `https://<account-id>.r2.cloudflarestorage.com` for Cloudflare R2)

<figure><img src="/files/Nv9aSXdpSUBk2VBs5XRn" alt=""><figcaption><p>S3 Cache Settings in SEO Utils</p></figcaption></figure>
{% endstep %}

{% step %}
**Test the Connection**

Click the **"Test Connection"** button to verify that SEO Utils can connect to your bucket. You should see a success message.

{% hint style="info" %}
You don't need to save the settings before testing. The Test Connection button uses the values currently entered in the form.
{% endhint %}
{% endstep %}

{% step %}
**Save Settings**

Click the **"Save"** button to save your S3 cache settings.

From now on, every time you pull data from DataForSEO, it will automatically upload the data to your S3 bucket.
{% endstep %}
{% endstepper %}

## Sharing with Your Team

To share cached data with your teammates:

1. Share the **Access Key ID**, **Secret Access Key**, **Bucket Name**, **Region**, and **Endpoint URL** with your team
2. Each teammate enters the same credentials in their SEO Utils app under **Settings > Services > S3 Cache Settings**

Once configured, everyone on the team will read from and write to the same S3 bucket, avoiding duplicate DataForSEO API requests.

## Automatic Cache Cleanup

SEO Utils automatically deletes cached data older than **7 days**, so you always get fresh data. If you want fresh data sooner, you can:

* Click the **"Purge Cache"** button in S3 Cache Settings to delete all cached data from your S3 bucket immediately
* Or delete specific files directly from your S3 bucket
* Click **Refresh** on any DataForSEO result page — this invalidates that specific search's cache on all three tiers (memory, local DB, **and S3**) so teammates also see fresh data on their next visit

{% hint style="info" %}
**Purge Cache vs. Clear Cache & History.** The **"Purge Cache"** button here only affects the shared S3 bucket. The **"Clear Cache & History"** button in the **DataForSEO Local Cache** settings card only affects your local machine. They're intentionally separate so one user can't wipe the team's shared cache by accident. See [Recent Searches & Cache](/guide/recent-searches-and-cache) for the local version.
{% endhint %}

{% hint style="warning" %}
If you delete the S3 bucket or revoke the access credentials, remove them from the SEO Utils settings to avoid errors.
{% endhint %}

## Migrating from Google Drive Cache

If you were previously using Google Drive to cache DataForSEO data, simply configure your S3 cache settings as described above. SEO Utils will start using S3 for all new cache operations. Your old Google Drive cache data will no longer be used.

{% hint style="info" %}
The Google Drive settings in SEO Utils are now only used for [exporting content outlines to Google Docs](/guide/content-struct#setup-google-drive-api-integration). If you don't use that feature, you can remove your Google Drive settings.
{% endhint %}


# Recent Searches & Cache

SEO Utils remembers every DataForSEO search you run across Keyword Explorer, Traffic Analytics, Backlink Analytics, Content Gap, and Backlink Gap. You can re-open past searches in one click, see how fresh the data is, and refresh it when you need the latest numbers — all without paying extra API credits for data you've already pulled.

{% hint style="success" %}
Every search is stored locally in your SQLite database, so your history survives app restarts, machine reboots, and navigation away to other tools. No data leaves your machine unless you've also configured [S3 Cache for DataForSEO Data](/guide/data-sharing-with-s3).
{% endhint %}

## Recent Searches List

Under every DataForSEO tool's search bar, you'll see a **"Recent searches"** card listing your past searches for that tool.

<figure><img src="/files/dlZ5qgU6MN4IQTgbuWP9" alt="" width="563"><figcaption><p>Recent searches list below the Backlink Analytics search bar</p></figcaption></figure>

Each row shows:

* **Target**: the domain, URL, or keyword you searched
* **Context badges**: for Content Gap and Backlink Gap, the number of competitors; for Keyword Explorer, the search engine (Google or Bing)
* **Last accessed**: when you last opened this search

Click any row to re-open it instantly — no API call is made if the data is still cached.

### Managing History

| Action                              | How to do it                                                 |
| ----------------------------------- | ------------------------------------------------------------ |
| **Open a past search**              | Click the row                                                |
| **Delete one entry**                | Hover over the row and click the X that appears on the right |
| **Clear all entries for this tool** | Click the ⋯ menu in the card header → **Clear all**          |
| **Show more entries**               | Click "Show N more" at the bottom (up to 25 rows)            |

{% hint style="info" %}
Only your **100 most recent searches per tool** are kept. Older entries are automatically pruned. Deleting a history row does **not** delete the underlying cached data — re-typing the same search will still hit the cache.
{% endhint %}

## Freshness Widget

While viewing any DataForSEO result page, a small widget anchors to the bottom-right corner showing when the data was last fetched and a Refresh button.

<figure><img src="/files/TlR25zBKruPChP05OOiP" alt=""><figcaption><p>Freshness widget showing "Data updated 14 hours ago" and a Refresh button</p></figcaption></figure>

### Color Coding

The widget changes color to signal how stale the data is:

| Age         | Color                        | Meaning                              |
| ----------- | ---------------------------- | ------------------------------------ |
| Under 1 day | Green                        | Fresh — recently fetched             |
| 1–14 days   | Default (muted)              | Normal working range                 |
| 14–30 days  | Amber                        | Stale — consider refreshing          |
| 30+ days    | Red (with "Stale · " prefix) | Very stale — data is likely outdated |

### Collapsing the Widget

Click the chevron (›) to collapse the widget into a small clock icon. Click the icon to expand it again. Your preference is remembered across sessions and tools.

<figure><img src="/files/42Dm3G0jKTatctiMlltl" alt="" width="323"><figcaption><p>Collapsed widget shown as a small clock icon in the bottom-right corner</p></figcaption></figure>

## Refresh Button

Clicking **Refresh** forces a fresh fetch from the DataForSEO API, bypassing all caches (local memory, local database, and your S3 shared tier if configured).

### How Refresh Works Across Tabs

Backlink Analytics and Traffic Analytics have multiple tabs for the same target (Overview, Backlinks, Referring Domains, Organic Keywords, etc.). When you click Refresh on any tab:

{% stepper %}
{% step %}
**All tabs' cached data is invalidated**

The cache is wiped for **every tab** of that target — Overview, Backlinks, Referring Domains, Anchor Texts, Competitors, Organic Keywords, etc. If you have the S3 shared cache configured, matching S3 objects are also removed so your teammates see fresh data on their next visit.
{% endstep %}

{% step %}
**Only the current tab re-fetches immediately**

To save API credits, only the tab you're currently viewing actively re-fetches.
{% endstep %}

{% step %}
**Other tabs re-fetch lazily on visit**

When you switch to another tab (e.g., from Overview to Backlinks), that tab will hit the API because its cache is empty. This avoids spending credits on tabs you don't actually open.
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
Refreshing a paginated result resets pagination to page 1 and refetches only page 1. Other pages are re-fetched individually when you navigate to them.
{% endhint %}

## Settings

Go to **Settings > Services** and scroll to the **DataForSEO Local Cache** section.

<figure><img src="/files/aRKRhQDgxCM5w5kuKnp9" alt=""><figcaption><p>DataForSEO Local Cache settings card with stats and Clear button</p></figcaption></figure>

The card shows:

* **Cached responses** — how many API responses are stored locally
* **Search history entries** — how many distinct past searches are in your history list
* **Storage used** — approximate disk footprint

### Auto-invalidate Cache After X Days

Set how long cached DataForSEO responses are kept in your local database before they are removed and refetched from the API on the next request. The default is **14 days**.

| Value                                          | Behavior                                                                                                                             |
| ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| **Any positive number** (e.g. `7`, `14`, `30`) | Cached responses older than this many days are removed automatically. Cleanup runs hourly while the app is open and once at startup. |
| **`0`**                                        | Auto-cleanup is disabled. Cached responses are kept indefinitely until you click **Clear Cache & History** below.                    |

{% hint style="info" %}
Only the **cached responses** are removed — your "Recent searches" list is preserved. Clicking a history entry whose cache has expired triggers a fresh API request and rebuilds the cache automatically.
{% endhint %}

{% hint style="warning" %}
This setting only affects your **local** database. The shared S3 cache (if configured) is governed by its own 7-day rolling cleanup and is unaffected.
{% endhint %}

### Clear Cache & History

The **Clear Cache & History** button removes every cached response and every search history entry from your local database at once. Use it if you want a completely clean slate — the next time you use any DataForSEO tool, data will be fetched fresh from the API.

{% hint style="danger" %}
This action cannot be undone. Any future searches that would have hit the cache will consume API credits instead.
{% endhint %}

## Relationship with S3 Cache

If you've set up [S3 Cache for DataForSEO Data](/guide/data-sharing-with-s3), it works alongside the local cache as a third tier:

| Tier          | Storage                                                | Who sees it                               |
| ------------- | ------------------------------------------------------ | ----------------------------------------- |
| Memory        | RAM (24h)                                              | You only, this session                    |
| Local DB      | Your SQLite file (14-day TTL by default, configurable) | You only, persists across restarts        |
| S3 (optional) | Your configured S3 bucket (7-day TTL)                  | You + teammates with the same credentials |

When a tool needs data, SEO Utils checks the tiers in order and falls through to the DataForSEO API only if all tiers miss.

{% hint style="info" %}
**Clear Cache & History** in this card only affects your **local** tiers. To clear the shared S3 cache, use **Purge Cache** in the S3 Cache Settings card instead.
{% endhint %}

## Tips

* **Let the widget guide your refresh habits.** If it's green, your data is fresh; if it's amber or red, consider refreshing before drawing conclusions.
* **Collapse the widget** if you prefer more screen space — the clock icon still shows the age via tooltip on hover.
* **Use history instead of re-typing** a domain. Clicking a history row reloads instantly and won't burn API credits on cached pages.
* **Tune the auto-invalidate setting** to match how often you need fresh data. Lower it (e.g., 3–7 days) if you track fast-moving competitors, or raise it (e.g., 30 days) if you mostly review historical reports and want to minimize API usage.
* **For team workflows**, pair this with [S3 Cache for DataForSEO Data](/guide/data-sharing-with-s3) so your teammates also benefit from your API calls.


# Google Service Accounts

SEO Utils uses Google Service Accounts for multiple tasks like submitting index, checking/submitting index for URLs, or pulling data from Google Search Console (GSC) to do some advanced tasks that the GSC dashboard doesn't provide to you.

### Create a Google Service Account

#### Step 1

Visit the Google Cloud Console at <https://console.cloud.google.com/> and create a Project if you don't have one.

<figure><img src="/files/CFvZcgzmvv00vlEcEnth" alt=""><figcaption><p>Create a project on Google Cloud Console</p></figcaption></figure>

#### Step 2

In your [Google Cloud Console](https://console.cloud.google.com/) dashboard, search for "**Service Accounts**" and click on it.

<figure><img src="/files/Tr2CV1nTZyn8P1xWfuFo" alt=""><figcaption><p>Click on "Service Accounts" from the search results</p></figcaption></figure>

Hit the "**Create Service Account**" button, and enter a service account name. Then, hit the "**Done**" button.

<figure><img src="/files/qPRfSYz6SniFK5lXBvXc" alt=""><figcaption><p>Enter service account name</p></figcaption></figure>

<mark style="color:green;">**Copy the email of the service account**</mark>. You will need that email to invite the service account to your Google Search Console so it can access data from Google Search Console.

<figure><img src="/files/hFETkWV50Sq1DMvDrcri" alt=""><figcaption><p>Copy the email</p></figcaption></figure>

#### Step 3: Create a Google Service Account key file

Click on the **Service Account's email,** select the "**KEYS**" tab, then click the "**Create new key**" button.

<figure><img src="/files/u28UGi6QrC1hwLUCLvdd" alt=""><figcaption><p>Create a key for your service account</p></figcaption></figure>

A model will pop up. Select "JSON" and click the "Create" button.

<figure><img src="/files/5xBREJGhbjELctiiQeSh" alt=""><figcaption><p>Select JSON in Key type field.</p></figcaption></figure>

After creating the key, Google will download it to your machine. Keep that file. You will need it when adding the Google Service Account to SEO Utils.

### Add the Google Service Account to SEO Utils

Open the SEO Utils app on your machine, and locate the App dropdown menu in the top-right corner. You will see the Google Service Accounts menu.

<figure><img src="/files/2e7kAPTXDzWZ7k8CD7FA" alt="" width="375"><figcaption><p>Click on Google Service Accounts menu to create one</p></figcaption></figure>

Hit the "Add Account" button and select the key file you downloaded in the previous step.

<figure><img src="/files/Nh8O7AFENn8RXOFZeyFc" alt=""><figcaption><p>Select the downloaded key file after cliking the "Add Account" button</p></figcaption></figure>

Congratulations! You have successfully added a Google Service Account to SEO Utils!

### Connect to Google Search Console

After adding the service account to SEO Utils, you need to grant it access to your Google Search Console properties to pull performance data and submit indexes.

#### Grant Access in Google Search Console

1. **Copy the Service Account Email**: After adding the JSON file, you'll see the service account email displayed (e.g., `seoutils-237@gpapp-1312935720840.iam.gserviceaccount.com`)

<figure><img src="/files/XDgcU1TIVoLJrVn93OgP" alt=""><figcaption><p>Copy the Google Service Account email</p></figcaption></figure>

2. **Add to Google Search Console**:

* Go to your [Google Search Console Dashboard](https://search.google.com/search-console)
* Select your property
* Navigate to Settings → Users and permissions
* Click "Add user"
* Paste the service account email
* Select permission level:
  * **Owner**: Required for submitting indexes via Google Indexing API
  * **Full**: Sufficient for pulling performance data only

{% hint style="warning" %}
**Important**: To submit indexes, the service account must have **Owner** permission in Google Search Console. Full permission is only adequate for reading performance data.
{% endhint %}

### Configure Properties for Index Submission

You can configure which properties each service account can submit indexes for. This setting only affects index submission, not performance data access.

#### Property Configuration Options

**All Properties (Default)**

* When enabled, the service account can submit indexes for all properties in your SEO Utils account
* This is the default setting for new service accounts

**Specific Properties**

* When disabled, you can select specific properties that this service account can access
* Toggle off "All Properties" to reveal a list of available properties
* Check the properties you want this service account to submit indexes for

<figure><img src="/files/TuJ06cNDce7JmdljHXLz" alt=""><figcaption><p>Select specific properties for this service account to access</p></figcaption></figure>

{% hint style="info" %}
**Note**: This property configuration is for index submission only. The service account can still pull performance data from all properties where it has been granted access in Google Search Console.
{% endhint %}


# Google OAuth Token

SEO Utils uses Google OAuth Tokens to securely connect to your Google accounts and access Google Search Console data. This allows you to pull GSC data directly into SEO Utils for advanced analysis and reporting that the standard GSC interface doesn't provide.

## Connect Your Google Account

### Step 1: Access Google OAuth Tokens

Open the SEO Utils app on your machine, and locate the Settings menu in the left sidebar. You will see the Google OAuth Tokens menu.

<figure><img src="/files/epgu4pDbqT0br0E7lCdO" alt="" width="375"><figcaption><p>Click on Google OAuth Tokens menu to manage your connections</p></figcaption></figure>

### Step 2: Connect Your Google Account

Click the "**Connect**" button in the top-right corner of the Google OAuth Tokens page.

<figure><img src="/files/0NEkyHNLUDMBOwVQL8o2" alt=""><figcaption><p>Click the Connect button to start the authorization process</p></figcaption></figure>

### Step 3: Authorize SEO Utils

After clicking Connect, your default web browser will open with Google's authorization page. Follow these steps:

1. **Select your Google account** that has access to Google Search Console
2. **Review the permissions** that SEO Utils is requesting
3. Click "**Allow**" to grant SEO Utils access to your Google Search Console data

<figure><img src="/files/bfK9TDU5kxFwwYJNwcg6" alt=""><figcaption><p>Review and allow the requested permissions</p></figcaption></figure>

{% hint style="info" %}
SEO Utils only requests read-only access to your Google Search Console data. It cannot modify or delete any data in your GSC account.
{% endhint %}

### Step 4: Authorization Complete

Once you've authorized access, you'll see a success message in your browser. You can close the browser tab and return to SEO Utils.

<figure><img src="/files/kG856mchwiAnJpReq8jM" alt=""><figcaption><p>Authorization successful - you can close this tab</p></figcaption></figure>

Your connected Google account will now appear in the Google OAuth Tokens list with your email address and profile picture.

<figure><img src="/files/1TpJ46wiF9ija60BHJpE" alt=""><figcaption><p>Your connected Google account</p></figcaption></figure>

## Managing Multiple Google Accounts

You can connect multiple Google accounts to SEO Utils. This is useful if you manage GSC properties across different Google accounts.

Simply click the "**Connect**" button again and follow the same authorization process with a different Google account.

### Remove a Google Account

To disconnect a Google account:

1. Find the account you want to remove in the list
2. Click on the three-dot menu on the right side of the account row
3. Select "**Delete**" from the dropdown menu
4. Confirm the deletion when prompted

{% hint style="warning" %}
Removing a Google account will disconnect all associated Google Search Console properties from SEO Utils. You'll need to reconnect the account to access that GSC data again.
{% endhint %}

## Using Google OAuth with GSC Integration

Once you've connected your Google accounts, you can use them with various [Google Search Console integration](/guide/google-search-console) features in SEO Utils:

* **Performance Analytics**: Complete search data with advanced regex filtering and more than 16 months of history
* **Keyword Cannibalization Detection**: Identify when multiple pages compete for the same keywords, hurting your rankings
* **Bulk Mentions Analysis**: Check if target keywords appear in critical SEO elements:
  * Page titles and meta descriptions
  * H1, H2, and other headings
  * Body content and paragraphs
  * Image alt text and captions
* **Optimization Opportunities**: Data-driven insights showing:
  * Pages ranking 4-10 that need small tweaks to reach top 3
  * High-impression keywords missing from your content
  * Title/meta description improvements for better CTR
  * Quick wins based on position and mentions analysis
* **Bulk URL Indexing**: Submit multiple URLs to Google for indexing at once
* **Sitemap Management**: Monitor and manage your XML sitemaps directly

## Troubleshooting

### Authorization Failed

If the authorization process fails:

1. Make sure you're selecting a Google account that has access to Google Search Console
2. Check that you're allowing all the requested permissions
3. Try clearing your browser cache and cookies, then attempt the connection again

### Account Not Showing GSC Properties

If your connected account doesn't show any GSC properties:

1. Verify that the Google account has been added as a user in Google Search Console
2. Check that the account has at least "Read" permissions for the properties (needs "Owner" permissions to check index status if using the [Auto Indexing tool](/guide/auto-indexing-tool)).
3. Try disconnecting and reconnecting the account

### Token Expired

Google OAuth tokens may occasionally expire. If you see errors about expired tokens:

1. Simply delete the affected account from the list
2. Click "**Connect**" to re-authorize the account

## Privacy & Security

* SEO Utils stores OAuth tokens securely on your local machine
* Tokens are never transmitted to any external servers except Google's APIs
* You can revoke access at any time by deleting the account from SEO Utils


# Google Analytics 4

SEO Utils integrates with Google Analytics 4 (GA4) to sync organic search metrics — sessions, users, bounce rate, and conversion data (Key Events) — into your local database. This data powers the **Key Events** insight in the Organic Rank Tracker, showing you which tracked keywords are driving conversions.

{% hint style="info" %}
GA4 data is synced automatically once per day and stored locally. Your data never leaves your machine.
{% endhint %}

## Prerequisites

Before setting up GA4 integration, you need:

* A **Google Service Account** added to SEO Utils (see [Google Service Accounts](/guide/google-service-accounts))
* A **GA4 property** with your website configured
* The service account must have **Viewer** access to your GA4 property

## Step 1: Enable Required APIs

You need to enable two Google APIs in the Google Cloud project that your service account belongs to.

{% stepper %}
{% step %}
**Enable the Google Analytics Data API**

This API is used to sync metrics (sessions, conversions, etc.) from GA4.

* Go to the [Google Cloud Console](https://console.cloud.google.com/)
* Select the project your service account belongs to
* Navigate to **APIs & Services → Library**
* Search for **"Google Analytics Data API"**
* Click **Enable**

<figure><img src="/files/Xf4G3chs0dafKc4kcd3N" alt="" width="563"><figcaption><p>Enable the Google Analytics Data API in Google Cloud Console</p></figcaption></figure>
{% endstep %}

{% step %}
**Enable the Google Analytics Admin API**

This API is used to discover your GA4 properties and auto-match them to tracked domains.

* In the same project, go to **APIs & Services → Library**
* Search for **"Google Analytics Admin API"**
* Click **Enable**

<figure><img src="/files/t0vutMEsbZP8hRQMjLMU" alt="" width="563"><figcaption><p>Enable the Google Analytics Admin API in Google Cloud Console</p></figcaption></figure>
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
Both APIs must be enabled in the **same Google Cloud project** that your service account belongs to. APIs are enabled at the project level, not per service account.
{% endhint %}

## Step 2: Grant Service Account Access to GA4

Your service account needs permission to read data from your GA4 property.

{% stepper %}
{% step %}
**Copy Your Service Account Email**

In SEO Utils, go to the **Google Service Accounts** page and copy the service account email (e.g., `project-932@project-1608918721837.iam.gserviceaccount.com`).
{% endstep %}

{% step %}
**Add the Service Account to GA4**

You can grant access at the **property level** or **account level**:

{% tabs %}
{% tab title="Property Level (Single Property)" %}

* Go to [Google Analytics](https://analytics.google.com/)
* Click the **gear icon** (Admin) at the bottom-left
* Under **Property**, click **Property Access Management**
* Click the **+** button → **Add users**
* Paste your service account email
* Set the role to **Viewer**
* Click **Add**
  {% endtab %}

{% tab title="Account Level (All Properties)" %}
If you want the service account to access **all properties** under your GA4 account:

* Go to [Google Analytics](https://analytics.google.com/)
* Click the **gear icon** (Admin) at the bottom-left
* Under **Account**, click **Account Access Management**
* Click the **+** button → **Add users**
* Paste your service account email
* Set the role to **Viewer**
* Click **Add**

This grants access to all current and future properties under that account.
{% endtab %}
{% endtabs %}

<figure><img src="/files/4cjOpACwYKjUpqk8APHh" alt=""><figcaption><p>Add the service account email as a Viewer in GA4 Property Access Management</p></figcaption></figure>
{% endstep %}
{% endstepper %}

{% hint style="info" %}
**Viewer** permission is sufficient. SEO Utils only reads data from GA4 — it never modifies your analytics configuration.
{% endhint %}

## Step 3: Add a GA4 Property in SEO Utils

{% stepper %}
{% step %}
**Navigate to Google Analytics 4**

In SEO Utils, find **Google Analytics 4** in the left sidebar and click **Add Property**.

<figure><img src="/files/97Y3wLAJqpO7GtZL6nev" alt="" width="375"><figcaption><p>Google Analytics 4 section in the sidebar</p></figcaption></figure>
{% endstep %}

{% step %}
**Select a Service Account**

Choose the Google Service Account that has access to your GA4 property. SEO Utils will fetch all GA4 properties the account can access.

<figure><img src="/files/JwL6UPfbEVQNN8mqstsq" alt=""><figcaption><p>Select a service account to list accessible GA4 properties</p></figcaption></figure>
{% endstep %}

{% step %}
**Select a GA4 Property**

Pick your GA4 property from the dropdown. The **Mapped Domain** field will auto-fill based on the property's website URL — this links the GA4 data to your Organic Rank Tracker reports.

Set the **Initial Backfill** to choose how many days of historical data to import on first sync (default: 90 days). GA4 free tier retains 2 months of data by default, or up to 14 months if you've enabled extended retention in your GA4 property settings.

<figure><img src="/files/oIiQLwiIJGADvWpvAujU" alt=""><figcaption><p>Select a GA4 property, confirm the mapped domain, and set the backfill period</p></figcaption></figure>

{% hint style="info" %}
The mapped domain should match the target domain in your Organic Rank Tracker report. For example, if your rank tracker tracks `example.com`, the mapped domain should also be `example.com`.
{% endhint %}
{% endstep %}

{% step %}
**Manage Your Properties**

After adding a property, SEO Utils will automatically start syncing historical data. You can see it in the **GA4 Properties** list. From here you can:

* **Enable/disable sync** — Toggle whether this property syncs automatically once per day
* **Sync Now** — Trigger an immediate data sync
* **Edit domain** — Click the domain to change the mapped domain
* **Remove** — Delete the property and all synced GA4 data. You can re-add the property later to sync again

{% hint style="warning" %}
Removing a GA4 property deletes all synced metrics data for that property. Key Events badges in the Organic Rank Tracker will no longer appear for keywords associated with this property. The data can be re-synced by adding the property again.
{% endhint %}

<figure><img src="/files/WZ1vMXUsZOiMjD52A6rz" alt=""><figcaption><p>GA4 Properties list showing connected properties with sync status</p></figcaption></figure>
{% endstep %}
{% endstepper %}

## Syncing Data

GA4 data syncs automatically **once per day**. You can also click **"Sync Now"** in the GA4 Properties list to trigger an immediate sync.

SEO Utils only syncs **organic search traffic** — visits from Google organic search results. For each landing page, per day:

| Metric               | Description                                                     |
| -------------------- | --------------------------------------------------------------- |
| Sessions             | Number of organic search sessions                               |
| Engaged Sessions     | Sessions with meaningful engagement                             |
| Bounce Rate          | Percentage of single-page sessions                              |
| Avg. Engagement Time | Average time users spent on the page                            |
| Users                | Total unique users from organic search                          |
| New Users            | First-time visitors from organic search                         |
| Key Events           | Conversion events (purchases, sign-ups, form submissions, etc.) |
| Revenue              | Total revenue from organic search sessions                      |

## How GA4 Data Powers Key Events

The primary use of GA4 data is the **Key Events** insight in the [Organic Rank Tracker](/guide/organic-rank-tracker). When GA4 data is synced, the rank tracker can show you which keywords are associated with pages that generate conversions.

For example, if the keyword "deep cleaning cambridge" ranks on your `/cambridge` page, and that page had 3 conversions in GA4, the keyword will display a **"3 Key Events"** badge in the rank tracker.

This helps you:

* **Identify revenue-driving keywords** — See which keywords are associated with actual business outcomes
* **Prioritize SEO efforts** — Focus on keywords that drive conversions, not just traffic
* **Correlate rank changes with conversions** — Spot when a ranking improvement leads to more conversions

{% hint style="info" %}
Key Events attribution works by matching the rank tracker's keyword → page mapping with GA4's landing page → conversion data. For the most accurate results, also connect [Google Search Console](/guide/google-search-console) to provide authoritative keyword-to-page click data.
{% endhint %}

## Troubleshooting

<details>

<summary>"Google Analytics Data API has not been used in project" error</summary>

You need to enable the **Google Analytics Data API** in your Google Cloud project. Visit the link in the error message to enable it, then wait a minute and try again.

</details>

<details>

<summary>"Google Analytics Admin API has not been used in project" error</summary>

You need to enable the **Google Analytics Admin API** in your Google Cloud project. This is a separate API from the Data API — both need to be enabled. Visit the link in the error message to enable it.

</details>

<details>

<summary>No properties found after clicking "Discover Properties"</summary>

Your service account doesn't have access to any GA4 properties. Grant the service account **Viewer** access in GA4's Property Access Management (or Account Access Management for all properties).

</details>

<details>

<summary>Data syncs successfully but shows 0 rows</summary>

This is normal if your site has very low organic search traffic, or if GA4 data hasn't finished processing yet (24-72 hour delay). The sync will pick up the data on the next run.

</details>

<details>

<summary>Sync failed with authentication error</summary>

* Verify your service account still has access to the GA4 property
* Check that the service account key hasn't expired or been deleted in Google Cloud Console
* Re-upload the service account key file if needed

</details>


# Google Search Console

SEO Utils' Google Search Console integration provides a powerful alternative to the standard GSC interface. By connecting your GSC account, you get access to all your search data with advanced features like unlimited historical data storage, natural language filtering, bulk operations, and AI-powered insights - all while maintaining the familiar GSC functionality you already use.

<figure><img src="/files/jcvCEWPH4oEpmF6X6s9Z" alt=""><figcaption><p>See how the keyword is mentioned in your content.</p></figcaption></figure>

### Setup the Integration

There are two methods to connect SEO Utils to your Google Search Console data:

1. **Google OAuth Token** (Recommended for most users)
2. **Google Service Account** (Advanced option for automation)

***

## Method 1: Google OAuth Token

The Google OAuth Token method is the simplest way to connect your Google Search Console data to SEO Utils. This method uses your own Google account credentials.

### Benefits of OAuth Token Method

* **Quick setup** - No need to create service accounts or manage API keys
* **Direct access** - Uses your existing Google account permissions
* **Multiple accounts** - Easily connect multiple Google accounts
* **Automatic permissions** - Access all GSC properties your account can see

### Setup Steps

1. Open SEO Utils and navigate to **Settings menu in the left sidebar > Google OAuth Tokens**
2. Click the **Connect** button
3. Authorize SEO Utils to access your Google Search Console data
4. Your Google account will be connected and ready to use

For detailed setup instructions, see the [Google OAuth Token guide](/guide/google-oauth-token).

{% hint style="info" %}
The OAuth Token method is perfect for individual users and small teams who want a simple, secure way to access their GSC data.
{% endhint %}

***

## Method 2: Google Service Account

The Google Service Account method provides more control and is suitable for advanced users who need programmatic access or specific permission management.

### Benefits of Service Account Method

* **Granular control** - Manage permissions for specific properties
* **Automation-ready** - Ideal for scheduled tasks and API automation
* **No expiration** - Service account keys don't expire like OAuth tokens
* **Team sharing** - Share service account across team without sharing personal credentials

### Setup Steps

#### **Step 1: Enable Google Search Console API**

Visit the [Google Cloud Console](https://console.cloud.google.com/) and create a project if you don't have one. Then search for "**Google Search Console API**" in the top search bar, click on it, and hit **Enable**.

<figure><img src="/files/tiAclw0BsRtKhNasj3gM" alt=""><figcaption><p>Google Search Console API is enabled</p></figcaption></figure>

#### Step 2: Create and Add a Google Service Account

Follow the comprehensive guide to create and add a Google Service Account to SEO Utils:

1. **Create the Service Account**: Follow [this guide](/guide/google-service-accounts#create-a-google-service-account) to create a service account and download the JSON key file
2. **Add to SEO Utils**: Follow [this guide](/guide/google-service-accounts#add-the-google-service-account-to-seo-utils) to add the service account to SEO Utils
3. **Important**: Copy the service account email address - you'll need it in the next step

#### Step 3: Grant Service Account Access in GSC

Now you need to grant the service account access to your Google Search Console properties:

1. Go to your [Google Search Console Tool](https://search.google.com/search-console)
2. Select the property you want to integrate
3. Navigate to **Settings → Users and permissions**
4. Click **Add user**
5. Enter the **service account email** (e.g., `gpapp-932@gpapp-1607908720839.iam.gserviceaccount.com`)
6. Select permission level:
   * **Full**: For pulling performance data only
   * **Owner**: Required if you want to use the [Auto-indexing tool](/guide/auto-indexing-tool) to submit indexes

<figure><img src="/files/MB7GbmYrqkL6iAKIvz7I" alt=""><figcaption><p>Add the service account email with appropriate permissions</p></figcaption></figure>

{% hint style="warning" %}
**Important**: To submit indexes via the Google Indexing API, the service account must have **Owner** permission. Full permission is sufficient for reading performance data only.
{% endhint %}

Once you complete this step, the Google Service Account will gain full access to the website data in your Google Search Console. With this, you're all set to utilize this integration on SEO Utils 🎉

***

## Data Storage and Retention

After connecting your properties, SEO Utils will pull all data from the Google Search Console API and store it locally on your machine.

{% hint style="success" %}
The application automatically pulls new data every day, which means you can view and analyze data for **more than the standard 16-month limit** imposed by Google Search Console.
{% endhint %}

### Key Benefits of Local Storage

* **Extended Historical Data**: While Google Search Console only provides 16 months of data, SEO Utils stores everything locally, allowing you to build an unlimited historical archive
* **Daily Automatic Updates**: New data is automatically fetched every day without any manual intervention
* **Offline Access**: Your data is available even without an internet connection since it's stored locally
* **No API Limits**: Browse and analyze your data without worrying about API rate limits

## Available Features

The SEO Utils integration contains all features from the Google Search Console dashboard, plus advanced features that GSC doesn't provide. Whatever you can do on the GSC dashboard, you can do in SEO Utils - and more.

### Standard GSC Features Available in SEO Utils

* Performance reports with clicks, impressions, CTR, and position data
* Search analytics with query and page filtering
* Date range comparisons
* Country, device, and search appearance filtering
* Sitemap management
* URL inspection and indexing status

### Advanced Features Not Available in Standard GSC

* Extended data retention beyond 16 months
* Filter data using Natural Language
* Bulk mention checking across all content
* Keyword cannibalization detection
* AI-powered insights and opportunities
* Bulk URL indexing submission
* Complete data export without sampling limitations
* Multi-account management in a single dashboard
* SEO Tests: Time-based Test, URL Switch Test, Split Tests
* Chart annotations with automatic Google algorithm update tracking

Please follow the guides below to learn how to use these features:

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-cover data-type="image">Cover image</th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>Annotations</td><td><a href="/files/EJd5MpuTILoHW2yPbZNf">/files/EJd5MpuTILoHW2yPbZNf</a></td><td><a href="/pages/lCKJJORXudVZAq5kxELF">/pages/lCKJJORXudVZAq5kxELF</a></td></tr><tr><td>Topic Clusters</td><td><a href="/files/Bw0NB4rPrLzagbuTYuOp">/files/Bw0NB4rPrLzagbuTYuOp</a></td><td><a href="/pages/ukbkcMBEs6RkpexL4qDZ">/pages/ukbkcMBEs6RkpexL4qDZ</a></td></tr><tr><td>Keyword Metrics</td><td><a href="/files/vrMfPqSM4XVIaMjUG0Pw">/files/vrMfPqSM4XVIaMjUG0Pw</a></td><td><a href="/pages/caypbM1HCIZmcBDOjEO9">/pages/caypbM1HCIZmcBDOjEO9</a></td></tr><tr><td>SEO Tests</td><td><a href="/files/ilUx5BLqlaTMzumUs6MY">/files/ilUx5BLqlaTMzumUs6MY</a></td><td><a href="/pages/Gw7W6nfKOMxjRqkYZpaM">/pages/Gw7W6nfKOMxjRqkYZpaM</a></td></tr></tbody></table>

***


# Annotations

Annotations let you mark important events directly on your Google Search Console performance charts. Use them to track algorithm updates, content changes, technical fixes, or any event that might impact your search performance.

<figure><img src="/files/EJd5MpuTILoHW2yPbZNf" alt=""><figcaption><p>Annotations appear as triangle markers on the chart timeline</p></figcaption></figure>

## Why Use Annotations?

When analyzing search performance changes, it's crucial to understand what happened and when. Annotations help you:

* **Correlate changes**: See how content updates or technical fixes affected your traffic
* **Track algorithm updates**: Google algorithm updates are automatically added as annotations
* **Document your work**: Keep a record of SEO changes for future reference
* **Share context**: When reviewing data with others, annotations explain what happened

## Viewing Annotations

Annotations appear as small triangle markers at the bottom of your GSC performance chart.

{% stepper %}
{% step %}
**Enable Annotations**

Click the **notebook icon** in the chart toolbar to open the annotations menu. Annotations are shown by default.

<figure><img src="/files/zn7hK8qJw3698wbkVkon" alt="" width="563"><figcaption><p>Annotations dropdown menu</p></figcaption></figure>
{% endstep %}

{% step %}
**Filter by Type**

Use the checkboxes to show or hide specific annotation types:

| Type          | Description                                    |
| ------------- | ---------------------------------------------- |
| Custom        | Annotations you create manually                |
| Google Update | Automatically tracked Google algorithm updates |
| System        | System-generated annotations                   |
| {% endstep %} |                                                |

{% step %}
**View Annotation Details**

Hover over any triangle marker to see a tooltip with the annotation details. Click the marker to open the full annotations panel for that date.

<figure><img src="/files/fvPHjYXtUx4IlohuQZpn" alt=""><figcaption><p>Click an annotation marker to see details</p></figcaption></figure>
{% endstep %}
{% endstepper %}

## Adding Annotations

{% stepper %}
{% step %}
**Open the Annotations Menu**

Click the **notebook icon** in the chart toolbar.
{% endstep %}

{% step %}
**Click Add Annotation**

Select **"Add annotation"** from the dropdown menu.

<figure><img src="/files/iKgVCiQszSCLQsGXffSm" alt="" width="563"><figcaption><p>Add annotation option in the menu</p></figcaption></figure>
{% endstep %}

{% step %}
**Fill in the Details**

* **Title**: A short description of the event
* **Date**: When the event occurred
* **Description** (optional): Additional context or notes

Click **"Save"** to add the annotation.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
Annotations are linked to the GSC property, so they'll appear whenever you view that property's performance chart.
{% endhint %}

## Managing Annotations

### View All Annotations

Click **"View all annotations"** in the annotations menu to open a panel showing all annotations for the current property.

<figure><img src="/files/q3Zl0ch1WplP2jBD8y27" alt=""><figcaption><p>Annotations panel with filtering options</p></figcaption></figure>

### Available Actions

| Action | Description                        |
| ------ | ---------------------------------- |
| View   | See full annotation details        |
| Edit   | Modify title, date, or description |
| Delete | Remove the annotation              |

{% hint style="warning" %}
Google Update and System annotations cannot be edited or deleted—they are automatically maintained by SEO Utils.
{% endhint %}

### Filtering Annotations

Use the filters in the annotations panel to find specific annotations:

* **Date Range**: Filter by when annotations occurred
* **Type**: Show only custom, Google updates, or system annotations
* **Search**: Find annotations by title or description

## Google Algorithm Updates

SEO Utils automatically tracks confirmed Google algorithm updates and adds them as annotations. This helps you understand if traffic changes correlate with known algorithm updates.

{% hint style="success" %}
Google Update annotations are added automatically—you don't need to track them manually.
{% endhint %}

## Best Practices

* **Be specific**: Use clear titles like "Published new pricing page" instead of "Content update"
* **Add context**: Use the description field to include links or additional details
* **Annotate promptly**: Add annotations when you make changes, not weeks later when you've forgotten the details
* **Review regularly**: When analyzing performance drops or gains, check annotations first to understand what changed


# Topic Clusters

Topic Clusters is an AI-powered feature that groups semantically related search queries together, allowing you to analyze their collective performance and identify content opportunities at scale. By leveraging the [Embedding Database](/guide/embedding-database), this feature goes beyond simple keyword matching to understand the actual meaning and intent behind queries.

<figure><img src="/files/Bw0NB4rPrLzagbuTYuOp" alt=""><figcaption></figcaption></figure>

## Why Use Topic Clusters?

Traditional keyword analysis looks at queries individually, missing the bigger picture of how related searches contribute to your overall performance. Topic Clusters solves this by:

* **Revealing Hidden Patterns**: Discover groups of queries that share semantic meaning but use different words
* **Measuring Topic Performance**: See aggregated metrics (clicks, impressions) for entire topic areas
* **Identifying Content Gaps**: Find clusters of queries where you're underperforming
* **Streamlining Optimization**: Focus on improving entire topics rather than individual keywords
* **Understanding User Intent**: Group queries by what users actually mean, not just what they type

## Prerequisites

Before you can create topic clusters, you need to set up the embedding system:

### Step 1: Enable Embedding Database

1. Navigate to **Settings** → **Embedding** in the left sidebar
2. Toggle on **"Enable Embeddings"** master switch
3. Under **Google Search Console Queries**, ensure it's enabled
4. Select an embedding model (see [Choosing the Right Model](/guide/embedding-database#how-to-choose-the-right-model))
5. Click **"Update settings"**

<figure><img src="/files/UjgOMTlnwYB7m9c3u7r9" alt=""><figcaption><p>Enable embeddings for Google Search Console Queries</p></figcaption></figure>

### Step 2: Generate Query Embeddings

1. Go to **Google Search Console > Properties** in the left sidebar
2. Select your property
3. Navigate to the **Settings** tab

<figure><img src="/files/tUiv1Hkf7lNTZ6Rpv9Uw" alt="" width="563"><figcaption><p>Go to Property Settings page</p></figcaption></figure>

4. Scroll down to the **"Query Embeddings"** section
5. Click **"Generate Embeddings"** to process all your queries

<figure><img src="/files/D80ReTPF0A616FmGxs6S" alt=""><figcaption><p>Generate embeddings for your search queries</p></figcaption></figure>

{% hint style="info" %}
**Auto-Embed New Queries**: Toggle this on to automatically generate embeddings when new search queries are synced from Google Search Console, ensuring your clusters stay up-to-date.
{% endhint %}

The embedding process runs in the background. Processing time depends on:

* Number of queries (1,000 queries ≈ 1-2 minutes)
* Selected model (local models are slower but free)
* Your computer's specifications

## Creating Topic Clusters

Once embeddings are generated, you can start creating clusters:

### Step 1: Access Topic Clusters

1. Navigate to your GSC property's **Insights** page
2. Scroll down to the **Topic Clusters** card
3. Click **"Create Cluster"** to begin

<figure><img src="/files/lpuYp1va2NP54v6vowmK" alt=""><figcaption><p>Topic Clusters card</p></figcaption></figure>

### Step 2: Search for Related Queries

1. **Enter Topics**: Type one or more seed topics to find similar queries
   * Single topic: Finds queries similar to that specific topic
   * Multiple topics: Finds queries similar to the centroid (average) of all topics
2. **Set Similarity Threshold**: Adjust the threshold to control how closely queries must match
   * Higher values (0.8-0.9): Stricter matching, fewer but more relevant results
   * Lower values (0.6-0.7): Broader matching, more results with varying relevance
   * See [Understanding Similarity Scores](/guide/embedding-database#understanding-similarity-scores) for details
3. **Click Search**: SEO Utils will return all semantically related queries

<figure><img src="/files/4zSehos5byJ9m1mecQTA" alt=""><figcaption><p>Search for semantically similar queries using AI</p></figcaption></figure>

### Step 3: Select Queries

Review the search results and select queries to include in your cluster:

* **Individual Selection**: Click checkboxes for specific queries
* **Select All on Page**: Use the header checkbox to select visible queries
* **Select All Results**: Click "Select all X queries" to include all matching queries across pages
* **Review Similarity Scores**: Higher scores indicate stronger semantic relationships

<figure><img src="/files/mTCfxCkkB0oX5eDO62jG" alt=""><figcaption><p>Select queries to include in your cluster</p></figcaption></figure>

### Step 4: Configure Cluster Details

After selecting queries, click **"Next"** to configure your cluster:

1. **Cluster Name**: Give your cluster a descriptive name (e.g., "SEO Best Practices", "Local Coffee Shops")
2. **Description** (Optional): Add notes about what this cluster represents
3. **Color**: Choose a color for visual identification in charts and reports

<figure><img src="/files/pQYxO28cHighKUpdRsH4" alt=""><figcaption><p>Configure your topic cluster details</p></figcaption></figure>

Click **"Create Cluster"** to save your new topic cluster.

## Managing Topic Clusters

### Viewing Cluster Performance

Once created, clusters appear in the Topic Clusters card, showing:

* **Total Clicks**: Aggregated clicks from all queries in the cluster
* **Total Impressions**: Combined visibility across all cluster queries

### Editing Clusters

Click on any cluster to:

* **Add/Remove Queries**: Refine your cluster by adjusting included queries
* **Update Details**: Change name, description, or color
* **Re-run Search**: Find new related queries with a different threshold

### Deleting Clusters

To remove a cluster:

1. Click on the cluster to open edit mode
2. Click the **"Delete"** button
3. Confirm deletion (this only removes the cluster, not the underlying queries)

### Exporting Cluster Data

Export your clusters for further analysis:

* **Download CSV**: Click the download button to export cluster metrics
* **PDF Reports**: Clusters appear in exported PDF Insights reports

## Advanced Features

### Multi-Model Flexibility

The embedding database stores vectors from different models separately, allowing you to:

* **Experiment with Models**: Try different embedding models to find the best for your content
* **Compare Results**: See how different models group your queries
* **Switch Without Loss**: Change models without losing previously generated embeddings

To switch models:

1. Go to **Settings** → **Embedding**
2. Select a different model for Google Search Console Queries
3. Generate new embeddings with the selected model
4. Create clusters using the new embeddings

### Managing Embeddings

Control your embedding data from the GSC Settings page:

* **View Status**: See how many queries have embeddings
* **Delete Embeddings**: Remove embeddings for a specific model to free space or start fresh

<figure><img src="/files/VkJWZqKlzUgIJwFxdhzz" alt=""><figcaption><p>Manage embedding data per model</p></figcaption></figure>

## Best Practices

### Choosing Seed Topics

* **Be Specific**: "coffee brewing methods" works better than just "coffee"
* **Use Natural Language**: Write topics as users would search
* **Combine Related Terms**: Use multiple seeds to capture topic variations
* **Consider Intent**: Mix informational, commercial, and navigational terms

### Setting Similarity Thresholds

Start with these recommended thresholds:

* **Tight Clusters (0.85-0.95)**: For very specific topics or branded queries
* **Balanced Clusters (0.75-0.85)**: Good for most content topics
* **Broad Clusters (0.65-0.75)**: For exploratory analysis or finding opportunities

### Organizing Clusters

* **Avoid Overlap**: Check that queries don't appear in multiple similar clusters
* **Create Hierarchies**: Build parent topics with broader themes, child clusters for specifics
* **Use Consistent Naming**: Develop a naming convention for easy identification
* **Document Purpose**: Use descriptions to explain each cluster's optimization goal

## Use Cases

### Content Gap Analysis

1. Create clusters for topics you want to rank for
2. Identify clusters with high impressions but low clicks
3. Analyze which queries need better content
4. Develop content strategies for entire topic areas

### Competitor Comparison

1. Build clusters around competitor brand terms
2. Find topics where competitors are mentioned
3. Identify opportunities to create comparison content
4. Track performance improvements over time

### Seasonal Planning

1. Create clusters for seasonal topics
2. Monitor performance trends throughout the year
3. Plan content calendars based on cluster seasonality
4. Optimize existing content before peak seasons

### User Intent Mapping

1. Group queries by search intent (informational, transactional, navigational)
2. Ensure content matches the dominant intent in each cluster
3. Identify intent gaps in your content strategy
4. Optimize conversion paths for each intent type

## Troubleshooting

### No Queries Found

* **Lower the threshold**: Try 0.6-0.7 for broader matching
* **Use different seed topics**: Try synonyms or related terms
* **Check embeddings**: Ensure queries have been embedded with the current model

### Too Many Irrelevant Queries

* **Increase threshold**: Use 0.85+ for stricter matching
* **Refine seed topics**: Be more specific with your search terms
* **Manual curation**: Remove irrelevant queries after initial search

### Embeddings Not Generating

* **Check model configuration**: Ensure the embedding model is properly selected
* **Verify API keys**: For cloud models, check API key validity
* **Local model issues**: Ensure Ollama is running and the model is downloaded


# Keyword Metrics

The **Keyword Metrics** feature enriches your Google Search Console queries with valuable SEO data like search volume, CPC, keyword difficulty, and competition metrics. You can also analyze SERP data to understand your competition better.

<figure><img src="/files/qMq4lgMk6RSLvRCW2O9v" alt=""><figcaption><p>Keyword Metrics</p></figcaption></figure>

### Configure Keyword Metrics Settings

Before checking metrics, you need to configure the location and language settings. Navigate to your Search Console property settings and find the "Keyword Metrics" section.

<figure><img src="/files/jxasLuvMd08becl8nQ4R" alt="" width="563"><figcaption></figcaption></figure>

**Required Settings:**

* **Location/Language:** Select your target market (e.g., United States / English)
* **Geo Target (Optional):** Specify a more precise location for SERP analysis
* **Auto-check:** Toggle this on to automatically check metrics for new queries pulled from GSC

<figure><img src="/files/VQI7PqjC3jZINNyoJubO" alt=""><figcaption><p>Configure keyword metrics settings</p></figcaption></figure>

### Check Keyword Metrics

Once configured, click the "**Check Metrics**" button to start checking metrics for your queries.

{% hint style="info" %}
**Cost Note:** DataForSEO won't charge for keywords without search volume data, so actual costs will be lower than the estimation. SEO Utils only checks metrics for queries with missing or outdated data.
{% endhint %}

<figure><img src="/files/64LD8JcebnZu7Joeq3Fv" alt="" width="563"><figcaption><p>Review estimated cost before checking</p></figcaption></figure>

### View Queries with Metrics

After checking completes, visit the "Keyword Metrics" page from the main dropdown to see your enriched query data.

<figure><img src="/files/PW6O6seMokaZDnNfbq7l" alt="" width="563"><figcaption><p>Access Keyword Metrics page</p></figcaption></figure>

You can:

* Sort by any column (clicks, impressions, search volume, CPC, keyword difficulty)
* Filter using range filters for numeric values
* Search for specific queries

<figure><img src="/files/qMq4lgMk6RSLvRCW2O9v" alt=""><figcaption><p>Keyword metrics table with enriched data</p></figcaption></figure>

{% hint style="info" %}
You can click the **View** button on the table to see more columns.
{% endhint %}

### Analyze SERP Data

Click the "**Live SERP**" button next to any query to pull live SERP data. This shows the top-ranking pages for that keyword.

For deeper analysis, select SERP URLs and click "**Analyze SERP**" to view:

* **DR** (Domain Rating)
* **UR** (URL Rating)
* **RD** (Referring Domains)
* **Backlinks** count
* **Traffic** estimates
* **Ranked Keywords** count

<figure><img src="/files/J9qoA6bl1ezatejwXDWb" alt=""><figcaption><p>SERP analysis showing competitor metrics</p></figcaption></figure>

This data helps you understand the competition level and identify opportunities to improve your rankings.


# SEO Tests

SEO Utils allows you to run controlled experiments to measure the impact of your SEO changes using real [Google Search Console data](/guide/google-search-console). The tool automatically tracks metrics like clicks, impressions, CTR, and rankings to help you make data-driven decisions.

<figure><img src="/files/lg1Eds7ef4cuXM8qNSfi" alt=""><figcaption><p>SEO Tests: URL Switch Test.</p></figcaption></figure>

You can test whether your SEO changes actually improve performance before rolling them out across your entire site. The tool supports three different test types, each designed for specific testing scenarios.

### Test Types

SEO Utils supports three types of SEO tests:

1. **Time-based Test**: Compare performance before and after implementing a change
2. **URL Switch Test**: A/B test by alternating between two versions of the pages
3. **Split Test**: Run simultaneous tests on different page groups

### How to Create an SEO Test

To get started, head to the SEO Tests in the left sidebar. Then, click the Create Test button.

<figure><img src="/files/FuTdb40g8SutVYiDsU7s" alt=""><figcaption><p>Access the SEO Tests tool in the left sidebar</p></figcaption></figure>

The test creation process has three steps. We'll go through each step and explain the different fields for each test type.

#### Step 1: Configure Test

First, you need to set up the basic test information.

<figure><img src="/files/ELNCLve6rhiLJbiWiR1z" alt=""><figcaption><p>Configure your test settings</p></figcaption></figure>

**Common Fields (All Test Types):**

* **Domain**: Select the Google Search Console property you want to test
* **Test Type**: Choose between Time-based, URL Switch, or Split Test
* **Test Name**: Give your test a descriptive name
* **Description**: Optional field to add more context about your test
* **Hypothesis**: Clearly state what you expect to happen

**Test Type Specific Fields:**

For **Time-based Tests**:

* **Change Implemented Date**: When the SEO change will be implemented. This date separates the "before" and "after" periods for comparison

For **URL Switch Tests**:

* **Switch Interval**: How often to switch between versions (1-30 days)
* **Starting Version**: Which version to show first (original or variant)

For **Split Tests**:

* **Traffic Split**: Percentage of traffic for the variant group (10-90%)

{% hint style="info" %}
Your hypothesis should be specific and measurable. For example: "Adding FAQ schema will increase CTR by 10%" instead of "Schema will help rankings".
{% endhint %}

#### Step 2: Select Pages

Next, you'll select which pages to include in your test.

<figure><img src="/files/pTemMLBpm0YbsQinz94k" alt=""><figcaption><p>Select and validate pages for testing</p></figcaption></figure>

**Page Selection Process:**

1. **Add Filters**: Use filters to find pages that match your criteria
2. **Date Range**: Select the date range for baseline data validation
   * This ensures your selected pages have enough historical data
   * Recommended: Use at least 30 days of baseline data
3. **Find Pages**: Click to search for matching pages in your GSC data

**For Time-based Tests:**

* You can select or remove pages using checkboxes

**For URL Switch Tests:**

* Configure URL pairs (original vs. alternate versions)
* Example: `/product` (original) vs. `/product-v2` (alternate)
* The tool will automatically switch between these URLs based on your interval

**For Split Tests:**

* Pages are automatically divided into Control and Variant groups
* You can manually move pages between groups if needed
* The tool ensures both groups have similar baseline performance

{% hint style="success" %}
**Tip**: For Split Tests, SEO Utils automatically balances the groups to ensure similar baseline metrics, reducing test bias. If the current split isn't well-balanced, use the **Shuffle** button to generate a different distribution of pages between control and variant groups until you find a balanced split.
{% endhint %}

#### Step 3: Schedule Test

Finally, set when your test should run.

<figure><img src="/files/vY0YSIwVadDWksqdRDVv" alt=""><figcaption><p>Schedule your test duration</p></figcaption></figure>

**Scheduling Fields:**

* **Start Date**: When to begin tracking test metrics
* **End Date**: Optional - when to stop the test (leave empty for ongoing tests)

For **Time-based Tests** only:

* **Change Implemented Date**: When you plan to implement (or have implemented) the SEO change
  * This separates the "before" and "after" periods
  * Must be between the start and end dates

{% hint style="warning" %}
Allow at least 2-4 weeks for your test to gather statistically significant data. Google Search Console data has a 2-3 day delay, so factor this into your timeline.
{% endhint %}

### When to Use Each Test Type

#### Time-based Test

<figure><img src="/files/m1pMa7kDhfyA3sTzBWJ0" alt=""><figcaption><p>Time-based Test</p></figcaption></figure>

**Use when:**

* Making site-wide changes (like updating all title tags)
* Testing changes that can't be reversed easily
* You want to compare "before" and "after" performance
* Historical comparison is more important than simultaneous testing

**Example scenarios:**

* Adding schema markup to all product pages
* Changing the URL structure site-wide
* Implementing Core Web Vitals improvements

#### URL Switch Test

<figure><img src="/files/lg1Eds7ef4cuXM8qNSfi" alt=""><figcaption><p>URL Switch Test</p></figcaption></figure>

**Use when:**

* You have two versions of the same page
* You can programmatically switch between versions
* You want to minimize the impact of external factors
* Testing significant page redesigns

**Example scenarios:**

* Testing two different page layouts
* Comparing long-form vs. short-form content
* Testing different internal linking structures

#### Split Test

<figure><img src="/files/iGL9ho9M6iKjmPf64u1X" alt=""><figcaption></figcaption></figure>

**Use when:**

* You have many similar pages (like product or category pages)
* You want to test changes on a subset before full rollout
* You need results faster than sequential testing
* Testing template-level changes

**Example scenarios:**

* Testing new title tag templates on product pages
* Adding FAQ sections to half of your blog posts
* Testing different meta description formats

### Understanding Statistical Terms

SEO Utils uses statistical analysis to ensure your test results are reliable. Here are the key terms:

#### 1. Confidence Score / Statistical Significance

**What it means**: The probability that the observed difference is real and not due to random variation.

* **95% confidence** = Only 5% chance the results are due to randomness
* **99% confidence** = Only 1% chance the results are due to randomness

**How to use it**: Wait for at least 95% confidence before making decisions based on test results.

#### 2. P-Value

**What it means**: The probability of seeing these results if there was actually no difference between versions.

* **p < 0.05**: Statistically significant (less than 5% chance of random occurrence)
* **p < 0.01**: Highly significant (less than 1% chance of random occurrence)

**How to use it**: A p-value below 0.05 indicates your results are statistically significant.

#### 3. Z-Score

**What it means**: How many standard deviations the test results are from the mean. It measures the magnitude of difference.

* **|z| > 1.96**: Significant at 95% confidence level
* **|z| > 2.58**: Significant at 99% confidence level

**How to use it**: Larger absolute z-scores indicate stronger evidence of a real difference.

#### 4. Uplift

**What it means**: The percentage change in performance between control and variant groups.

* **Positive uplift**: Variant performs better than control
* **Negative uplift**: Control performs better than variant

**Calculation**: `(Variant Metric - Control Metric) / Control Metric × 100`

{% hint style="warning" %}
**Important**: High uplift doesn't always mean statistical significance. Always check the confidence score before making decisions.
{% endhint %}

### Interpreting Results Correctly

#### When to Trust Your Results

✅ **Reliable results when:**

* Statistical significance is 95% or higher
* The test has run for at least 2-4 weeks
* You have sufficient sample size (usually 1000+ clicks per group)
* No major external events occurred during the test

⚠️ **Be cautious when:**

* Significance is between 90-95%
* Sample size is small (< 500 clicks)
* Test duration is less than 2 weeks
* Major algorithm updates occurred during testing

❌ **Don't trust results when:**

* Significance is below 90%
* Very small sample size (< 100 clicks)
* Test ran for less than a week
* Site had technical issues during the test

### Monitoring Test Progress

SEO Utils provides real-time monitoring features:

1. **Daily Metrics Updates**: See how metrics change day by day
2. **Trend Charts**: Visualize performance trends over time
3. **Pause/Resume Capability**: Exclude problematic periods from analysis
4. **Export Options**: Download detailed results for further analysis

{% hint style="info" %} <mark style="color:blue;">**Pro Tip**</mark>: Check your test results weekly, but avoid making decisions too early. Early results can be misleading due to small sample sizes.
{% endhint %}

### Best Practices

1. **Define clear hypotheses**: Be specific about what you expect to change and by how much
2. **Ensure sufficient sample size**: Include enough pages and traffic for reliable results
3. **Run tests for adequate duration**: At least 2-4 weeks, accounting for weekly patterns
4. **Monitor external factors**: Note any algorithm updates or seasonal changes during your test
5. **Document your changes**: Keep detailed records of exactly what was changed

{% hint style="success" %}
SEO Tests integrate directly with your [Google Search Console data](/guide/google-search-console), so there's no need for additional tracking setup. Just connect your GSC account and start testing!
{% endhint %}


# Indexing Dashboard

The **Indexing Dashboard** gives you a complete view of how Google indexes your website. It uses the Google URL Inspection API to check each page individually, tracks status changes over time, and shows you exactly which pages are indexed, which aren't, and why.

The dashboard has **three tabs**:

* **Overview** — High-level indexing status, trends, and recent movements
* **Visual Diagnostics** — Charts that expose structural site issues (velocity, directory health, crawl budget, internal links, funnel)
* **Log Analyzer** — A combined data table merging GSC data, internal links, and server log hits with actionable insights

<figure><img src="/files/xDXxA0WSNv10Sn8qGMON" alt=""><figcaption><p>Indexing Dashboard with three tabs: Overview, Visual Diagnostics, and Log Analyzer</p></figcaption></figure>

***

## Getting Started

To use the Indexing Dashboard, you need a Google Search Console property connected to SEO Utils with at least one sitemap added.

{% stepper %}
{% step %}
**Connect a GSC Property**

If you haven't already, connect your Google Search Console property using either a **Google OAuth Token** or a **Google Service Account**. See the [Google Search Console setup guide](/guide/google-search-console) for instructions.
{% endstep %}

{% step %}
**Add a Sitemap (if needed)**

When you connect a GSC property, SEO Utils automatically detects and adds sitemaps from Google Search Console. If sitemaps were found, you can skip this step.

If no sitemaps were detected, or you want to add a different sitemap, navigate to **Sitemaps** from the property dropdown and add your sitemap URL (e.g., `https://yoursite.com/sitemap.xml`). SEO Utils will automatically fetch URLs from your sitemap daily.

<figure><img src="/files/F40IDkhuMnyWnKyJiygM" alt="" width="563"><figcaption><p>Add a sitemap</p></figcaption></figure>
{% endstep %}

{% step %}
**Open the Indexing Dashboard**

Select your property from the dropdown, then click **Indexing** in the navigation menu. The dashboard will begin collecting data automatically.
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
On first visit, the dashboard shows "Based on 0/N URLs inspected" because no URLs have been inspected yet. Click **Run Initial Scan** in the top-right to start the first inspection batch, or wait for the automatic inspection to run (every 4 hours).
{% endhint %}

***

## Shared Controls

These controls appear at the top of the dashboard and apply across all three tabs:

### Date Filter

The date dropdown in the top-right controls the time range for the chart, table impressions/clicks, movements, funnel, and velocity data.

Available presets: **7 days, 14 days, 30 days, 2 months, 3 months, 6 months, 12 months**. The default is 30 days.

<figure><img src="/files/4cfbPcUpBPrJghx1U4kE" alt="" width="563"><figcaption><p>Date range filter and the settings icon.</p></figcaption></figure>

### Sitemap Errors Banner

If any sitemap has a fetch error (e.g., HTTP 404, timeout), a dismissible banner appears at the top showing the errors. This is visible on all tabs.

### Settings

Click the **cog icon** in the top-right to open the Indexing Settings modal. See the [Settings](#settings) section below for details.

***

## Tab 1: Overview

The Overview tab shows your high-level indexing status, historical trends, and recent status changes.

<figure><img src="/files/7JXBN0oFpubB91dy6dqA" alt=""><figcaption><p>Overview tab with status tabs, trend chart, and pages table</p></figcaption></figure>

### Status Tabs & Chart

Three tabs at the top — **All**, **Indexed**, **Not indexed** — filter both the chart and pages table. Use the **Show %** toggle to switch between counts and percentages.

When you select **Not indexed**, clickable sub-status chips appear (e.g., "Crawled - currently not indexed", "Not found (404)") to drill down by reason. Select multiple chips to combine filters.

<figure><img src="/files/cmbOaKswobU1dx50odSG" alt=""><figcaption><p>Sub-status chips filter the chart and table by specific indexing reason</p></figcaption></figure>

The **Indexing Overview Chart** shows a stacked bar trend over time — green for indexed, orange/multi-color for not indexed sub-statuses.

### Pages Table

<figure><img src="/files/MS3lHr6n7bBjC4yojRME" alt=""><figcaption><p>Pages table with filters, bulk actions, and per-URL indexing details</p></figcaption></figure>

Shows every URL from your sitemap with columns for **URL**, **Clicks**, **Impressions**, **Status** (coverage state badge), **Last Crawl**, **Rich Results**, and **Last Inspection**.

**Filters:** Page URL search, Status, Content Group, and "Pages at risk of de-indexing" (indexed pages not crawled in 90+ days). Click **Advanced** for Clicks/Impressions range filters and Last Crawl date picker.

**Actions:** Click **...** on any row to **Check Index** (re-inspect via API) or **Request Indexing** (submit to Google). Select multiple rows for bulk Check Index or Submit Index.

### Recent Movements

<figure><img src="/files/ci3g8fyrCBpN71m8O9M8" alt=""><figcaption><p>Recent Movements tracking status changes across coverage, robots, and canonical fields</p></figcaption></figure>

Tracks indexing status changes over time across three tabs:

* **All Movements** — Every status change with a Type column (Coverage, Indexing, Robots, Canonical)
* **Indexing Changes** — Only coverage and indexing state changes
* **Recently Published & Not Indexed** — New URLs still not indexed within the date range

***

## Tab 2: Visual Diagnostics

The Visual Diagnostics tab shows five charts that help you identify structural indexing problems at a glance. Data is loaded only when you navigate to this tab.

### Internal Link Crawler

At the top of the Diagnostics tab, a **Crawler Progress Card** shows the status of the internal link crawler:

* **Not run yet** — "Internal link crawler has not been run yet." with a **Run Link Crawler** button
* **Running** — "Crawling... X/Y URLs" with live progress updates
* **Completed** — "Last crawl: Apr 5, 2026 — 2000 URLs"

Click **Run Link Crawler** to start a manual crawl. The crawler uses headless Chrome to visit each sitemap URL, extract all internal `<a>` links, and store the link graph (anchor text, rel attributes, follow/nofollow). This data powers the scatter plot and the inlink counts in the Log Analyzer table.

<figure><img src="/files/gnuMGx4TkIvtRAy9Azrz" alt=""><figcaption><p>Crawler progress card showing last crawl date and Run Link Crawler button</p></figcaption></figure>

{% hint style="info" %}
The crawler processes up to **2,000 URLs per cycle**, prioritizing uncrawled URLs first. For larger sites, the full site is covered over multiple weekly cycles. You can configure the crawl rate and schedule in [Settings](#internal-link-crawler-settings).
{% endhint %}

### Indexing Velocity

This chart answers: **"Is Google getting faster or slower at indexing my new content?"**

<figure><img src="/files/azkEGnDZQAFcscqcCYRZ" alt=""><figcaption><p>Indexing Velocity chart showing median time-to-index with P90 band over weeks</p></figcaption></figure>

* **Blue line** — Median (P50) time-to-index in days
* **Red shaded area** — 90th percentile (P90) band, showing how long the slowest 10% of URLs take

The X-axis shows weeks. Each data point represents all URLs published that week and how long they took to reach "Submitted and indexed" status.

{% hint style="info" %}
This is a **forward-looking metric**. It only tracks URLs discovered after you set up SEO Utils, so the data won't include historical pages that existed before your first sitemap sync. New users will see an empty state: *"Awaiting new content. Velocity tracking begins when you publish new URLs to your sitemap."*
{% endhint %}

### Directory Health

Horizontal stacked bars showing the **indexed vs. not-indexed ratio** for each subdirectory of your site.

<figure><img src="/files/xoWFq8rzIHyiQ9cEjNzb" alt=""><figcaption><p>Directory Health chart showing indexed percentage per directory with green/red stacked bars</p></figcaption></figure>

* **Green** = indexed percentage
* **Red** = not-indexed percentage
* Shows the **top 10 directories** by URL count, with an "Other" bucket for the rest
* Root-level pages (like `/about`, `/contact`) are grouped into the `/` bucket

Use the **Group By** dropdown (top-right of the chart) to switch between:

* **Directory Path (Auto)** — Groups by first URL path segment (default)
* **Content Groups** — Groups by the content groups you've created in the [Insights tab](/guide/google-search-console) (using URL filters or manual page selection)

### Crawl Budget by Directory

A bar chart showing how **Googlebot allocates its crawl budget** across your site's directories.

<figure><img src="/files/y6NmxZhohfQxWNQsZAX2" alt=""><figcaption><p>Crawl Budget chart showing Googlebot hit distribution by directory</p></figcaption></figure>

This chart is only available when you have a **log report linked** to this domain. If no log report is linked, you'll see: *"Link a log report to see crawl budget allocation by directory."*

{% hint style="success" %}
**The "aha moment"**: Compare the Directory Health chart with the Crawl Budget chart side by side. If `/search/` is only 15% indexed but consumes 75% of all Googlebot hits, you've found a crawl trap that needs fixing.
{% endhint %}

### Internal Links vs. Indexation

A scatter plot that shows the **correlation between internal link count and indexation success**.

<figure><img src="/files/Y9MzDWKoe2Tsv2L04JV9" alt=""><figcaption><p>Scatter plot showing internal links vs indexation with two horizontal bands</p></figcaption></figure>

* **X-axis** — Number of internal inlinks (from the local crawler)
* **Y-axis** — Two bands: "Indexed" (top) and "Not Indexed" (bottom)
* **Green dots** = indexed URLs, **Red dots** = not-indexed URLs
* Dot sizes are uniform (no bubble chart)

You'll typically see orphan pages (low inlinks) clustered in the "Not Indexed" band, visually proving that pages need internal links to get indexed.

When log data is available, a **Hide Zero-Hit Pages** toggle appears to filter out URLs that Googlebot hasn't visited.

{% hint style="warning" %}
This chart requires the internal link crawler to have run. If the crawler hasn't been run yet, you'll see: *"Run the internal link crawler to see this chart."*
{% endhint %}

### Indexing Funnel

A horizontal bar chart showing **where your URLs currently sit** in the indexing pipeline. Each bar's width is proportional to the total sitemap count, so you can instantly see the distribution.

<figure><img src="/files/gnCPGKnt8vj9FmjOEO1V" alt=""><figcaption><p>Indexing Funnel showing distribution of URLs across pipeline stages with color-coded bars</p></figcaption></figure>

| Stage           | Color  | What it means                                                                     |
| --------------- | ------ | --------------------------------------------------------------------------------- |
| **In Sitemap**  | Gray   | Total URLs from your sitemap (baseline — always 100%)                             |
| **Discovered**  | Amber  | URLs Google knows about but hasn't crawled yet — may need better internal linking |
| **Crawled**     | Red    | URLs Google crawled but rejected — content quality or technical issues            |
| **Indexed**     | Green  | Successfully indexed and eligible to appear in search                             |
| **Impressions** | Violet | Indexed pages that received at least 1 impression in the selected period          |

Each bar shows the count and percentage of total. Hover over any bar for a description of what the stage means.

**Intentional Exclusions** are listed below the bars as a text summary:

* **Blocked by robots.txt** — URLs your robots.txt prevents Google from crawling
* **Excluded (noindex / duplicate canonical)** — URLs intentionally excluded from the index

{% hint style="info" %}
A large red "Crawled" bar relative to the green "Indexed" bar means Google is visiting your pages but rejecting the content. This is usually the most actionable insight — check those pages for thin content, duplicate issues, or soft 404s.
{% endhint %}

***

## Tab 3: Log Analyzer

The Log Analyzer tab combines data from **three sources** into a single actionable table:

1. **GSC URL Inspection API** — Coverage state for each URL
2. **Internal Link Crawler** — Inlink count per URL
3. **Server Log Files** — Googlebot hit counts from your server logs

<figure><img src="/files/SySsnzF2yLeyVsA6kkpm" alt=""><figcaption><p>Log Analyzer table showing URL, GSC Status, Inlinks, Log Hits, and Actionable Insight columns</p></figcaption></figure>

### Columns

| Column                 | Source             | Description                                                                  |
| ---------------------- | ------------------ | ---------------------------------------------------------------------------- |
| **URL**                | Any                | The page path (click to open in browser)                                     |
| **GSC Status**         | URL Inspection API | Coverage state badge. Shows **"Not in Sitemap"** for URLs found only in logs |
| **Inlinks**            | Local Crawler      | Internal link count. Shows "—" if crawler hasn't run                         |
| **Log Hits (30d)**     | Server Logs        | Googlebot hit count. Shows "—" if no log report linked                       |
| **Actionable Insight** | Computed           | Color-coded badge based on the rules below                                   |

### Actionable Insights

Each URL gets an automatically computed insight based on its data:

| Insight              | Color  | Condition                                                                     |
| -------------------- | ------ | ----------------------------------------------------------------------------- |
| **Healthy**          | Green  | URL is indexed                                                                |
| **High Crawl Waste** | Red    | High log hits + not indexed (Googlebot keeps visiting but Google won't index) |
| **Low Crawl Waste**  | Orange | Moderate log hits + not indexed                                               |
| **Orphan Page**      | Amber  | Few or zero internal links + not indexed (needs internal links)               |
| **Not in Sitemap**   | Purple | URL found in server logs but not in your sitemap                              |

The thresholds for "high" and "low" crawl waste and the orphan inlink threshold are configurable in [Settings](#actionable-insight-thresholds).

### Filters

* **URL search** — Text search across all URLs
* **GSC Status** — Faceted filter (select one or more coverage states, or "Not in Sitemap")
* **Insight** — Faceted filter (Healthy, High Crawl Waste, Orphan, etc.)
* **Inlinks** — Range filter (from/to)
* **Log Hits** — Range filter (from/to)

### CSV Export

Click the **Export CSV** button to download the full merged dataset as a CSV file. The export includes all columns and all rows (not just the current page).

{% hint style="info" %}
The Log Analyzer table works with whatever data is available. If you haven't run the crawler, the Inlinks column shows "—". If no log report is linked, the Log Hits column shows "—". The table is still useful with just GSC data alone.
{% endhint %}

***

## Settings

Click the **cog icon** in the top-right to open the Indexing Settings modal. The settings are organized into four sections.

<figure><img src="/files/hhFslXsK7K4EkFpRVe5e" alt="" width="563"><figcaption><p>Indexing Settings modal with auto-submit, normalization, thresholds, and crawler settings</p></figcaption></figure>

### Auto Submit for Indexing

| Setting                      | Description                                                                                                                                 |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| **Auto Submit for Indexing** | When enabled, automatically submits not-indexed URLs to Google via the Indexing API. URL inspection always runs regardless of this setting. |
| **Resubmission Cooldown**    | Minimum days between resubmission attempts for the same URL. Default: 7 days. Only shown when auto-submit is on.                            |

### URL Normalization

These settings control how URLs are normalized for matching across GSC data, server logs, and crawler results.

| Setting             | Description                                                                                                                                                                       |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Trailing Slash**  | How to handle trailing slashes: **Follow Sitemap** (default — strips trailing slashes), **Always Add**, or **Always Strip**                                                       |
| **Keep Parameters** | Query parameters to preserve (e.g., `p`, `page`, `id`, `lang`). Type a parameter name and press Enter to add it as a tag. All other parameters (including UTM tags) are stripped. |

The **Recalculate Normalized Paths** button recomputes all normalized paths when you change these settings. This affects how URLs are joined across the three data sources.

### Actionable Insight Thresholds

Configure the sensitivity of the Log Analyzer's insight engine:

| Setting                       | Default | Description                                                          |
| ----------------------------- | ------- | -------------------------------------------------------------------- |
| **High Crawl Waste (hits >)** | 20      | Log hits above this trigger "High Crawl Waste" for not-indexed pages |
| **Low Crawl Waste (hits >)**  | 5       | Log hits above this trigger "Low Crawl Waste" for not-indexed pages  |
| **Orphan Page (inlinks <)**   | 2       | Pages with fewer inlinks than this are flagged as orphan pages       |

### Internal Link Crawler Settings

| Setting                 | Default | Description                                                                                          |
| ----------------------- | ------- | ---------------------------------------------------------------------------------------------------- |
| **Requests per Second** | 1       | How fast the crawler visits your pages. Keep low to avoid overwhelming your server.                  |
| **Max Chrome Tabs**     | 5       | Number of concurrent headless Chrome tabs. Each uses \~50-100MB RAM.                                 |
| **Auto-Crawl Schedule** | Weekly  | How often the crawler runs automatically: **Weekly**, **Bi-weekly**, **Monthly**, or **Manual Only** |

{% hint style="warning" %}
The crawler uses headless Chrome to render pages (capturing JavaScript-rendered links). At the default rate of 1 request/second with 5 tabs, it processes \~300 pages/minute. A 2,000-URL batch takes about 7 minutes.
{% endhint %}

***

## How It Works Behind the Scenes

### URL Inspection

SEO Utils automatically inspects your URLs using the Google URL Inspection API every 4 hours. URLs are prioritized in this order:

1. **Never inspected** — New URLs from sitemap
2. **Content updated** — URLs where the sitemap lastmod changed
3. **Not indexed** — URLs that aren't indexed yet
4. **Indexed** — Re-checked on a rotating basis (lowest priority)

{% hint style="info" %}
Google enforces a limit of **2,000 URL Inspection API requests per day per property**. For sites with more URLs, SEO Utils automatically spreads inspections across multiple days.
{% endhint %}

### URL Normalization Pipeline

To join data from GSC (full URLs), server logs (request paths only), and the crawler (full URLs), all URLs pass through a normalization pipeline:

1. Strip protocol and hostname → `/blog/post`
2. Standardize trailing slashes (based on your setting)
3. Remove tracking parameters (UTM, gclid, fbclid, etc.)
4. Keep only configured structural parameters
5. Lowercase the path

This produces a `normalized_path` used for exact-match joins across all three data sources.

### Googlebot Verification

When importing server logs, SEO Utils verifies Googlebot requests using **Google's officially published IP ranges** (CIDR blocks). This prevents spoofed Googlebot user agents from polluting your data. IP ranges are refreshed daily from Google's public endpoint.

***

## Troubleshooting

<details>

<summary><strong>Chart shows "No chart data available"</strong></summary>

The chart requires at least one inspection batch to complete. Either:

* Click **Run Initial Scan** in the top-right to start an immediate inspection
* Wait for the automatic inspection cycle (runs every 4 hours)

Chart data is generated from inspection results, so URLs must be inspected before the chart has data to display.

</details>

<details>

<summary><strong>Dashboard shows "Based on 0/N URLs inspected"</strong></summary>

This means URLs have been discovered from your sitemap but haven't been inspected yet. This is normal on first setup. Click **Run Initial Scan** or wait for the automatic cycle.

</details>

<details>

<summary><strong>"No sitemaps found" error</strong></summary>

Your property doesn't have a sitemap configured in SEO Utils. Navigate to **Sitemaps** from the property navigation and add your sitemap URL.

</details>

<details>

<summary><strong>Velocity chart is empty</strong></summary>

The velocity chart only tracks URLs discovered **after** you set up SEO Utils. If all your URLs were already in the sitemap when you first connected, the chart has no data to show. Publish new content to your sitemap and the chart will populate as those URLs get indexed.

</details>

<details>

<summary><strong>Scatter plot says "Run the internal link crawler"</strong></summary>

The Internal Links vs. Indexation chart requires crawl data. Go to the **Visual Diagnostics** tab and click **Run Link Crawler** at the top. The scatter plot will populate once the crawl completes.

</details>

<details>

<summary><strong>Crawl Budget chart says "Link a log report"</strong></summary>

The Crawl Budget chart requires server log data. Create a log report in the **Log Analyzer** section of the sidebar, import your server logs, and make sure the report's domain matches your GSC property domain.

</details>

<details>

<summary><strong>Log Analyzer columns show "—"</strong></summary>

A dash means no data is available from that source:

* **Inlinks showing "—"** → Run the internal link crawler
* **Log Hits showing "—"** → Link a log report with server log data for this domain

The table still works with partial data — you don't need all three sources to use it.

</details>

<details>

<summary><strong>Inspection seems slow</strong></summary>

Each URL requires a network call to Google's API. Large sites with hundreds or thousands of URLs may take several minutes to complete a full inspection cycle. This is normal.

</details>

<details>

<summary><strong>Quota exceeded — inspections stopped</strong></summary>

Google limits URL Inspection API to 2,000 requests per day per property. When the quota is reached, remaining URLs are scheduled for the next day. The dashboard shows partial data based on what was inspected.

</details>

<details>

<summary><strong>Clicks and Impressions show 0 for all URLs</strong></summary>

Clicks and impressions come from Google Search Console performance data, which requires the GSC data sync to be running. Make sure your property has synced data (check the Performance page). The indexing dashboard joins with the performance data for the selected date range.

</details>


# My Go-To SEO Checklist with Google Search Console & GPTs

When I tackle SEO projects, I always start with these steps. They help me decide which keywords and pages need optimization, which ones should be removed, or where to add new content.

#### Step 1: Download all the query and page data from my Google Search Console account.

#### Step 2: Go over each prompt individually using my [Data Analyzer GPTs](https://chat.openai.com/g/g-3uK215Gt4-seo-utils-gsc-data-analyzer). Each prompt includes specific actions, so you'll know exactly what to do.

{% embed url="<https://drive.google.com/file/d/1YNadjXKZHTZNt1AyqtCGwBgRv7j8mZ_g/view?usp=sharing>" %}
Demo video on how to use Data Analyzer GPTs.
{% endembed %}

**#1. Prompt:** Find keywords that ranked on page 2 but are not mentioned in the title

**Action:** I add these keywords to the title. It's a simple tweak that can make a big difference.

***

**#2. Prompt:** Find keywords that ranked on page 2 but are not mentioned in the meta description **Action:** I make sure to include these keywords in the meta description for better relevance.

***

**#3. Prompt:** Find keywords that ranked on page 2 but are not mentioned in headings

**Action:** Adding these keywords to the headings helps in better structuring my content.

***

**#4. Prompt:** Find keywords that are not mentioned at all, but still ranking

**Action:** Sprinkle these keywords throughout my content to climb higher in search rankings.

***

**#5. Prompt:** Find keywords that have high impressions but are not mentioned.

**Action:** Ensure these keywords are mentioned in my content as Google already finds them relevant.

***

**#6. Prompt:** Find keywords that are getting a lot of impressions, but no or low clicks. These are potential opportunities. A high impression count means your site is showing up in search results, but a low click-through rate suggests that users are not finding your listing relevant or compelling enough to click.

**Action:** I focus on these keywords more, sometimes creating new content around them. It's all about converting views to clicks.

***

**#7. Prompt:** Find keywords that are ranking in position 3-11.

**Action:** Almost there, just put extra effort into these by optimizing my content and sometimes adding backlinks to boost them further.

***

**#8. Prompt:** Find keywords that have low average ranking positions but high CTR.

**Actions:** These keywords are already doing good in terms of CTR, just need to optimize content to get a higher rank.

***

**#9. Prompt:** Find keywords that have high average ranking positions but low CTR.

**Action:** Working on title or meta description to increase clicks on these well-positioned keywords.

***

**#10. Prompt:** Find question keywords that I can add to FAQ sections

**Action:** Add these to my FAQ section, answering popular queries directly.

***

**#11. Prompt:** Find keywords & pages that bring traffic to my site

**Actions:**

* You might find variations of your current keywords or entirely new phrases that you hadn’t considered before.
* Explore expanding this topic or using a similar approach (content or backlink strategy) for other topics.
* Consider creating more related content or enhancing existing content around these topics.

***

**#12. Prompt:** What are the topics that all keywords are covering? This will help you understand what topics are already covered on the website

**Action:** Find the topic gap by doing reverse-engineering on competitor's websites

***

**#13. Prompt:** Find keyword cannibalization

**Action:**

* First, I usually ignore the URLs that contain fragment symbols ("#"). GSC considers those URLs are pages, just make sure you have a correct canonical tag on your page.
* Then, I visit the pages that are ranking the same keywords as other pages and check if they haven't had any traffic in the last 3 months, I will delete them and do a 301 redirect. if you feel the content of the deleted page is good, consider merging its content with the content of the main page.

***

{% hint style="success" %}
**Output:** The GPTs will export the keyword list as a CSV file.
{% endhint %}

#### 🔑 If your keyword list is still large after using the prompts, here are some additional tips:

✅ Add the topic with the prompt. For example, "Find keywords that are not mentioned at all, but still ranking"

✅ Focus on long-tail keywords first. For example, "Find long-tail keywords that have high average ranking positions but low CTR"

✅ Focus on search intents. Are your users looking for information, trying to make a purchase, or seeking a specific website? Align your content with the user's intent for the keyword. "For example, Find informational keywords that are ranking in position 3-11"

{% hint style="info" %}
**Pro Tip:** With SEO Utils, use the Mentions filter to quickly see if your keyword is in the title, headings, or body of a page.

<img src="/files/eGn5RopL7nuEwEvAoHkc" alt="" data-size="original">
{% endhint %}

I hope these tips are useful for you. Cheers! 🎉🔥


# Auto-Indexing Tool

With this Auto-indexing tool, you can connect your personal Google Service Account to automatically submit many URLs for indexing.

{% hint style="danger" %}
This tool has been **deprecated**. Please use the **new version** integrated into the [Indexing Dashboard (Google Search Console integration)](/guide/google-search-console/indexing-dashboard).
{% endhint %}

### Set up the Web Search Indexing API and Google Service Accounts.

#### Step 1: Enable the Web Search Indexing API

Visit the Google Cloud Console at <https://console.cloud.google.com/> and create a Project.

<figure><img src="/files/CFvZcgzmvv00vlEcEnth" alt=""><figcaption><p>Create a project on Google Cloud Console</p></figcaption></figure>

In the top search bar, type "API" and select "Enabled APIs & services".

<figure><img src="/files/xh8InjZ9SvWuIoVCdufp" alt=""><figcaption><p>Select "Enabled APIs &#x26; services"</p></figcaption></figure>

Click "Library" on the left sidebar.

<figure><img src="/files/sVaGGHSNYZ4sUS5r4dku" alt="" width="346"><figcaption><p>Select "Library"</p></figcaption></figure>

Search for "**Web Search Indexing API**" in the top search bar and enable it, so you can access it with your Google Service Account

<figure><img src="/files/cToRd68kKKnvdY0RvMwj" alt="" width="563"><figcaption><p>Enable the Web Search Indexing API</p></figcaption></figure>

#### Step 2: Create a Google Service Account

In your [Google Cloud Console](https://console.cloud.google.com/) dashboard, search for "**Service Accounts**" and click on it.

<figure><img src="/files/Tr2CV1nTZyn8P1xWfuFo" alt=""><figcaption><p>Click on "Service Accounts"</p></figcaption></figure>

Hit the "Create Service Account" button, and enter a service account name. Then, hit the "Done" button.

<figure><img src="/files/qPRfSYz6SniFK5lXBvXc" alt=""><figcaption><p>Enter service account name</p></figcaption></figure>

Copy the email of the service account.

<figure><img src="/files/hFETkWV50Sq1DMvDrcri" alt=""><figcaption><p>Copy the email</p></figcaption></figure>

Click on the Service Account's email, select the "**KEYS**" tab, then click the "**Create new key**" button.

<figure><img src="/files/u28UGi6QrC1hwLUCLvdd" alt=""><figcaption><p>Create a key for your service account</p></figcaption></figure>

A model will pop up. Select "JSON" and click the "Create" button.

<figure><img src="/files/5xBREJGhbjELctiiQeSh" alt=""><figcaption><p>Select JSON in Key type field.</p></figcaption></figure>

After creating the key, Google will download it to your machine. Keep that file. We will need it in Step 3.

#### Step 3: Add the Google Search Console to SEO Utils

Access the **Google Service Accounts** menu from the App dropdown at the top-right corner.

<figure><img src="/files/BiYHLbih9jz9PEyvzep1" alt="" width="563"><figcaption><p>Access the Google Service Accounts menu</p></figcaption></figure>

Then, click the **Add Account** button, and select the JSON file that you downloaded in Step 2 to add a new account.

{% hint style="warning" %}
**Google Indexing API Rate Limit**

Google only allows you to submit 200 URLs per day via the Indexing API. There are 2 ways to bypass this.

1. [Request more quota](https://developers.google.com/search/apis/indexing-api/v3/quota-pricing).
2. Create multiple projects and Google Service Accounts by repeating Step 1 to Step 3. Please note that you have to create a new project and then create a new Google Service Account in that new project because Google limits the API usage per project, not per Google Service Account.
   {% endhint %}

After creating an account, please copy the Google Service Account email address.

<figure><img src="/files/hYDNzOy3Mtrtm31pejXU" alt=""><figcaption><p>Copy the Google Service Account email address</p></figcaption></figure>

Visit your Google Search Console, select the site that you want to submit for indexing. Click on **Settings** > **Users and Permissions**.

<figure><img src="/files/4O2nLh9lUyOX7UK5NLzj" alt=""><figcaption></figcaption></figure>

Click the "**Add User**" button, then paste the Google Service Account that you copied previously. Select "Owner" permission for the new user.

<figure><img src="/files/NRAbc6Sk0Br8w7hFcvWX" alt=""><figcaption><p>Add a new user</p></figcaption></figure>

{% hint style="info" %}
If you have multiple Google Service Accounts, you will need to add multiple users.
{% endhint %}

### Connect your Google Search Console Sites & Sitemaps

If you haven't connected a site on your Google Search Console, please follow [this guide](/guide/google-search-console) to do that.

After connecting a site, SEO Utils will pull all the sitemaps that you entered on your Google Search Console.

If you haven't added a sitemap to your Google Search Console account, you can add sitemaps manually on SEO Utils

<figure><img src="/files/zB3WteWQJ1L2w9a9Xehi" alt=""><figcaption><p>Add a sitemap manually.</p></figcaption></figure>

{% hint style="info" %}
You can add as many sitemaps as you want.
{% endhint %}

After adding sitemaps, you can fetch all URLs from them by clicking the "**Fetch URLs From All Sitemaps**" action. SEO Utils will pull all URLs from all sitemaps and check the index of every single URL.

<figure><img src="/files/acIj4CIhhy1fDw1Mcgv1" alt=""><figcaption><p>Fetch URLs From All Sitemaps</p></figcaption></figure>

### Checking Index

You can trigger a process to bulk-check the index for all URLs on your site by clicking the **Check Index** action.

<figure><img src="/files/LoWiyh3tEn0x6qqDFwON" alt=""><figcaption><p>Bulk-check index</p></figcaption></figure>

You can also check index for a single URL by clicking the vertical dots icon.

<figure><img src="/files/xqeZtiiboITFPkNRuZ7y" alt="" width="375"><figcaption><p>Check index for a URL</p></figcaption></figure>

#### Two Checking Index Methods

**#1. Using Google Search Console API (default)**

Since March 4, 2024, SEO Utils has supported checking index by using [Search Console URL Inspection API](https://developers.google.com/search/blog/2022/01/url-inspection-api). This method has some pros when compared to method #2 which uses the "site:url" operator.

* Do not require proxies, so no extra cost.
* Faster, can check 10 URLs per second.
* Easy to set up, just need to enable the Google Search Console API.

However, there are some [quota limits](https://developers.google.com/webmaster-tools/limits#url-inspection). The quota is enforced per Search Console [website property](https://support.google.com/webmasters/answer/34592) (calls querying the same site):

* 2,000 queries per day
* 600 queries per minute

So if you reach the limit, you might want to switch to the #2 method.

Moreover, the Google Search Console API method also gives you [some extra information](https://developers.google.com/webmaster-tools/v1/urlInspection.index/UrlInspectionResult) that the second method doesn't provide like

* Indexing State
* Coverage State
* Crawled Date

You can hover on the blue "info" icon to see that information.

<figure><img src="/files/8dETeF9IufpeL42T1YRb" alt="" width="563"><figcaption><p>Extra information that the first method gives you.</p></figcaption></figure>

{% hint style="info" %}
There is a filter for the Indexing State, so you can tell why the URL is not allowed to be indexed.

<img src="/files/ynZc2XnzhQ3fsCMVlsYB" alt="" data-size="original">
{% endhint %}

**#2. Using the "site:url" Operator**

When using this method, SEO Utils will search Google using the "site:url" operator to see if the URL is on the SERP.

This method doesn't have a quota limit but you want to consider [using Proxies](/guide/how-to-use-proxies) to prevent Google from blocking your IP when checking thousands of URLs.

#### Switching Method

You can click on the "cog icon" button to switch the method. The method is saved on the site scope, which means you can use method #1 for site A and method #2 for site B.

<figure><img src="/files/0vLA45OaLCkpzTcDvAXt" alt=""><figcaption><p>Switching checking index method.</p></figcaption></figure>

<figure><img src="/files/6O02fc39PPvCNieX8XNX" alt="" width="563"><figcaption><p>Click the "Update" button to save the settings.</p></figcaption></figure>

### Submitting Index

Just like the "Check Index" action, you can submit either multiple URLs or just one URL for indexing.

When you bulk-submit URLs, SEO Utils will submit all URLs regardless of their indexed or submitted status.

### Auto Index Feature

SEO Utils provides an auto-pilot mode so you don't need to pull URLs from sitemaps, check & submit index manually.

To enable the Auto Index feature of a site, please ensure that you toggle the **Auto Index** field on.

<figure><img src="/files/Nnps825hOFyu8WHf5muW" alt=""><figcaption><p>Enable Auto Index for sites</p></figcaption></figure>

You can also enable the Auto Index feature for specific sitemaps by visiting the Sitemaps list page.

<figure><img src="/files/blEbzLsjQVcWrTlVnx0b" alt=""><figcaption><p>Enable Auto Index for all URLs of a specific sitemap</p></figcaption></figure>

You can tell if a URL is enabled for auto-indexing if the URL is yellow like this.

<figure><img src="/files/a4V4BGxxXDkkJj9qYDZ7" alt=""><figcaption><p>URLs are disabled for auto-indexing</p></figcaption></figure>

{% hint style="info" %}
When URLs are disabled for auto-indexing, SEO Utils won't automatically check and submit them for indexing. However, you still can manually do that by using "**Check Index**" & "**Submit Index**" actions.
{% endhint %}

{% hint style="info" %}
To use the Auto Index feature, you need to keep SEO Utils running on your machine or use a VPS, so you don't need to keep your computer on constantly.
{% endhint %}

#### Auto Pull URLs From Sitemaps

SEO Utils will pull URLs from all sitemaps daily at **5:00 AM (your local time)** to get new URLs and check if the existing URLs have content updated by using the Last Mod field.

<figure><img src="/files/azVKY3i6v4YCZBbNItF4" alt=""><figcaption><p>Using Last Mod field to detect if the content of a URL is updated.</p></figcaption></figure>

{% hint style="success" %}
If a URL has updated content, SEO Utils will resubmit it for indexing, regardless of the submission status.
{% endhint %}

#### Auto Check Index

SEO Utils will check index of all sites that enable the Auto Index feature at **6:00 AM (your local time).**

**Note:** It will skip the URLs that belong to a sitemap with the Auto-Index setting turned off.

{% hint style="info" %}
Please consider [using Proxies](/guide/how-to-use-proxies) if you have many URLs to check index.
{% endhint %}

#### Auto Submit Index

SEO Utils will submit for indexing all sites that enable the Auto Index feature **every 10 minutes**.

**Note:**

* It will skip the URLs that belong to a sitemap with the Auto-Index setting turned off.
* The auto-pilot mode only submits URLs that have already been checked for indexing. You don't have a setting to ignore this behavior like when running the "**Submit Index**" action manually.

### Override the Auto-Mode Behavior

This is the default behavior of the Auto-mode

* **Checking index**: If a URL is already **indexed**, it won't re-check index for that URL in the subsequent runs.
* **Submitting index**: If a URL is already **submitted** or **indexed**, it won't re-submit that URL in the subsequent runs.

If you would like to override those behaviors, please open the Site setting modal.

<figure><img src="/files/hbEKi7BMRvJiO8zIN8Qi" alt=""><figcaption><p>Open the setting modal.</p></figcaption></figure>

You will see 2 fields:

* **Auto Recheck Index After** field: You can specify the number of days to recheck the index even if the URL is already indexed.
* **Auto Resubmit Index After** field: You can specify the number of days to resubmit URLs even if URLs are already submitted but not indexed.

<figure><img src="/files/KEKwCUJDQqckNI2lsvMM" alt=""><figcaption><p>Override the Auto-mode behavior</p></figcaption></figure>

{% hint style="info" %}
Those two fields will only be shown if you **turn on the Auto mode** for the site.
{% endhint %}

### Quick Tips

You can view all the logs of check and submit for indexing of each URL by clicking the log bar at the bottom.

<figure><img src="/files/CLG4EZFHrB9eiaqOJf7T" alt=""><figcaption><p>View logs</p></figcaption></figure>

You can quickly switch between pages on a site by using the dropdown menu in the header section.

<figure><img src="/files/V2MZj11GqlvGajVBfqoV" alt=""><figcaption><p>Quickly move to a page</p></figcaption></figure>

### Updates on March 22, 2024

You can now set which Google service accounts you want to use on specific sites.

For example, if you set up a Google Search Account can be used on site A. SEO Utils will only use that account to check & submit index for that site only.

<figure><img src="/files/KVKv7A9dNkoHgyFZ2Lbj" alt=""><figcaption><p>Set site scopes for each Google Service Account</p></figcaption></figure>

<figure><img src="/files/JlYD9Pxb60yvVxsaQbDf" alt=""><figcaption><p>Select a site where you want to use the Google Service Account.</p></figcaption></figure>


# IndexNow

While the [Auto-Indexing tool](/guide/auto-indexing-tool) only submits your URLs to Google, the [IndexNow](https://www.indexnow.org/index) tool submits your URLs to many other search engines like Bing, Yandex, Naver, Seznam.cz, and Yep with just **one submission**.

### How to Integrate IndexNow to SEO Utils?

#### Step 1: Get an API Key

Visit <https://www.bing.com/indexnow/getstarted>, you will see a form like this to generate an API key.

<figure><img src="/files/ImO90ro4VcHdM59nFGWz" alt=""><figcaption><p>Generate a IndexNow API key</p></figcaption></figure>

Click the "**Generate**" button to get an API Key, then click the "**Download**" icon to download the API Key file.

<figure><img src="/files/q6yBT35LE5Y3FMCJdsY8" alt=""><figcaption></figcaption></figure>

#### Step 2: Upload the Key File to the Root of Your Website

You will need to host your downloaded key file (Step 1) at the root of your website.

If your website domain is **tuikhoeconban.com**, then the file should be located at <https://tuikhoeconban.com/c52ff0461aee4edf836b8ff0d24c5ff8.txt>

You can visit that URL to validate if the file is uploaded successfully.

#### Step 3: Add Sitemap URLs to SEO Utils

Open the SEO Utils app and click the IndexNow in the left sidebar to access the tool.

<figure><img src="/files/mXT84BTOhVgZgyw8AcyT" alt=""><figcaption><p>IndexNow tool in SEO Utils</p></figcaption></figure>

Click the "Import URLs" button or the "Plus" icon to add sitemap URLs.

<figure><img src="/files/aSpYQOg2pGnWUNLxvw78" alt=""><figcaption><p>Add sitemap URLs</p></figcaption></figure>

After adding sitemap URLs, SEO Utils will import all the URLs. You can also switch the sites by using the Site dropdown.

<figure><img src="/files/Ohn4YPKKYTO6S6KXAYeC" alt=""><figcaption><p>Switching to a site to view URLs</p></figcaption></figure>

#### Step 4: Add IndexNow API Key to Sites

While selecting a site, you will see the "Cog" icon. Click on it to open the settings modal.

<figure><img src="/files/1ie7Uqga1yTrGnCeNRqF" alt="" width="563"><figcaption><p>Open the Site Settings modal</p></figcaption></figure>

Enter the IndexNow API Key you got from **Step 1** and hit the "Save" button.

<figure><img src="/files/ErdsVoITCW3SrJ6DFnuG" alt=""><figcaption><p>Enter the API Key</p></figcaption></figure>

Now, all the setup is done. You are ready for indexing submission!

### Checking Index <a href="#checking-index" id="checking-index"></a>

You can trigger a process to bulk-check the index for all URLs on your site by clicking the **Check Index** action.

<figure><img src="/files/5oGbuLuRzjjUtw5uKvFi" alt=""><figcaption><p>Bulk check index action</p></figcaption></figure>

You can also check index for a single URL by clicking the vertical dots icon.

<figure><img src="/files/1M7vy8fnyNGg2vG71ctp" alt="" width="563"><figcaption><p>Check index for a URL</p></figcaption></figure>

{% hint style="info" %}
SEO Utils will search Bing and other search engines using the "site:url" operator to see if the URL is on the SERP.

You want to consider [using Proxies](https://help.seoutils.app/guide/how-to-use-proxies) to prevent the search engines from blocking your IP when checking thousands of URLs.
{% endhint %}

### Submitting Index <a href="#submitting-index" id="submitting-index"></a>

Just like the "Check Index" action, you can submit either multiple URLs or just one URL for indexing.

When you bulk-submit URLs, SEO Utils will submit all URLs, regardless of their indexed or submitted status.

<figure><img src="/files/HdkQVkuASUhEhNvB7lX5" alt=""><figcaption><p>Bulk submit index action</p></figcaption></figure>

### Scheduled Jobs (Auto-mode)

* SEO Utils will pull URLs from all sitemaps daily at **5:00 AM (your local time)** to get new URLs and check if the existing URLs have content updated by using the Last Mod field from your sitemaps.
* SEO Utils will auto-check index of all sites at **6:00 AM (your local time).**
* SEO Utils will auto-submit your sites for indexing **every 10 minutes**.

{% hint style="info" %}
SEO Utils also detects when your content has been added or updated; it will automatically resubmit the URL. Just make sure to keep the app open at all times.
{% endhint %}

### Override the Auto-Mode Behavior

This is the default behavior of the Auto-mode

* **Checking index**: If a URL is already **indexed**, it won't re-check index for that URL in the subsequent runs.
* **Submitting index**: If a URL is already **submitted** or **indexed**, it won't re-submit that URL in the subsequent runs.

If you would like to override those behaviors, please open the Site setting modal.

<figure><img src="/files/4PiNdTbJxAcKiuj8VoYz" alt=""><figcaption><p>Open the setting modal.</p></figcaption></figure>

You will see 2 fields:

* **Auto Recheck Index After** field: You can specify the number of days to recheck the index even if the URL is already indexed.
* **Auto Resubmit Index After** field: You can specify the number of days to resubmit URLs even if URLs are already submitted but not indexed.

<figure><img src="/files/VNzZTjjPKXiJtL3L7xCA" alt=""><figcaption><p>Override the Auto-mode behavior</p></figcaption></figure>

### Troubleshooting

#### URL received. IndexNow key validation pending

When you have just added a new API key and try to submit the index, you will see a message: "URL received. IndexNow key validation pending." This is because IndexNow needs to validate the API key with the file you uploaded to your website.

This message will disappear after a couple of minutes.

#### How to Fix 403 Forbidden Error: User is unauthorized to access the site. Please verify the site using the key and try again

This error occurs when IndexNow is unable to verify your site because you entered the wrong API key or the uploaded file was not located at the root of your website.

If this error keeps happening, you will need to **regenerate an API key** and complete the setup process again.

{% hint style="info" %}
If you have any further questions, please visit the FAQs section on the IndexNow website at <https://www.indexnow.org/faq>
{% endhint %}

### Two Checking Index Methods

Since version 1.17.0, SEO Utils now supports using the **Bing Webmaster Tools API** to check if a URL is indexed on Bing.com, in addition to the traditional **"site:url"** operator method.

To switch the checking index method of a site, please open the site setting modal.

<figure><img src="/files/ecH1bUgVOpo4rsSNiw4L" alt=""><figcaption><p>Open the site setting modal.</p></figcaption></figure>

You can select the Bing Webmaster Tools API option from the "**Checking Index Method**" field.

<figure><img src="/files/SPvRe3ELwzQXYzh22hd0" alt=""><figcaption></figcaption></figure>

You are required to enter a Bing Webmaster Tools API key. To get one, please visit <https://www.bing.com/webmasters/tools>.

Then, open the Settings panel to access the **API access** menu.

<figure><img src="/files/UigMxO5L2TB26dj17KQE" alt=""><figcaption><p>API access from Settings panel</p></figcaption></figure>

Select the **"API Key"** menu to continue.

<figure><img src="/files/5svvTo8jgm3aLOYIYCU1" alt="" width="375"><figcaption></figcaption></figure>

After creating an API Key, please copy it and paste it into the **Bing Webmaster Tools API Key** field on SEO Utils.

<figure><img src="/files/sZietrYGMcOuKMvANHDE" alt="" width="375"><figcaption></figcaption></figure>

That's all! Now, you can check the index of URLs by using the Bing Webmaster Tools API.


# Google My Business Rank Tracker

This tool lets you track your Google Business profile's ranking on Google Maps search results for specific locations. It also provides insights about your competitors, helping you develop strategies to improve your ranking.

<figure><img src="/files/HF3lBOVlzwBcKsFqp8lc" alt=""><figcaption><p>Google My Business Rank Tracker tool</p></figcaption></figure>

### Setup the Google Places API

1. Visit <https://console.cloud.google.com/>
2. Choose an existing project or create a new one.
3. Search for "**API & Services**" in the top search bar.

<figure><img src="/files/wH6EgLIkJGBGKPVjfcxS" alt=""><figcaption><p>Search for "API &#x26; Services"</p></figcaption></figure>

4. Click on the "**Library**" in the left sidebar.

<figure><img src="/files/2XnuMMK4Orlh41gbvE5F" alt="" width="563"><figcaption><p>Select "Library" from the left sidebar.</p></figcaption></figure>

5. Search for "Places API" in the search bar and make sure to select **Places API (New).** Then enable it.

<figure><img src="/files/cntbxpaibftwAi96FAza" alt="" width="563"><figcaption></figcaption></figure>

6. Do another the search for "**Maps JavaScript API**" in the search bar and enable it.

<figure><img src="/files/t6TboeVyKsLUFmtkFIrJ" alt="" width="563"><figcaption></figcaption></figure>

7. Do another search for "**Geocoding API**" and enable it.

<figure><img src="/files/i5RZu9v4G1Y4iDu0XsN3" alt="" width="563"><figcaption></figcaption></figure>

8. Visit the **Key & Credentials** from the left sidebar. Then, click the "Create Credentials" button at the top to add a new **API key**.

<figure><img src="/files/I1MyvAes7rOhcjVIBymw" alt="" width="563"><figcaption></figcaption></figure>

9. *\[Optional]* After creating an API key, you can name it for easy identification. There's no need to restrict the key since it stays on your machine and remains invisible to others.

<figure><img src="/files/QXIxswtphQfSFIfvu1Xz" alt="" width="563"><figcaption><p>Click the "Edit API Key" button to name your API Key.</p></figcaption></figure>

10. Finally, copy the API key and paste it into SEO Utils's settings page.

<figure><img src="/files/Z0OIQcEuwZde8EmLRJLF" alt=""><figcaption><p>You can access the settings page from the top-right <strong>App dropdown</strong> in SEO Utils app.</p></figcaption></figure>

{% hint style="warning" %}
Google might require adding billing information because Google Places API is an enterprise API. However, they will give you $200 free credit every month, and SEO Utils only use that API to search for the location. It's not even a $1 per month fee.
{% endhint %}

### Create Your First Rank Tracking Grid

After setting up a Google Places API key, go to the Google My Business (GMB) Rank Tracker tool in the left sidebar.

Then, click the "Create Rank Tracking Grid" button to start creating your first rank tracking grid.

<figure><img src="/files/W6g9j62KJtgP4bU8d6Qa" alt=""><figcaption><p>Access the Google My Business Rank Tracker tool</p></figcaption></figure>

You'll find a search bar at the top. Start typing the name of your target business, and it will suggest business locations using the Google Places API that you integrated in the first step.

<figure><img src="/files/3HyBeyVJzQLtTO7AgSNj" alt=""><figcaption><p>Search for your target business.</p></figcaption></figure>

**Updated June 13, 2024: Adding a business using Google Maps URL.**

Since version 1.15.3, you can add a business using a Google Maps URL. This is especially useful for adding Service Area Businesses (SAB) that don't have a physical address and therefore aren't listed in the Google Places API.

<figure><img src="/files/nvc4K4JjxUPD3pKz3ZxS" alt=""><figcaption></figcaption></figure>

*This is an example of a Google Maps URL:* <https://www.google.ca/maps/place/Sequoia+TreeScape+Tree+Service/@44.043951,-79.4501204,17z/data=!3m1!4b1!4m6!3m5!1s0x882ad2157062b6c3:0xe060d065957c4103!8m2!3d44.043951!4d-79.4501204!16s%2Fg%2F1hhwl0yp8?entry=ttu>

After selecting a business, you can choose a grid size from the Gird Size dropdown.

<figure><img src="/files/bQFQVDgmm6OH4Q3insKK" alt=""><figcaption><p>Select a grid point preset</p></figcaption></figure>

The **"3x3" preset** creates 9 markers on the map, each with its own coordinates to track the ranking of your business.

You can click on a marker to enable or disable it. If a marker is disabled, SEO Utils won't track the ranking for that location.

To remove a marker, simply click the "X" button attached to it.

<figure><img src="/files/b1yI9ZpYp6kgnAduLZM6" alt=""><figcaption><p>Disabled markers</p></figcaption></figure>

{% hint style="info" %}
**Tip**: To save resources, you should disable or remove markers in areas where you know nobody will be searching for keywords, such as in the sea or other irrelevant locations. You can do this automatically using the **Auto-Disable Uninhabited Markers** feature described below.
{% endhint %}

#### Auto-Disable Uninhabited Markers

When you place a grid over coastal areas, islands, or regions with large forests or deserts, some markers will inevitably land on locations where no one lives — making them pointless for tracking rankings. Instead of manually disabling each one, you can use the **Auto-Disable** button to handle this automatically.

Click the **Eraser button** in the top-right corner of the map. SEO Utils will check all enabled markers against OpenStreetMap data and automatically disable any that fall on:

* **Water** — oceans, seas, lakes, rivers
* **Forests & woodlands**
* **Deserts, sand, and bare rock**
* **Wetlands & marshes**
* **Glaciers**
* **Military zones**

<figure><img src="/files/7oZRvj6ikxz83BpSOfgM" alt=""><figcaption><p>The Eraser button auto-disables markers in uninhabited areas like water and forests</p></figcaption></figure>

After the check completes, a notification will tell you how many markers were disabled. You can always re-enable any marker by clicking on it.

{% hint style="info" %}
The check sends your marker coordinates to public OpenStreetMap servers — no API key is required. For a 7×7 grid, it typically takes 3–5 seconds to complete.
{% endhint %}

You can also add a custom marker by clicking anywhere on the map.

<figure><img src="/files/4TWhtKzaBTezqhTkwBgh" alt=""><figcaption><p>Add custom markers</p></figcaption></figure>

{% hint style="info" %}
The "No preset" option provides you with a blank map, allowing you to add all markers manually.
{% endhint %}

#### Use Radius Field

The “**Use Radius**” field lets you choose between two methods for defining grid spacing. When enabled, it allows you to create a grid centered on a specific point using a defined radius.

For example, if you set the radius to 2 miles and the grid size to 11x11, SEO Utils will generate a grid extending 2 miles in all directions from the center point.

<figure><img src="/files/wYT9t4145Sbwb7n5uQV9" alt=""><figcaption><p>Use Radius is ON &#x26; Radius = 2 miles</p></figcaption></figure>

Alternatively, if the “**Use Radius**” field is turned off, you can directly adjust the spacing between individual grid points.

<figure><img src="/files/FCtymyT10fVdZSSmEbXY" alt=""><figcaption><p>Use Radius is OFF &#x26; Grid Point Spacing = 2 miles</p></figcaption></figure>

{% hint style="info" %}
In crowded areas, a smaller radius, like 1-1.5 miles, is typically better. In rural areas, you might want to expand the radius up to 10 miles.

You can change the "**Unit**" setting to Miles or Meters. SEO Utils automatically sets the unit to Miles if your default location is in the US; for other locations, it uses Meters.
{% endhint %}

When everything is set, click the blue "**Play**" button to continue. A modal will pop up; let's go through all the fields together to fully understand them.

<figure><img src="/files/x5wSKP9MkT9RxGMwtRdf" alt=""><figcaption><p>Create report modal</p></figcaption></figure>

1. **Report name:** You can set a report name in this field. Default value is your business address.
2. **Location / Language:** Select the location and language relevant to where your business is situated.
3. **Keywords**: Enter the list of keywords you want to track.
4. You can also choose how often you want the report to be updated. There are four options:

<figure><img src="/files/xEcKkzFh84EeLC3AVw8J" alt="" width="563"><figcaption></figcaption></figure>

* **Weekly**: SEO Utils will check the ranking for all keywords every Monday.
* **Twice per month**: SEO Utils will check the ranking twice per month - once during the 1st-14th period and once during the 15th-end of month period.
* **Monthly**: SEO Utils will check the ranking for all keywords on the first day of each month.
* **One time**: The ranking will be checked just once after you create the report, but you can rerun the report manually whenever you choose.

5. If you want to schedule report runs during business hours or days for more accurate ranking results, you can set it up as shown in the following image:

<figure><img src="/files/GYpRhUXtrZ50Ay9InNBF" alt=""><figcaption><p>Set time window and timezone.</p></figcaption></figure>

{% hint style="info" %}
To have SEO Utils automatically re-run the report, you will need to keep the app open.
{% endhint %}

#### How Schedule Day Selection Works

When you disable "Run on any days", you can select specific days for your report to run. The selection type depends on your schedule frequency:

| Schedule            | Selection Type                | Behavior                                                             |
| ------------------- | ----------------------------- | -------------------------------------------------------------------- |
| **Weekly**          | Multi-select (checkboxes)     | Report runs once on **each** selected day per week                   |
| **Twice-per-month** | Single-select (radio buttons) | Report runs once per period (1st-14th, 15th-end) on the selected day |
| **Monthly**         | Single-select (radio buttons) | Report runs once per month on the selected day                       |

**Examples:**

* **Weekly + Monday & Friday selected**: Report runs every Monday AND every Friday (2 runs/week)
* **Monthly + Monday selected**: Report runs once per month, only on Mondays (if the 1st is a Wednesday, it waits until the first Monday)
* **Twice-per-month + Friday selected**: Report runs on the first Friday of each half-month period (2 runs/month max)

{% hint style="warning" %}
For Monthly and Twice-per-month schedules, only one day can be selected. This prevents confusion about when exactly the report should run within each period.
{% endhint %}

{% hint style="info" %}
**Manual runs affect scheduled runs:** If you have a Weekly report scheduled for Sunday but manually run it on Wednesday, the scheduled Sunday run will be skipped because a snapshot already exists for that week. The same applies to Monthly and Twice-per-month schedules—one snapshot per period.
{% endhint %}

6. **Scrape Data With**: Select the method you want to scrape the SERP data.

* **SERP API: DataForSEO**. Use SERP API from DataForSEO to scrape SERP data.
* **My IP (Coming soon):** SEO Utils use your IP to scrape SERP data. This is not recommended if you have over 100 grid points to check.
* **Proxies (Coming soon):** Use proxies to scrape SERP data. See how to set up a proxy [here](https://help.seoutils.app/guide/how-to-use-proxies).

{% hint style="warning" %}
**Important:** To use the SERP API, you must have your own DataForSEO account. [Renting API key services](/guide/rent-dataforseo-api-key) isn't viable because DataForSEO restricts certain endpoints that I utilized to implement the Queue mode. If multiple users rely on a rented API key from my account, it will slow down the process for everyone. For the quickest results, using your own DataForSEO account is the best approach.
{% endhint %}

This section will also display the cost for each run, but only for the **SERP API: DataForSEO** method, as the other methods do not involve pay-as-you-go costs.

<figure><img src="/files/zTOTdPdjxKudM4kdWZTo" alt="" width="563"><figcaption><p>Cost for each run using <strong>SERP API: DataForSEO</strong> method.</p></figcaption></figure>

After clicking the "Create Report" button, you will be redirected to the report dashboard. Here, you can view all the snapshots within that report, see the rankings for each grid point, and check the list of competitors.

#### Updates on v1.21.0

Since v121.0, you can set the grid shape to Square or Circle.

<figure><img src="/files/KLVuE4qzJrEBJVk0xxBb" alt="" width="563"><figcaption><p>Set the shape for grid to Circle.</p></figcaption></figure>

#### Custom Polygon Grid

In addition to Square and Circle grids, you can select **Polygon** as the grid shape. This lets you draw a custom boundary on the map and distribute pins only inside that area — useful for targeting specific neighborhoods while avoiding water, forests, highways, or other irrelevant zones.

**How to use:**

{% stepper %}
{% step %}
**Select Polygon Grid Shape**

In the Grid Shape dropdown, select **Polygon**. Drawing mode activates automatically — you'll see the "Drawing Mode" button highlighted and a help text prompting you to click on the map.

<figure><img src="/files/ESvpU9MmTTlz5FxLwsLX" alt="" width="563"><figcaption><p>Polygon mode with drawing indicator active</p></figcaption></figure>
{% endstep %}

{% step %}
**Draw Your Polygon**

Click on the map to place polygon vertices. Click the first point again to close the polygon. After drawing, you can drag vertices to adjust the shape.

<figure><img src="/files/tCm0APGGP3hVCRY3YA4c" alt="" width="563"><figcaption><p>Drawing a polygon on the map</p></figcaption></figure>
{% endstep %}

{% step %}
**Choose Distribution Mode & Generate Pins**

Select a **Pin Distribution** mode and click **Generate Pins**:

| Mode           | Description                                                                                             |
| -------------- | ------------------------------------------------------------------------------------------------------- |
| **Grid-based** | Places pins in a uniform grid pattern inside the polygon, spaced according to your Grid Spacing setting |
| **Random**     | Distributes the specified number of pins randomly inside the polygon                                    |

<figure><img src="/files/VPOdNuhYSfeCkIRZ31jA" alt=""><figcaption><p>Grid-based pins distributed inside the polygon</p></figcaption></figure>
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
For **Grid-based** distribution, make sure the Grid Spacing is small enough relative to your polygon size. For example, a polygon covering a 1-mile area needs 0.1 miles spacing (not 0.5 miles) to generate a dense grid. If the spacing is too large, you'll see very few pins.
{% endhint %}

{% hint style="info" %}
Generated polygon pins work exactly like regular grid markers — you can enable/disable, drag, delete, and use the Auto-Disable Uninhabited Markers feature on them.
{% endhint %}

### How to Use the Report Dashboard

Please check out the images below to see how to navigate and use the report dashboard effectively.

<figure><img src="/files/0X0884gCcY7YvfmbLOFe" alt=""><figcaption><p>Report dashboard in the first view</p></figcaption></figure>

You can select different keywords to view their respective data.

<figure><img src="/files/dgSUMUD9TpNd74aHQxBi" alt=""><figcaption></figcaption></figure>

Statistics of the current report:

<figure><img src="/files/nX7jwYeerpahtCGA1G0D" alt=""><figcaption><p>View statistics of the current report in the Overview tab.</p></figcaption></figure>

Click on a grid point to view the competitors that are ranking at that specific location.

<figure><img src="/files/J7hMXOiU7UuctxLG5i1m" alt=""><figcaption><p>Click on a grid point to view more data.</p></figcaption></figure>

You can navigate to the "Competitors" tab to view a list of competitors who are ranking for the selected keywords.

<figure><img src="/files/iIQ3jIGiib7wScVmdJ95" alt=""><figcaption><p>View all competitors across all grid points in the current snapshot.</p></figcaption></figure>

You can also click on the business name to see where your competitors rank on the map, making it easy to compare with your own ranking.

<figure><img src="/files/JQCeomJPmPGpccVDHLbS" alt=""><figcaption><p>Click on the Business Name to view its ranking on the map.</p></figcaption></figure>

### Marker & Map Interactions

#### Moving Markers

You can move a marker by dragging and dropping it to a new position. You can also hold the **Shift** key to select and move multiple markers simultaneously.

<figure><img src="/files/BTutVEhMh4FK7QPDOvH6" alt=""><figcaption><p>Moving markers around</p></figcaption></figure>

#### Bulk Delete Markers

You can hold the **Shift** key to select multiple markers and press the **Delete** or **Backspace** key to delete them all at once.

#### Use Measuring Tool

[Since v1.30.0](https://help.seoutils.app/changelog#v1.30.0), you can measure the distance between two or multiple points on the map using the measuring tool.

<figure><img src="/files/EZCTr0aiv0wFZSmD1m4u" alt=""><figcaption></figcaption></figure>

#### Demographics Layer (Census Data)

The Demographics layer lets you visualize population data directly on your ranking grid map. This helps you identify which areas have the most potential customers and understand the demographics of your service area.

<figure><img src="/files/nqiwtiDAkalhxmc92k4E" alt=""><figcaption><p>Demographics Layer for GMB Rank Tracker</p></figcaption></figure>

**Data Sources:**

* **US Locations**: Data is pulled directly from the **US Census Bureau** (free, no API key required). This provides detailed tract-level data including population density, median household income, homeowner percentage, and median age.
* **UK Locations (England & Wales)**: Data is pulled from the **ONS Census 2021** and **ONS Small Area Income Estimates** (free, no API key required). This provides LSOA-level data including population density, average household income (£), homeowner percentage, and median age.
* **Australia**: Data is pulled from the **ABS Census 2021** (free, no API key required). This provides SA2-level data including population density, median household income (A$), homeowner percentage, and median age.
* **Canada**: Data is pulled from **Statistics Canada Census 2021** (free, no API key required). This provides ADA-level data including population density, median household income (C$), homeowner percentage, and median age. Covers all of Canada including rural areas.
* **Other International Locations**: Uses **Geoapify API** (requires API key). This provides basic population and density data at the city/locality level.

{% hint style="info" %}
**US, UK, Australian, and Canadian users don't need to configure anything** — demographic data works automatically without any API key. UK data covers England and Wales (Geoapify is used as a fallback for Scotland and Northern Ireland).
{% endhint %}

**Setup for Other International Users:**

If you're tracking businesses outside the US, UK, Australia, and Canada, you'll need a Geoapify API key:

1. Visit [geoapify.com](https://www.geoapify.com/) and create a free account
2. Go to your dashboard and create a new API key
3. In SEO Utils, go to **Service Settings** > **Google My Business Rank Tracker**
4. Paste your API key in the "Geoapify API Key" field

{% hint style="warning" %}
**Note**: Geoapify data is less granular than US, UK, Australian, or Canadian Census data. It only provides population and density at the city/locality level, without income, homeowner, or age demographics.
{% endhint %}

**Using Your Own US Census API Key (Optional):**

US demographic data works automatically — SEO Utils includes a built-in US Census Bureau key, so there's nothing to set up. If you'd prefer to use your own free key, for example to avoid sharing rate limits during very high-volume tracking, you can add one in settings.

<details>

<summary>Add your own US Census API key</summary>

{% stepper %}
{% step %}
**Request a free key**

Visit [api.census.gov/data/key\_signup.html](https://api.census.gov/data/key_signup.html), enter your email, and submit the form.
{% endstep %}

{% step %}
**Activate the key**

Open the confirmation email from the US Census Bureau and click the activation link. The key will not work until it has been activated.
{% endstep %}

{% step %}
**Add it to SEO Utils**

Go to **Service Settings** > **Google My Business Rank Tracker** and paste your key into the **Census API Key** field. Leave this field empty to keep using the built-in key.

<figure><img src="/files/gQJl2dJzPdTC2bTdt51l" alt=""><figcaption><p>The optional Census API Key field in the Google My Business Rank Tracker settings</p></figcaption></figure>
{% endstep %}
{% endstepper %}

</details>

**Visualization Modes:**

Click the Demographics button (people icon) in the top-right corner of the map to toggle the layer.

<figure><img src="/files/w6JJcSg8sKrgNVqvMuBm" alt="" width="375"><figcaption><p>Demographics button on map</p></figcaption></figure>

When enabled, you can switch between four visualization modes:

| Mode              | Description                                                    | Use Case                                                           |
| ----------------- | -------------------------------------------------------------- | ------------------------------------------------------------------ |
| **Density**       | Population per square mile                                     | Find high-traffic areas                                            |
| **Median Income** | Household income levels ($, £, A$, or C$ depending on country) | Target areas with higher purchasing power                          |
| **Homeowners**    | Percentage of owner-occupied homes                             | Perfect for HVAC, roofing, solar, home services                    |
| **Median Age**    | Median age of residents                                        | Target specific demographics (55+ for estate planning, healthcare) |

All modes use a heat map color scale: 🟡 Low → 🟠 Medium → 🔴 High

**Using Demographics Layer:**

1. Click the **Demographics button** (people icon) to enable the layer
2. Select a visualization mode from the dropdown that appears
3. Click on any colored area to see detailed statistics
4. The legend in the bottom-left shows the color scale for the current mode

{% hint style="success" %}
**Pro Tip**: Use the Homeowner % layer to find neighborhoods with 80%+ homeowners - perfect for home service businesses like HVAC, roofing, or solar. Use the Median Age layer to find areas with 55+ demographics for estate planning or healthcare services.
{% endhint %}

#### Money Map

Money Map is an overlay layer that displays where your website visitors and phone calls are coming from, directly on the ranking grid map. This helps you visualize which areas are generating the most engagement for your business.

<figure><img src="/files/fuR52DHtSfghOPmLgfmx" alt=""><figcaption><p>Money Map in the GMB Rank Tracker</p></figcaption></figure>

**Requirements:**

To use Money Map, you need a [RingTonic](https://ringtonic.app) account with the Agency plan. RingTonic is a call tracking and visitor analytics platform that provides the location data.

**Setup:**

1. **Get your RingTonic API Key:**
   * Log in to your RingTonic account
   * Follow the [RingTonic API guide](https://help.ringtonic.app/guides/api) to generate an API key
   * In SEO Utils, go to **Service Settings** > **Google My Business Rank Tracker**
   * Paste your API key in the "RingTonic API Key" field
2. **Set the Campaign UUID for each report:**
   * Edit your GMB Rank Tracker report
   * Go to the **Integrations** tab
   * Enter your RingTonic Campaign UUID (found in your RingTonic campaign settings)

**Using Money Map:**

Once configured, click the Money Map button (banknote icon) in the top-right corner of the map to toggle the layer on/off.

<figure><img src="/files/ZdHqoP44w8iXLzCuy8qo" alt="" width="375"><figcaption><p>Money Map button on the map</p></figcaption></figure>

The layer displays:

* **Blue heatmap & markers**: Website visitors with known locations
* **Orange heatmap & markers**: Phone calls with known locations

A legend in the bottom-right corner shows the visitor and call counts, along with the date range (30 days ending on the selected snapshot date).

{% hint style="info" %}
**Tip**: The Money Map data automatically refreshes when you switch between snapshots, showing you the 30-day period leading up to each snapshot date.
{% endhint %}

{% hint style="info" %}
**Tip**: Zoom in on the map to see individual location markers with exact counts. At lower zoom levels, only the heatmap is shown for better performance.
{% endhint %}

#### Expand Map

If you need more space to work on the map, you can easily adjust it by following the instructions in the image below.

<figure><img src="/files/t7N51Kx5DeMGNJqpxcwK" alt=""><figcaption><p>Expanding the map to have more space.</p></figcaption></figure>

#### Bird's Eye View

This view provides an overview of the ranking and rank changes for all snapshots in your campaign through color progression. It displays data not just for your business, but also for your competitors.

It is compatible with both preset and custom grids.

<figure><img src="/files/TQnVj1TjImW0KlqzBxbD" alt=""><figcaption><p>Bird's Eye View</p></figcaption></figure>

### Manage Keywords

You can easily manage your keywords in the **Manage Keywords** section—enable, disable, add, or delete them as needed.

<figure><img src="/files/sMT5LSygkhUV1AdALpe9" alt=""><figcaption><p>Manage Keywords</p></figcaption></figure>

{% hint style="info" %}
Disabled keywords are **excluded** from both scheduled and manual tracking.
{% endhint %}

Need to track a single keyword? Just use the filter to quickly disable all others, allowing you to run a snapshot for the one that matters most.

<figure><img src="/files/DZTdHYeUIHZeZ3B2YC4f" alt=""><figcaption><p>Bulk disable/enable keywords.</p></figcaption></figure>

### Export Your Reports

You can export the Local Grid Report in PDF or HTML format. Additionally, you can personalize the report cover with your own branding.

Please watch this video to see it in action.

{% embed url="<https://drive.google.com/file/d/1rTvbTM6ezXsG7BVhHiqdoiII7_TAj9Qu/view?usp=sharing>" fullWidth="true" %}

#### Interactive Maps in HTML Exports

When exporting a report as HTML, you can enable **Interactive Maps** so that anyone opening the file can pan, zoom, and interact with the Google Maps in the report — just like in the app.

Since the exported HTML file will be shared publicly (e.g., sent to clients), you should **not** embed your main Google Places API key. Instead, you need to create a separate, restricted API key that only works on specific websites.

**Setting Up a Restricted API Key:**

{% stepper %}
{% step %}
**Enable Maps JavaScript API**

Make sure the **Maps JavaScript API** is enabled for your project. You can check this under **APIs & Services** > **Library** and search for "Maps JavaScript API".

<figure><img src="/files/1JF8GeH6yw5cyZlC3PO9" alt="" width="563"><figcaption><p>Maps Javascript API is enabled</p></figcaption></figure>
{% endstep %}

{% step %}
**Create a Restricted API Key**

Go to [Google Cloud Console](https://console.cloud.google.com/) > **APIs & Services** > **Credentials** and click **Create Credentials** > **API Key**. You can configure the restrictions directly on the creation screen:

* Give it a name like "Interactive Maps in HTML Exports"
* Under **Application restrictions**, select **Websites**
* Under **Website restrictions**, click **Add** and enter the domains where the HTML file will be hosted. For example:
  * `https://yourdomain.com/*`
  * `https://clientdomain.com/*`
* Under **API restrictions**, select **Restrict key** and choose **Maps JavaScript API**

<figure><img src="/files/t258To5cagk8AEZQcC0d" alt=""><figcaption><p>Create and restrict an API key in one step</p></figcaption></figure>

{% hint style="warning" %}
Do not reuse your main Google Places API key. Create a separate key specifically for HTML exports.
{% endhint %}

{% hint style="info" %}
If you're opening the HTML file locally (from your computer), the referrer restriction won't apply and the map won't load. The file must be hosted on a web server matching the allowed referrers.
{% endhint %}
{% endstep %}

{% step %}
**Save the Key in SEO Utils**

Go to **Service Settings** > **Google My Business Rank Tracker** and paste the restricted key in the **Interactive Maps API Key** field. This key will be pre-filled automatically whenever you export an HTML report with interactive maps.

<figure><img src="/files/CtQruLLbxV3J8ubyBXVT" alt=""><figcaption><p>Enter the new API key in SEO Utils</p></figcaption></figure>

{% hint style="info" %}
You can also enter the key directly in the export modal each time if you prefer not to save it.
{% endhint %}
{% endstep %}
{% endstepper %}

**Exporting with Interactive Maps:**

1. Open the report preview and click **Download HTML**
2. Toggle **Enable Interactive Maps** on
3. Enter your restricted API key (or use the pre-filled key from settings)
4. Click **Export HTML**

<figure><img src="/files/8kjvJo66ZR5DeYDAAn7V" alt="" width="563"><figcaption><p>Toggle <strong>Enable Interactive Maps</strong> on when exporting as HTML file.</p></figcaption></figure>

The exported file will include the Google Maps JavaScript API and all map data, allowing recipients to fully interact with the ranking grid maps.

{% hint style="danger" %}
**Never share your main API key** in exported files. Always use a restricted key with HTTP referrer restrictions. An unrestricted key embedded in a public HTML file can be stolen and used to rack up charges on your Google Cloud account.
{% endhint %}

### How to Use Comparison Tool

[In v1.18.2](https://help.seoutils.app/guide/pages/FYHJNu9cAi74Qc90ALo7#v1.18.2), I've just added a comparison tool to the GMB Rank Tracker. It's flexible, allowing you to compare rankings in different ways.

You can select the same snapshot and two different businesses to compare your rankings with competitors, or you can compare the same business across two snapshots to see how rankings change over time.

<figure><img src="/files/E5SLOUTq2yabPzpah5jw" alt=""><figcaption><p>Access the comparasion tool from the Action dropdown in the report page.</p></figcaption></figure>

Next, you need to select a candidate to compare.

<figure><img src="/files/JY5HapCiAuVXqRGxCUNC" alt=""><figcaption><p>Select a snapshot and a business to compare</p></figcaption></figure>

You can choose 2 businesses in the same snapshot to compare your ranking with your competitors.

<figure><img src="/files/FWRWwrfk9ijNStr9rLVL" alt=""><figcaption><p>Compare 2 businesses</p></figcaption></figure>

You can choose 2 snapshots from one business to see how the rankings change over time.

<figure><img src="/files/aKg9zut3LOvWQwh53dzu" alt=""><figcaption><p>Compare 2 snapshots.</p></figcaption></figure>

### Opening Hours

Since v1.18.3, SEO Utils allows you to quickly compare your opening hours with your competitors' to see if hours are impacting rankings.

<figure><img src="/files/i59ZixxnrzztVHkgoSI1" alt=""><figcaption><p>See the opening hours in the Competitors tab.</p></figcaption></figure>

{% hint style="info" %}
To see the **open/closed indicator**, SEO Utils uses the timezone you set when running the report. If the timezone isn’t set, SEO Utils won’t display the indicator since it can’t determine the correct opening hours.
{% endhint %}

### Annotations

[Since v1.30.0](https://help.seoutils.app/changelog#v1.30.0), the GMB Rank Tracker timeline has been updated to support annotations directly on the snapshot tree. This lets you easily add notes about important changes you’ve made to your Google Business Profile—like updates to your business info, new photos, or review responses—so you can better track what might be influencing your local rankings.

<figure><img src="/files/moA3QjzH8Uz1EufBxiyf" alt=""><figcaption><p>Snapshot tree display annotations</p></figcaption></figure>

You can add your own annotations and hide them from the tree.

<figure><img src="/files/Y1AZfvqEVA3SOwP0FMpV" alt="" width="375"><figcaption><p>Add and hide annotations</p></figcaption></figure>

{% hint style="success" %}
SEO Utils automatically adds **Google Update annotations** to your ranking timeline, making it easy to see how major updates impact your rankings.
{% endhint %}

### Tracking Grid Styles

#### Markers: Color & Size

By default, SEO Utils only show 3 main colors for the markers, if you would like to display more colors, you can toggle the "Show More Color Variants" switch on. You can also set a smaller marker size for your ranking grid if you have a small screen.

You can visit the **Google My Business Rank Tracker** settings page from the **Service** settings menu on the left sidebar to view all the options.

<figure><img src="/files/bODH2SeyrT9vGqxID0dG" alt=""><figcaption><p>Display additional color variants for the ranking grid points.</p></figcaption></figure>

#### Glow Effect

The Glow Effect adds a subtle luminous border around ranking markers on the map, making them more visually prominent and easier to spot at a glance.

<figure><img src="/files/sJdzlUPPFKuP3BvdHPrs" alt=""><figcaption><p>Markers with glow effect enabled</p></figcaption></figure>

To enable or disable the glow effect:

1. Go to **Service Settings** > **Google My Business Rank Tracker**
2. Toggle the "**Enable Glow Effect**" switch
3. The change applies immediately to all ranking grids

{% hint style="info" %}
**Note**: The glow effect is automatically removed when exporting reports to PDF to ensure clean, professional-looking documents. HTML exports will preserve the glow effect if enabled.
{% endhint %}

## Troubleshooting

#### Snapshots Stuck When Using DataForSEO

If you’re using DataForSEO to scrape SERP data and notice some snapshots remain stuck loading for hours, you can resolve the issue using the “**Free Stuck GMB Rank Trackers**” tool.

Here’s how:

1\. Navigate to Service Settings > DataForSEO Settings.

2\. In the DataForSEO Actions dropdown, select “Free Stuck GMB Rank Trackers”

<figure><img src="/files/ZPrD1BXnjtjIasouCN6A" alt=""><figcaption><p>Free Stuck GMB Rank Trackers tool</p></figcaption></figure>

{% hint style="warning" %}
The process may take some time to complete, and you won’t be able to use the app until it finishes.
{% endhint %}

### Multi-Location Businesses

If you manage multiple locations for the same business, you can group your reports together for a unified dashboard with aggregated visibility scores, rankings, and trends across all locations.

{% content-ref url="/pages/3iiprpDq77W4A4b3OU1l" %}
[Report Groups](/guide/google-my-business-rank-tracker/report-groups)
{% endcontent-ref %}


# Report Groups

Report Groups combine multiple GMB Rank Tracker reports into a single dashboard — ideal for businesses with multiple locations.

## Creating a Report Group

<figure><img src="/files/H2cP31LAqB22SpDTDF3w" alt=""><figcaption><p>Create a report group for multiple locations.</p></figcaption></figure>

1. Go to **Local SEO > GMB Report Groups** and click **"Create Report Group"**
2. Enter a **name**, select the reports to include, and configure export settings
3. Click **"Create Group"**

{% hint style="info" %}
You can also select multiple reports from the **GMB Rank Tracker Reports** page and use **Bulk Actions > Create Report Group**.
{% endhint %}

## Dashboard

<figure><img src="/files/VRwQtc9c9HWKwHsAEhJx" alt=""><figcaption><p>Report Group dashboard</p></figcaption></figure>

The dashboard shows aggregated data across all locations:

* **Visibility Score** — % of keyword-location combinations ranking in the top 3
* **Keywords Ranking** — How many are ranking out of total tracked
* **Improved / Declined** — Position changes vs the selected comparison period
* **Ranking Distribution** — Keywords by rank bucket (1-3, 4-6, 7-10, 11-15, 16-20)
* **Rankings Over the Period** — Trend chart showing rank distribution over time
* **Keyword Table** — All keyword-location combinations with average rank, change, and SoLV

Use the **comparison dropdown** (top-right) to compare against 7, 14, 30, 60, or 90 days ago.

## Exporting

From the dashboard, click the **three-dot menu** (⋮) and select **"Export PDF"** to open the preview. Hover over the floating button (bottom-right) to choose **PDF** or **HTML** export.

Customize the export header (logo, heading, subheading, description) from the group's **Edit** page.

## Managing Groups

* **Edit** — Click the pencil icon next to the group name to update reports or settings
* **Delete** — Use the three-dot menu on the group list page

{% hint style="warning" %}
Deleting a group does **not** delete the individual reports or their data.
{% endhint %}

## Using AI to Analyze Your Data

With the [MCP Server](/guide/mcp-server) enabled, you can ask AI assistants to analyze your multi-location data:

* "Show me the visibility score for Haidilao Hot Pot across all locations"
* "Which location has the best rankings for 'hot pot'?"
* "Create a report group for all my Haidilao reports"


# N.A.P Finder

The N.A.P Finder tool in SEO Utils streamlines local citation tracking for businesses. It automatically searches for variations of a business’s name, address, and phone number (N.A.P.) across the web, helping you find inconsistent or rogue citations indexed in search engines.

**What N.A.P Finder does for you:**

* Discovers all your business citations with a single click
* Identifies inconsistent N.A.P. information that could hurt your local rankings
* Exports comprehensive citation data into easy-to-use reports
* Saves hours of manual search work

<figure><img src="/files/dyvidnmO1F6axXnKTalO" alt=""><figcaption><p>N.A.P Finder report</p></figcaption></figure>

You can access the tool in the left sidebar under the Local SEO menu.

<figure><img src="/files/qCRWs1Bzd6heFUQGTCkm" alt="" width="375"><figcaption><p>Access N.A.P Finder tool</p></figcaption></figure>

### Manage Search Term Lists

You can click the "Manage Search Term Lists" button to see all the search term Lists.

<figure><img src="/files/YuLMIoiBNl8SL3vUkoSV" alt=""><figcaption><p>Manage Search Term Lists button</p></figcaption></figure>

SEO Utils allows you to create a Search Term List to automatically search for N.A.P. information on Google. You can structure search terms using placeholders, which are then replaced with your actual business details like name, address, and phone number. For instance, a placeholder search term like:

```
"[business]" "[address_line_1]" - "[phone]"
```

is transformed by SEO Utils into:

```
"Monsoon Seattle" "615 19th Ave E" - "(206) 325-2111"
```

This makes it easy to generate precise search queries for accurate N.A.P. tracking.

By default, SEO Utils will create a **Default** list with these placeholders:

```
"[business]" "[address_line_1]" - "[phone]"
"[business]" "[phone]"
"[business]" - "[phone]"
"[address_line_1]" "[phone]"
"[address_line_1]" - "[phone]"
"[business]" "[address_line_1]"
"[business]" - "[address_line_1]"
"[business]" "[phone]" - "[address_line_1]"
"[business]" "[address_line_1]" - "[phone]"
"[address_line_1]" - "[business]"
"[phone]" - "[business]"
"[phone]" - "[address_line_1]"
"[phone]" - "[address_line_1]" - "[business]"
"[address_line_1]" - "[business]" - "[phone]"
```

You can create a new search term list with your custom placeholders by clicking the "Add List" button.

<figure><img src="/files/jQ1uq5dMXzjNBIUoy95C" alt=""><figcaption><p>Add a new search term list modal</p></figcaption></figure>

{% hint style="info" %}
Note: To search for exact data on Google, be sure to enclose your placeholders in double-quotes. For example: **"\[business]"**. This ensures that Google retrieves precise matches for your business name.
{% endhint %}

### How to Start an N.A.P Finder Report?

After clicking the "**Run N.A.P Finder**" button, you will see a modal like this:

<figure><img src="/files/8BFRSUND9BppSSXwobnr" alt=""><figcaption><p>Run N.A.P Finder modal.</p></figcaption></figure>

Let’s walk through all the fields.

**Business fields**

SEO Utils replaces placeholders in your [search term list](#manage-search-term-lists) with the following business details:

* Business Name
* Address Line 1
* Address Line 2 (Optional)
* City
* State
* Postal Code
* Phone Number

**SERP Scraping fields**

**Location / Language:** Select the location and language you are targeting.

**Geo Target:** If you’d like to specify a more precise location, such as a city or state, enter it in this field. When a Geo Target is provided, SEO Utils will prioritize it over the selection from the Location / Language field.

**Desktop Devices:** Enabling this field simulates desktop devices when scraping SERP data. If disabled, SEO Utils will simulate mobile devices.

**Search Term List:** Choose a search term list for your N.A.P. search. You can either use the default list provided by SEO Utils or create a custom list tailored to your specific needs.

**Scrape SERP With:** This field functions just like the Organic Rank Tracker tool. For detailed information on how it works, please refer to the “Scraping SERP Methods” section in the [Organic Rank Tracker guide](https://help.seoutils.app/guide/organic-rank-tracker#scraping-serp-methods).

{% hint style="warning" %}
**Important:** To use the SERP API, you must have your own DataForSEO account. [Renting API key services](https://help.seoutils.app/guide/rent-dataforseo-api-key) isn't viable because DataForSEO restricts certain endpoints that I utilized to implement the Queue mode. If multiple users rely on a rented API key from my account, it will slow down the process for everyone. For the quickest results, using your own DataForSEO account is the best approach.
{% endhint %}

#### Updates on v1.21.0

**Excluded Domains field**

Since v121.0, SEO Utils allows you to exclude specific domains from search results by using the `-site:domain.com` operator. This feature makes it easier to filter out unwanted sites and focus on relevant citations.

<figure><img src="/files/PANKcUUu69OhK8E1z74l" alt=""><figcaption><p>Add domains to exclude</p></figcaption></figure>

<figure><img src="/files/bCqR5DUBb87th0nVMLrn" alt=""><figcaption><p>Exclude domain using "-site:domain.com" operator</p></figcaption></figure>

**Multiple Phone Number Formats**

You now can enter various phone number formats in the N.A.P Finder tool. SEO Utils will use each format for more thorough search results.

<figure><img src="/files/FuQ69pTpycJZVYU7ca6e" alt=""><figcaption><p>Enter different phone number formats.</p></figcaption></figure>

### Mange Your N.A.P Finder Reports

After successfully running a report, you’ll see a table like the one shown.

<figure><img src="/files/dJz2Xi8CU6XdvpiQknKc" alt=""><figcaption><p>N.A.P Finder report</p></figcaption></figure>

Here’s a breakdown of each column:

**Title**: Displays the title of the webpage where your N.A.P. information appears. It also includes the URL of the page, allowing you to easily access the site where the citation is found.

**Search Term**: Shows the exact search term used, with your business details (like name, address, and phone number) replacing the placeholders.

**Position**: Indicates the ranking position of the result on the search engine results pages (SERP).

{% hint style="info" %}
You can click on the SERP button to view detailed SERP data for each result.
{% endhint %}

#### Available Filters

**Search Term Filter:** Allows you to filter results based on specific search terms from your list, making it easy to target certain N.A.P. variations.

<figure><img src="/files/pw0Ws6WugJ8VZgdxoBhC" alt=""><figcaption><p>Search term filter</p></figcaption></figure>

**Position Filter:** This lets you narrow the results to show only those that rank within the top 10, top 30, or any position range you specify.

**Domain Filter:** Helps you filter by domain to view where your business is cited across specific websites.

Once you’re satisfied with the results, you can export the data as a CSV file for further analysis by clicking the **Export** button.


# Google Business Reviews Fetcher

<div data-full-width="false"><figure><img src="/files/VR8SpNzz2OvrObhaqZmQ" alt=""><figcaption></figcaption></figure></div>

The Google Business Reviews Fetcher automatically collects and tracks Google reviews for a single business location. Instead of manually checking Google Maps for new reviews, this tool fetches review data on a schedule and tracks changes over time through snapshots.

### Why Use This Tool

**Perfect for:**

* Businesses monitoring their Google reviews over time
* Tracking new reviews as they come in
* Building a historical record of all reviews
* Exporting review data for reporting or analysis
* Monitoring owner response rates

**Key Benefits:**

* 📸 Snapshot-based tracking - See exactly what changed each time
* 🔄 Smart depth calculation - Automatically optimizes API costs
* 📊 Deduplication - Only tracks new reviews, skips duplicates
* 👁️ Visibility tracking - Optionally detect when reviews disappear or reappear on Google
* 🔔 Email alerts for low-rating reviews via Automations
* 💾 Export reviews to CSV for analysis
* ⏰ Scheduled or manual fetching

### Quick Start Guide

{% hint style="warning" %}
This tool requires you to set up a Google Places API key to search for Google businesses. Please read the guide at: [Setup Google Places API key](/guide/google-my-business-rank-tracker#setup-the-google-places-api)
{% endhint %}

#### Step 1: Add a Business

1. Navigate to **Google Business Reviews Fetcher** in the sidebar
2. Click **"Create New Fetcher"**
3. Search for your business using the business search field
4. Enter a friendly name (e.g., "Downtown Seattle Location")

<figure><img src="/files/dUO5jpjoE8wHXkJHcnUh" alt="" width="375"><figcaption><p>Access Google Business Reviews Fetcher tool</p></figcaption></figure>

#### Step 2: Configure Fetch Settings

**Initial Depth** (First run only)

* How many historical reviews to fetch on first run
* Range: 10 - 4,490 reviews (in multiples of 10)
* Example: Set to 1,000 to fetch complete review history
* **This only runs once** - pulls all historical reviews

**Subsequent Depth** (Optional)

* How many reviews to fetch on future runs
* Leave at **0 for automatic** (recommended)
* Or set a custom value if you know your review volume

**How Automatic Depth Works:**

```
First Run: Fetches 1,000 reviews (your historical data)
Second Run: Automatically calculates based on schedule
  - Example: 7-day schedule = ~21 reviews (3/day × 7 days)
Third+ Runs: Analyzes previous snapshot
  - If last run found 15 new reviews
  - Next run fetches ~30 reviews (15 × 2 buffer)
```

**Track Disappearing Reviews** (Optional)

* Off by default
* Turn on to detect reviews that Google removes or that reviewers delete
* Every run after the first fetches your **complete** review list, overriding Subsequent Depth
* Uses more DataForSEO credits per run, since each run pulls every review instead of just the newest ones

{% hint style="warning" %}
Confirming that a review was removed requires seeing every review the business has. A shorter fetch cannot tell a deleted review apart from one that simply sits below the depth limit.

Leave this off to keep runs cheap — snapshots will then state that missing reviews were not checked, rather than reporting numbers that cannot be trusted.
{% endhint %}

**Schedule Interval**

* 0 = Manual only (you click "Fetch Data" when needed)
* 7 = Weekly (runs every 7 days)
* 30 = Monthly (runs every 30 days)
* Custom = Any number of days

**Location & Language**

* Select the geographic location and language for review fetching
* Example: United States - English

**Queue Priority**

* **Standard Queue**: Up to 45min processing, $0.00075 per 10 reviews
* **Priority Queue**: Up to 1min processing, $0.0015 per 10 reviews

<figure><img src="/files/CFp4Re0hRGMA3JYyXnvv" alt=""><figcaption><p>Create a Google Business Reviews Fetcher</p></figcaption></figure>

#### Step 3: Save and Run

1. Click **"Add Business"**
2. Initial fetch starts automatically
3. You'll be redirected to the snapshot page showing progress

### Understanding the Business Detail Page

After creating a business, you'll see the detail page with:

#### Business Information Card

<figure><img src="/files/BSD7yfjH2DwUJBXD4lxm" alt=""><figcaption><p>Business Information Card</p></figcaption></figure>

Shows configuration and tracking details:

* **Address**: Business name and location
* **Place ID**: Google's unique identifier for this business
* **Schedule**: How often reviews are fetched (Manual, Weekly, etc.)
* **Queue Priority**: Standard or Priority processing
* **Initial Depth**: Number of reviews fetched on first run
* **Last Run**: When reviews were last fetched
* **Total Snapshots**: How many times reviews have been fetched
* **Location & Language**: Geographic and language settings

#### Snapshots History Table

Every time you fetch reviews, a new snapshot is created. The table shows:

<figure><img src="/files/qWtsmK3ndQN8UTkioRqM" alt=""><figcaption><p>Snapshots History Table</p></figcaption></figure>

**Columns:**

* **Date**: When the snapshot was created
* **Depth**: How many reviews were requested from the API
* **Found**: Total reviews returned by Google
* **New**: Reviews that didn't exist in previous snapshots
* **Duplicates**: Reviews already captured in previous snapshots
* **Status**: Pending → Processing → Completed (or Failed)
* **Type**: Scheduled (automatic) or Manual (you clicked "Fetch Data")

**Example Snapshot Flow:**

```
Snapshot #1 (Initial):
  Depth: 1,000
  Found: 847 reviews
  New: 847 (all are new on first run)
  Duplicates: 0

Snapshot #2 (7 days later):
  Depth: 30 (auto-calculated)
  Found: 18 reviews
  New: 3 (3 new reviews since last week)
  Duplicates: 15 (already had these)

Snapshot #3 (7 days later):
  Depth: 30 (auto-calculated)
  Found: 25 reviews
  New: 5 (5 new reviews this week)
  Duplicates: 20 (already had these)
```

#### Actions

<figure><img src="/files/L0ESot1LMNLOCBpB2PK3" alt="" width="375"><figcaption></figcaption></figure>

* **Fetch Data**: Manually trigger a new snapshot
* **Edit**: Change business settings (except business selection)
* **Delete**: Remove business and all snapshots

#### Bulk Actions

From the main business list, you can select multiple businesses using the checkboxes and perform bulk actions:

* **Fetch Reviews**: Trigger a review fetch for all selected businesses at once. The fetches run sequentially to avoid API overload.

<figure><img src="/files/w7VaN1Ti5EBl7UgIiutp" alt=""><figcaption><p>Fetch reviews for multiple businesses</p></figcaption></figure>

This is useful when you want to manually refresh reviews for multiple businesses before generating reports.

### Viewing Review Data (Snapshot Page)

Click on any snapshot date to view the reviews captured in that snapshot.

<figure><img src="/files/XrJheUO9eK41iGbsx1LM" alt=""><figcaption><p>View detail a snapshot</p></figcaption></figure>

#### Snapshot Information

Shows details about this specific fetch:

* **Date**: When this snapshot was created
* **Depth**: How many reviews were requested
* **Reviews Found**: Total reviews returned by Google
* **New Reviews**: Reviews discovered for the first time
* **Duplicates Skipped**: Reviews already in previous snapshots
* **Status**: Completion status
* **Type**: Manual or Scheduled run
* **Business Rating**: Overall star rating and total review count
* **Missing Reviews**: Every review known to this business that is no longer on Google, with the number that disappeared in this particular run shown next to it (appears only when the run checked for missing reviews)
* **Reinstated Reviews**: Reviews that reappeared after being missing (shown only if > 0)

If a run could not check for missing reviews, a notice appears here explaining why. See [Review Visibility Tracking](#review-visibility-tracking) below.

#### Reviews Table

<figure><img src="/files/vY8dGN1CSfuKpGWrK607" alt=""><figcaption><p>Reviews table</p></figcaption></figure>

**Cumulative View (Default)**

By default, the snapshot page shows **all reviews ever collected** for this business with their current visibility status. This gives you a complete picture of all reviews regardless of which snapshot first captured them.

To see only reviews from this specific snapshot, enable the **"Only show reviews in this snapshot"** toggle above the table.

**Review Columns:**

* **Reviewer**: Name, photo, profile (if available)
  * Shows review count and photo count
  * "Local Guide" badge if applicable
* **Rating**: Star rating (1-5)
  * Number of "helpful" votes
  * "View on Google" link to see review on Google Maps
* **Review Date**: When the review was posted
* **Review Text**: Full review content
  * Expandable for long reviews
  * Shows review images if attached
* **Owner Response**: Business reply to the review
  * Shows if owner has responded
  * Full response text
* **Status**: Review visibility status (see below)

#### Review Visibility Tracking

The tool can detect when reviews disappear from Google and when they come back. Every review carries a visibility status:

| Status         | Description                                                                           |
| -------------- | ------------------------------------------------------------------------------------- |
| **New**        | First time discovered for this business                                               |
| **Visible**    | Currently visible on Google                                                           |
| **Missing**    | Was visible before but no longer on Google (deleted by reviewer or removed by Google) |
| **Reinstated** | Was missing but has reappeared on Google                                              |

**When missing reviews are checked**

To keep costs down, a regular fetch pulls only your most recent reviews. That means it cannot tell a removed review apart from one that simply sits below the depth limit — so missing reviews are reported only when a run has seen **every** review the business has.

Turn on **Track disappearing reviews** in the business settings to make each run fetch the complete list and compare it against everything collected previously.

When a run could not check, the snapshot says so instead of reporting numbers that cannot be trusted:

| Why the check was skipped                                    | What to do                                                             |
| ------------------------------------------------------------ | ---------------------------------------------------------------------- |
| The run covered only part of the review list                 | Turn on **Track disappearing reviews** so future runs fetch everything |
| There is nothing collected yet to compare against            | Run another fetch — the next one can report changes                    |
| The business has more reviews than a single run can retrieve | Removals cannot be detected for this business                          |
| Google returned incomplete data for the run                  | Run the fetch again                                                    |

{% hint style="info" %}
**Why do reviews go missing?** Reviews can disappear from Google for several reasons:

* Reviewer deleted their review
* Google removed it for policy violations
* Google's spam filter flagged it (may be reinstated later)
* Temporary Google Maps data issues
  {% endhint %}

{% hint style="warning" %}
**Snapshots created before version 1.48.1** show a notice that their missing-review counts are unverified.

Earlier versions counted every review a run had not looked at as missing, so those counts can include reviews that are still live on Google. The data is left in place, but confirm it with a new fetch before acting on it — particularly before raising a case with Google.
{% endhint %}

#### Filters

* **Rating**: Filter by star rating (e.g., show only 1-2 star reviews)
* **Owner Response**: Filter by "With Response" or "No Response"
* **Visibility**: Filter by status (New, Visible, Missing, Reinstated)
* **Search**: Search reviewer names or review text

#### Export

<figure><img src="/files/qR2Ab6MDCcHmjLsfSTow" alt="" width="375"><figcaption></figcaption></figure>

Click **Export** to download reviews as a CSV file.

The export matches what is on screen. It respects the current filters, the search box, and the **"Only show reviews in this snapshot"** toggle — so filtering the table to **Missing** and clicking Export gives you a file containing only the disappeared reviews.

Each row includes a **Visibility Status** column (New, Visible, Missing or Reinstated), along with the reviewer name, rating, date, review text, any owner response, and a direct link to the review on Google.

Use exports for:

* Client reporting
* Analysis in Excel/Google Sheets
* Documenting disappeared reviews when raising a case with Google
* Integration with other tools
* Long-term archiving

### Example Workflows

<details>

<summary>Workflow 1: New Business Setup</summary>

**Goal**: Track reviews for a coffee shop with \~200 total reviews

**Setup:**

```
Business: Blue Bottle Coffee - Ferry Building
Initial Depth: 500 reviews
Subsequent Depth: 0 (automatic)
Schedule: 7 days (weekly)
Priority: Standard Queue
```

**What Happens:**

1. First run: Fetches 500 reviews, finds 187 total
2. Week 1: Auto-fetches \~21 reviews, finds 2 new reviews
3. Week 2: Auto-fetches \~30 reviews (2×2 buffer), finds 3 new
4. Week 3: Auto-fetches \~30 reviews, finds 1 new
5. Ongoing: Adapts based on review frequency

</details>

<details>

<summary>Workflow 2: High-Volume Business</summary>

**Goal**: Track reviews for busy restaurant getting 5-10 reviews/day

**Setup:**

```
Business: Popular Restaurant Downtown
Initial Depth: 4,490 reviews (max)
Subsequent Depth: 0 (automatic)
Schedule: 3 days
Priority: Priority Queue (faster processing)
```

**What Happens:**

1. First run: Fetches 4,490 reviews (complete history)
2. Day 3: Auto-fetches \~27 reviews, finds 18 new
3. Day 6: Auto-fetches \~36 reviews (18×2), finds 22 new
4. Day 9: Auto-fetches \~44 reviews (22×2), finds 15 new
5. Ongoing: Automatically adjusts to review volume

</details>

<details>

<summary>Workflow 3: Manual Monitoring</summary>

**Goal**: Fetch reviews only when needed (e.g., before monthly reports)

**Setup:**

```
Business: Consulting Firm
Initial Depth: 100 reviews
Subsequent Depth: 50
Schedule: 0 (manual only)
Priority: Standard Queue
```

**What Happens:**

1. First run: Manual click, fetches 100 reviews
2. Month 1: Manual click, fetches 50 reviews
3. Month 2: Manual click, fetches 50 reviews
4. Ongoing: You control when to fetch

</details>

<details>

<summary>Workflow 4: Monitoring Disappearing Reviews</summary>

**Goal**: Build evidence that reviews are being removed from a business with \~90 reviews

**Setup:**

```
Business: Local Dental Practice
Initial Depth: 100 reviews
Track Disappearing Reviews: On
Schedule: 7 days (weekly)
Priority: Standard Queue
```

**What Happens:**

1. Each run fetches the complete review list rather than just the newest reviews
2. Any review that was present before and is now gone is marked **Missing**
3. The snapshot shows the running total of missing reviews, plus how many disappeared in that run
4. If a review returns later, it is marked **Reinstated**

**To pull the evidence:**

1. Open the snapshot and set the **Visibility** filter to **Missing**
2. Click **Export**
3. The file lists each disappeared review with its reviewer, rating, date, text and Google link

</details>

### Setting Up Low-Rating Alerts (Automation)

Get notified by email when new reviews below your rating threshold are detected using the [Automations](/guide/automations) tool.

<figure><img src="/files/JNizKmmGL6cIA9hEHNra" alt=""><figcaption></figcaption></figure>

#### How It Works

After each fetch completes, the automation system:

1. Checks for NEW reviews in the snapshot
2. Filters reviews by your rating threshold (e.g., 3 stars or lower)
3. Sends email only if matching reviews are found
4. Skips notification if no reviews match criteria

#### Step-by-Step Setup

<figure><img src="/files/w7GiCoqOtcWlOYxiE2WV" alt=""><figcaption></figcaption></figure>

1. Go to **Automations** in the sidebar
2. Click **"Create Automation"**
3. Configure the automation:

**Basic Settings:**

```
Name: Low Rating Alert - [Your Business Name]
Trigger: Google Business Reviews Snapshot
Report: Select your business (or "All Reports" for all businesses)
```

**Trigger Configuration:**

```
Include All Reviews: No (unchecked) - Only sends alerts for reviews at or below threshold
                     Yes (checked)  - Sends alerts for ALL new reviews regardless of rating
Rating Threshold: 3 (triggers for 1, 2, or 3 star reviews) - Only visible when "Include All Reviews" is unchecked
```

**Add Action → Send Email:**

```
To: your-email@company.com
Subject: ⚠️ {{trigger.newReviewsMatchingCount}} New Low-Rating Review(s) - {{trigger.businessName}}
```

**Email Body:**

```
{{trigger.newReviewsMatchingCount}} new review(s) with ratings at or below {{trigger.ratingThreshold}} stars have been detected for {{trigger.businessName}}.

{{trigger.reviewsList}}

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Business Information:
Name: {{trigger.businessName}}
Address: {{trigger.address}}
Place ID: {{trigger.placeID}}

Summary:
• Total new reviews: {{trigger.newReviewsCount}}
• Matching criteria: {{trigger.newReviewsMatchingCount}}
• Average rating: {{trigger.averageRating}}/5
• Total reviews: {{trigger.totalReviews}}

Action Required:
Please review this feedback and respond promptly to address customer concerns.

---

This is an automated notification from SEO Utils.
Snapshot Date: {{trigger.createdAt}}
```

4. Click **"Save Automation"**

#### Available Template Variables

| Variable                              | Description                        | Example                    |
| ------------------------------------- | ---------------------------------- | -------------------------- |
| `{{trigger.businessName}}`            | Business name                      | "Blue Bottle Coffee"       |
| `{{trigger.address}}`                 | Business address                   | "123 Main St, Seattle, WA" |
| `{{trigger.placeID}}`                 | Google Place ID                    | "ChIJ..."                  |
| `{{trigger.newReviewsCount}}`         | Total new reviews found            | 5                          |
| `{{trigger.newReviewsMatchingCount}}` | Reviews matching threshold         | 2                          |
| `{{trigger.ratingThreshold}}`         | Configured threshold               | 3                          |
| `{{trigger.averageRating}}`           | Business average rating            | 4.2                        |
| `{{trigger.totalReviews}}`            | Total review count                 | 847                        |
| `{{trigger.reviewsList}}`             | Formatted list of matching reviews | (see below)                |
| `{{trigger.createdAt}}`               | Snapshot date                      | "2024-01-15"               |

#### Example Email Output

```
2 new review(s) with ratings at or below 3 stars have been detected for Blue Bottle Coffee.

Review 1:
Rating: 2/5 ⭐⭐
Reviewer: John D.
Date: 2024-01-15
Review: "Coffee was cold and service was slow. Very disappointed."
View Review: https://maps.google.com/...

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Review 2:
Rating: 1/5 ⭐
Reviewer: Sarah M.
Date: 2024-01-14
Review: "Worst experience ever. Will not return."
View Review: https://maps.google.com/...

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Business Information:
Name: Blue Bottle Coffee
Address: 1 Ferry Building, San Francisco, CA
Place ID: ChIJAQDl8...

Summary:
• Total new reviews: 5
• Matching criteria: 2
• Average rating: 4.2/5
• Total reviews: 847

Action Required:
Please review this feedback and respond promptly to address customer concerns.

---

This is an automated notification from SEO Utils.
Snapshot Date: 2024-01-15
```

{% hint style="success" %}
Besides sending emails, you can set up the [Automations tool](/guide/automations) to send data view webhooks, so you can perform other analyses or automations.
{% endhint %}


# Local SERP Checker

The SERP UULE tool leverages the UULE (Unicode URL-Encoded) parameter, a method Google uses to understand and simulate search results as if they were being conducted from various geographic locations. This capability is significant because Google's search results can vary greatly depending on the searcher's location, due to localization and personalization factors.

By manipulating the UULE parameter, this tool can simulate searches from different locations, providing insights into how search results appear to users in those areas.

### Benefits of Using the SERP UULE Tool

1. **SEO Strategy Optimization:** By understanding how websites rank in different regions, SEO professionals can tailor their strategies to target specific geographic markets more effectively.
2. **Competitive Analysis:** It enables businesses to see how their competitors perform in different locales, providing insights into local market competition and identifying potential areas for expansion.
3. **Content Localization:** Helps in identifying what localized content performs well in certain regions, guiding content creation and marketing strategies to cater to local tastes and preferences.
4. **Ad Campaigns Refinement:** By analyzing search results in different locations, marketers can refine their ad campaigns to be more relevant to local audiences, potentially increasing engagement and conversion rates.

### **How To Check Google Search Results for Different Locations**

1. Click the "SERP UULE" tool in the left sidebar.
2. Enter a search query.
3. Enter a city, state, or country that you want to view the search results for.
4. Hit the "Search" button. SEO Utils will open a new tab with the SERP based on the location you selected.

<figure><img src="/files/vhButdVvUWGDC19MSDVr" alt=""><figcaption><p>SERP UULE</p></figcaption></figure>

### How to Change the Default Geo Target

You can change the default location by visiting the Settings menu. Then, type the default location at the **Default Geo Target** field.

<figure><img src="/files/pXs1t1pHqOfKQUQRIodg" alt=""><figcaption><p>Set the default geo target.</p></figcaption></figure>

By setting the default geotarget, you won't have to type it in every search.


# Organic Rank Tracker

This tool enables you to track keywords ranking in organic search results on Google or Bing. You can customize tracking for desktop or mobile searches, as well as target specific locations. It also generates insightful reports, helping you compare your website’s performance against competitors.

<div data-full-width="true"><figure><img src="/files/sU8nsbvmL1Fk9ZGlNh5E" alt=""><figcaption><p>Organic Rank Tracker tool</p></figcaption></figure></div>

{% hint style="info" %}
**New in** [**v1.30.0**](https://help.seoutils.app/changelog#v1.30.0): You can now access the [Organic Rank Tracker Dashboard](https://help.seoutils.app/guide/dashboard/organic-rank-tracker) to view an overview of all your rank tracking reports in one place. This dashboard helps you quickly monitor performance across multiple domains, devices, and locations.
{% endhint %}

### How to Add a Tracker

You can access the tool from the Organic SERP menu, where you’ll find an “Add Rank Tracker” button in the top-right corner.

<figure><img src="/files/bfpxp0PMUc7b9EBZGain" alt="" width="375"><figcaption><p>Access Organic Rank Tracker tool</p></figcaption></figure>

After clicking the button, a modal will open. Let’s walk through the fields step by step.

<figure><img src="/files/3j2j8qZd375jQdzo7A9K" alt=""><figcaption><p>Add Organic Rank Tracker modal</p></figcaption></figure>

#### **Basic fields**

**Domain:** Enter the target domain here, typically your website’s domain.

**Keywords:** Add a list of keywords you want to track, placing each keyword on a new line. There’s no limit to the number of keywords you can enter. You can add more keywords later.

**Search Engine:** Choose whether to track keywords on Google or Bing.

**Location / Language:** Select the location and language you are targeting. SEO Utils uses this selection to gather keyword metrics like CPC and search volume.

**Geo Target:** If you’d like to specify a more precise location, such as a city or state, enter it in this field. When a Geo Target is provided, SEO Utils will prioritize it over the selection from the Location / Language field.

**Desktop Devices:** Enabling this field simulates desktop devices when scraping SERP data. If disabled, SEO Utils will simulate mobile devices.

**Business Name (SERP API only):** When using DataForSEO or Larseo API, you can enter your business name to track its position in Google's Local Pack. This is especially valuable for local businesses, as Local Pack positions (1-3) appear prominently at the top of search results. The business name must match exactly as it appears in Google (case doesn't matter).

<figure><img src="/files/yYIpvKhlqUoNb6g1rKBA" alt=""><figcaption><p>You can optionally add the business name to track the local pack</p></figcaption></figure>

**PAA Click Depth (DataForSEO only):** Detect when your domain (or a competitor's) is featured as a source inside Google's People Also Ask box — not just whether the box appears. This is a separate visibility signal from organic ranking, and one that Semrush, Ahrefs, and SE Ranking all expose in their position trackers.

Choose how many PAA questions DataForSEO should expand to reveal source URLs:

* **Off (default)** — PAA box presence is still detected (as a SERP feature), but no source attribution.
* **1–4** — DataForSEO clicks into that many PAA questions and returns each source's URL, title, and domain.

<figure><img src="/files/IVvj7sk1kt072SXZTkD7" alt=""><figcaption><p>PAA Click Depth setting in the rank tracker configuration modal</p></figcaption></figure>

{% hint style="warning" %}
**Extra DataForSEO cost:** $0.00015 per click, regardless of priority. Unused clicks (PAA box absent or fewer questions than depth) are automatically refunded by DataForSEO. The cost estimate in the modal updates to reflect the new total when you change this setting.
{% endhint %}

{% hint style="info" %}
**When is this worth enabling?** PAA presence is becoming an important visibility metric as Google leans more on PAA boxes for informational queries. If your content strategy includes answering specific questions, this signal tells you whether Google is citing you as a source. If you only care about the classic blue links, you can leave this off.
{% endhint %}

**Track Pixels From Top (DataForSEO only):** Measure the actual vertical distance — in pixels — between the top of the SERP and each result's snippet. Pure rank position is increasingly misleading because ads, AI Overviews, knowledge panels, PAA boxes, image packs, and other features push organic results down by varying amounts. Pixels From Top reflects the real on-screen visibility a result gets.

Toggle **Track Pixels From Top** on to enable. You can optionally override the browser dimensions DataForSEO uses to render the SERP:

* **Browser Width / Browser Height** — viewport size in pixels. Defaults to **1920 × 1080** on desktop reports and **360 × 640** on mobile reports.
* **Resolution Ratio** — device pixel ratio. Defaults to **1** on desktop, **3** on mobile. Range 0.5–3.

Leave any field empty to use the default — the actual numbers used are shown under each input.

<figure><img src="/files/WfGDXZJBh6GzGVWLisa1" alt=""><figcaption><p>Track Pixels From Top toggle and viewport inputs in the rank tracker configuration modal</p></figcaption></figure>

{% hint style="warning" %}
**Extra DataForSEO cost:** $0.0006 per keyword per scrape. The cost estimate in the modal updates to reflect the new total when you toggle this on. For a 1,000-keyword tracker, that's an extra $0.60 per run.
{% endhint %}

{% hint style="danger" %}
**These settings are locked once data is collected.** After your first scrape with Track Pixels From Top enabled, you can no longer change the toggle, browser dimensions, or even switch the scrape method away from DataForSEO. Changing viewport mid-history would invalidate the pixel deltas across snapshots — a measurement taken at 1920×1080 is not comparable to one taken at 1280×800. If you need different settings, create a new tracker. Pick the viewport you want before you start.
{% endhint %}

{% hint style="info" %}
**When is this worth enabling?** SERP layouts have changed dramatically. A result at rank #1 below a fold-filling AI Overview is far less visible than a result at rank #1 with no SERP features. Pixels From Top captures this in a single number that's directly comparable across keywords. Particularly valuable for tracking the impact of ranking improvements when SERP features are added or removed by Google.
{% endhint %}

#### Schedule

**Rerun Every:** Specify how often you want the tracker to run, in days. For example, set it to 1 for daily runs, 7 for weekly runs, or 0 for on-demand runs. The value can range from 0 to 30. Choose the frequency that fits your project budget and requirements.

<figure><img src="/files/7oWP8u1dglWvWdJZG06r" alt="" width="563"><figcaption><p>"Rerun Every" field.</p></figcaption></figure>

{% hint style="info" %}
You will need to leave the SEO Utils app open for scheduled runs to occur.
{% endhint %}

{% hint style="info" %}
**New in** [**v2.0.0**](https://help.seoutils.app/changelog#v2.0.0): You can now control **when** scheduled runs happen — set a time window, days of the week, and a timezone. This is especially useful for local businesses, where SERP results during open hours are the most representative.
{% endhint %}

**Schedule to run from / to:** Set a daily time window for scheduled runs. When a run is due, the tracker waits and starts inside this window. Pick the tracked business's open hours for the most representative results, or leave both fields empty to run at any time. The window must be at least 30 minutes wide.

**Run on any days:** Keep this on to run on whichever day the tracker is due. Toggle it off to select specific days of the week — when a run is due on another day, it waits for the next selected day.

**Timezone:** The timezone used to evaluate the time window and the selected days. Type to search for any timezone (for example, the business's own timezone). Leave it empty to use your computer's timezone.

**How scheduling works:** a scheduled run starts when all three conditions are true:

* The "Rerun Every" interval has passed since the last run.
* The current time — in the selected timezone — is inside the time window.
* Today is one of the selected days (when "Run on any days" is off).

The next run then counts from the day the tracker actually ran. For example, a weekly tracker with only Monday–Friday selected that becomes due on a Sunday waits until Monday — and from then on, it keeps running on Mondays.

<figure><img src="/files/bpuJ48Nnk6Vbj9ndwyJq" alt=""><figcaption><p>Schedule section with the time window, "Run on any days" toggle, weekday selection, and timezone picker</p></figcaption></figure>

{% hint style="success" %}
The report page shows exactly when the next run will start — for example, *"Next run: Aug 12 between 09:00–17:00 (America/Chicago)"*. If you create a tracker outside its window, the first scan also waits for the window instead of starting right away.
{% endhint %}

{% hint style="info" %}
**Good to know:** the window controls when a **new** run starts. If a run cannot finish all keywords (for example, a request failed midway), the tracker completes the unfinished keywords shortly after, even outside the window. Switching a tracker to on-demand (Rerun Every = 0) clears its window, days, and timezone settings.
{% endhint %}

#### Scraping SERP methods

Just like the [SERP Clustering tool,](/guide/serp-clustering) you can also select the method to scrape the SERP data. There are 3 options:

* **My Own IP:** Uses your machine’s IP to scrape SERP data. This is suitable if you’re tracking only a few keywords. For larger keyword sets, consider using the Proxies or SERP API method.
* **Proxies:** The best choice when tracking millions of keywords per month. [Click here to learn how to set up a proxy](/guide/how-to-use-proxies).
* **SERP API:** [**DataForSEO**](/guide/seo-data-source#what-is-dataforseo)**:** Ideal for tracking hundreds to thousands of keywords per month. You’ll be charged an additional $0.60 per 1,000 keywords via the SERP API, with a pay-as-you-go model. It’s affordable and easy to get started.

{% hint style="warning" %}
**Important:** To use the SERP API, you must have your own DataForSEO account. [Renting API key services](https://help.seoutils.app/guide/rent-dataforseo-api-key) isn't viable because DataForSEO restricts certain endpoints that I utilized to implement the Queue mode. If multiple users rely on a rented API key from my account, it will slow down the process for everyone. For the quickest results, using your own DataForSEO account is the best approach.
{% endhint %}

<figure><img src="/files/yxTi3c956zQ2oQSOaxCr" alt="" width="563"><figcaption><p>Select a suitable Scrape SERP method.</p></figcaption></figure>

**When you choose the Proxies option, three additional fields help you scrape SERP more effectively.**

**Workers:** Select the total number of workers to scrape SERP data. The more workers you choose, the faster the process will be, but it will also require more CPU power and proxy quality. You can enter 1-50 workers.

**Request delay:** Enter the number of seconds you wish to have between each request to scrape SERP data for keywords. The more delay time you set, the slower the process will be, but it will help you avoid being blocked by Google. Set '0' to scrape SERP data without any delay.

**Back-off Time:** Enter the number of seconds you wish to wait before retrying the failed scraping request. SEO Utils retries the request up to 3 times before skipping a keyword. The more back-off time you set, the slower the process will be, but it will help you avoid being blocked by Google. Set '0' to use the default back-off time.

{% hint style="info" %}
My favorite setting when using rotating residential proxies is:

* Workers: 10.
* Request delay: 1.
* Back-off time: 1 (sometimes 2 if I notice many failed requests).
  {% endhint %}

Once all the fields are set up, please click the Add Tracker button.

### Manage Tracker: Keywords, Competitors, Annotations, Snapshots

At the top of the page, you will find all the essential information about the report, including the location, language, search engine, total keywords, and competitors. You can also hover over the updated date to see when the next run is scheduled.

<figure><img src="/files/CqwjGrrQopJN95qP7Bbi" alt=""><figcaption><p>Basic information of the report.</p></figcaption></figure>

{% hint style="info" %}
You can always edit the report by clicking the pencil icon button.
{% endhint %}

#### Manage keywords & tags

To manage your keywords, simply click on the keyword count. This will redirect you to a page where you can add or remove keywords as needed.

<figure><img src="/files/WdEgRZ29PoJKJ9IC9FUW" alt=""><figcaption><p>Manage keywords.</p></figcaption></figure>

You can update tags for several keywords at once by selecting them and using the "Update Tags" bulk action.

<figure><img src="/files/1lJsgovRoWXlqpBKyrIR" alt="" width="563"><figcaption><p>Update tags for multiple keywords.</p></figcaption></figure>

You can instruct SEO Utils to check rankings immediately after adding keywords by toggling the “**Rerun Tracker After Adding Keywords**” option. If left off, the tool will check the rankings of new keywords during the next scheduled run.

<figure><img src="/files/YpEyOeyZXD97UHlfI26r" alt=""><figcaption><p>Adding new keywords modal.</p></figcaption></figure>

By adding tags for keywords, you’ll be able to tag and filter keywords for more efficient tracking and organization.

<figure><img src="/files/wTU3ElNpAcdnLzkVeJ9S" alt=""><figcaption><p>Filter keywords by tags</p></figcaption></figure>

#### Check Keyword Metrics & Analyze SERP Data

To check keyword metrics *(Search Volume, CPC, KD, etc)*, you can simply select the keywords you want to check and run the bulk action: Check Keyword Metrics.

<figure><img src="/files/kAFCK8ldxCiWutgjEB7O" alt=""><figcaption><p>Check keyword metrics for multiple keywords</p></figcaption></figure>

You can also click Analyze SERP bulk action, to pull valuable insights on the top 10-100 URLs, including:

* Backlink count for each URL.
* Total keywords each URL ranks for.
* Estimated traffic each URL receives.
* Domain rating (DR) and URL rating (UR) of each URL.

These insights empower you to assess competitor strengths and uncover opportunities to boost your own rankings.

<figure><img src="/files/lHtudXhXdMl0mJEtuxCc" alt=""><figcaption><p>SERP analysis</p></figcaption></figure>

{% hint style="info" %}
You can also **export SERP data** of all keywords to view more metrics: Referring IPs, Referring Pages, Referring Main Domains, Broken Backlinks, etc
{% endhint %}

#### Map External Keyword Data

{% hint style="info" %}
**New in** [**v1.33.4**](https://help.seoutils.app/guide/pages/FYHJNu9cAi74Qc90ALo7#v1.33.4): You can now import external keyword metrics and tags from Excel or CSV files to enrich your keyword data.
{% endhint %}

The Map Keyword Data feature allows you to import external data sources to enhance your keyword tracking with:

* **Search Volume**: Monthly search volume for keywords
* **CPC (Cost Per Click)**: Average cost per click data
* **KD (Keyword Difficulty)**: Competitive difficulty scores
* **Search Intents**: User intent classification (informational, navigational, transactional, commercial)
* **Tags**: Custom labels for organizing keywords

To use this feature:

1. Click on the keyword count to go to the keywords management page
2. Click on "**Map Keyword Data**" from the "3 dots" action dropdown menu

<figure><img src="/files/hbGyeanzTJruwsKfb7JB" alt=""><figcaption><p>Map Keyword Data bulk action</p></figcaption></figure>

4. In the modal, select your Excel or CSV files containing the keyword data
5. Map the columns from your file to the appropriate data types (Keyword, Volume, CPC, Intent, Tags)
6. Click "Import Data" to sync the external metrics with your keywords

<figure><img src="/files/tGRIBt7ZZmCrWd9zyhWZ" alt=""><figcaption><p>Map Keyword Data modal interface</p></figcaption></figure>

{% hint style="success" %}
**Important notes:**

* Keywords are matched case-insensitively by default (you can preserve case if needed)
* External metrics will override any existing internal data
* Tags should be comma-separated in your file (e.g., "seo, analytics, tools")
* Multiple files can be imported at once if your data is spread across different sources
  {% endhint %}

**Example Template**: Download this [sample Google Sheets template](https://docs.google.com/spreadsheets/d/13kxL8YpwUwifNlWm6ULETl1D7_cU4SUT/edit?usp=sharing\&ouid=113491029958464815726\&rtpof=true\&sd=true) to see the recommended format for importing keyword data.

#### Delete Keywords by Text

To delete specific keywords without searching through the table:

1. Click on the keyword count to go to the keywords management page
2. Click on the dropdown menu (three dots) in the page header
3. Select "**Delete Keywords**"
4. Enter or paste keywords to delete (one per line or comma-separated)
5. Click "Delete" to remove matching keywords

Only exact matches will be deleted. After deletion, you'll see a summary of how many keywords were deleted and how many were not found.

<figure><img src="/files/K60BJkjtbwoGH2wQdFdl" alt=""><figcaption><p>Bulk delete keywords by simply pasting a list of keyword names.</p></figcaption></figure>

{% hint style="warning" %}
Deleting keywords will permanently remove all historical ranking data for those keywords. This action cannot be undone.
{% endhint %}

#### Manage competitors

To manage your competitors, click on the competitors count. This will redirect you to a page where you can add or remove competitors as needed.

<figure><img src="/files/KfSppaPwFYrnjE9k49cT" alt=""><figcaption><p>You can add multiple competitors at once.</p></figcaption></figure>

{% hint style="info" %}
**Tracking Competitor Business Names in Local Pack**

You can also track competitor business names in Google's Local Pack by entering them in this format:`domain.com|Business Name`

For example: `happylambhotpot.com|Happy Lamb Hot Pot`

This allows you to monitor both organic rankings and Local Pack positions for your competitors, giving you a complete view of the competitive landscape.
{% endhint %}

Once you’ve added competitors, you’ll be able to filter them using the Competitors Filter for more focused analysis.

<figure><img src="/files/45CcNYhMUC2moJ6CfRmj" alt=""><figcaption><p>The table and chart will show the data for the selected competitors.</p></figcaption></figure>

{% hint style="success" %}
SEO Utils automatically populates keyword ranking data for newly added competitors starting from **the date you originally created the tracker**, not just from the date you add competitors. This ensures you don't lose any historical data.
{% endhint %}

#### Manage snapshots

Each time the rank tracker runs, SEO Utils creates a snapshot containing all ranking data for that date. You can manage these snapshots to clean up old data or remove unwanted entries.

To access the snapshots management page, click on the "Snapshots" link in the report header, or navigate to **Rank Trackers > \[Your Report] > Snapshots**.

From this page, you can:

* **View all snapshots** with their date and ID
* **Delete snapshots** you no longer need

<figure><img src="/files/rXgVsGlaG00QyWd4zRh7" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="warning" %}
**Important:** Deleting a snapshot will permanently remove all associated position data for that date. This action cannot be undone.
{% endhint %}

### View Rank Tracker Report in Each Tab

#### Overview Tab

In this tab, you’ll be able to view the average ranking. The line chart displays how your keywords and competitors perform over time within a specified date range.

<figure><img src="/files/jSDODAYEJbjudKmnUMAs" alt=""><figcaption><p>Use the Date filter to see the average ranking of all keywords overtime.</p></figcaption></figure>

The below table also reflects the changes when you update the filters.

<figure><img src="/files/3vawzK9asq3UfYBgp7aH" alt=""><figcaption><p>This table shows all keywords that you added to the report.</p></figcaption></figure>

In the screenshot above, you’ll see that the keyword *“hạt điều”* ranked at position **90** on Sep **24 (From Date)** and improved to position **84** on **Sep 30 (End Date)**, showing a gain of 6 positions. The green badge highlights this positive change in the keyword’s ranking. Conversely, if a keyword declines in ranking, the badge will appear red.

{% hint style="success" %}
**Important to know**

* If a keyword ranks outside the top 100, SEO Utils will display its position as “100+” in the position column.
* If a keyword wasn’t added by a selected date, SEO Utils will display “**—**”, indicating no position data is available for that date.
* If a keyword is outside the top 100 on the start date and then ranks within the top 100 by the end date, SEO Utils will display a green “<mark style="color:green;">**New**</mark>” badge. Conversely, if a keyword drops out of the top 100 by the end date, it will show a red “<mark style="color:red;">**Lost**</mark>” badge.
* A keyword can rank for multiple pages within the same domain. SEO Utils only displays the best position. To view other positions, please switch to the [Pages tab](#pages-tab).
* When your business appears in **Google's Local Pack (top 3 local results)**, a 🗺️ **map pin icon** will appear next to the position number to indicate this premium placement.
  {% endhint %}

<figure><img src="/files/gkKrXh1j5UUBPA1nWPuL" alt="" width="375"><figcaption><p>Google's Local Pack indicator</p></figcaption></figure>

{% hint style="success" %}
**Pro Tips**

To see your keyword ranking performance over the **last 7 days**, set the End Date to the current date and the From Date to 7 days ago. You can then observe keyword performance by examining the **Diff column**.
{% endhint %}

You can also click on a specific keyword to view its ranking performance over time.

<figure><img src="/files/jNINKG22d4vBmzvBeXlY" alt=""><figcaption><p>View data for a keyword.</p></figcaption></figure>

If you'd like to view the SERP data for a keyword, simply click on the SERP button next to it.

<figure><img src="/files/tnSYYmPRXp7yvAUh0KFl" alt="" width="563"><figcaption><p>View SERP data of a keyword.</p></figcaption></figure>

You can view the historical SERP data by using the Date filter.

<figure><img src="/files/iknooNlTJWCUQfvo8oYz" alt=""><figcaption><p>View historical SERP data</p></figcaption></figure>

#### SERP Features Tracking

SEO Utils now tracks various SERP features that appear alongside organic results. The **SF** (SERP Features) column shows how many special features appear for each keyword.

**Tracked SERP Features Include:**

* **Local Pack** - Top 3 local business results with map
* **Featured Snippet** - Answer box at the top of results
* **Knowledge Panel** - Information box about entities
* **AI Overview** - AI-generated summaries
* **People Also Ask** - Related questions section
* **Shopping** - Product listings
* **Video** - Video carousel
* **News** - News articles
* **Images** - Image pack
* And more...

Click on the number in the SF column to see which specific features appear for that keyword.

<figure><img src="/files/wVDkjbKjD7gkHmvZQCfD" alt="" width="375"><figcaption><p>SERP features for keyword.</p></figcaption></figure>

You can also use the SERP Features filter to find keywords that trigger specific features, helping you optimize for these valuable SERP positions.

<figure><img src="/files/VIOl0gIVxbQR6NritaV4" alt=""><figcaption><p>Filter by SERP Features.</p></figcaption></figure>

{% hint style="success" %}
**Local Pack Advantage**

When your business appears in the Local Pack, it's displayed with a 🗺️ map pin icon. These positions are extremely valuable as they:

* Appear at the very top of search results
* Include rich information (reviews, address, hours)
* Link directly to your Google Maps listing
* Drive both online visibility and foot traffic
  {% endhint %}

#### PAA Source Tracking

When **PAA Click Depth** is enabled on the report (see the configuration section above), SEO Utils detects whether your target domain — or any of your competitors — is featured as a source inside Google's People Also Ask box. This is a separate signal from organic ranking and from the "PAA box appeared on the SERP" SF flag.

**The purple PAA badge**

In the Overview tab, a small purple PAA badge appears next to the diff cell whenever the corresponding domain has at least one PAA source appearance for that keyword. The number on the badge is the appearance count.

<figure><img src="/files/ah7oeJ7FhG72CvlstvEV" alt=""><figcaption><p>Purple PAA badge in the Overview tab indicating the domain is featured as a source inside the People Also Ask box</p></figcaption></figure>

Hover the badge for a tooltip showing the count, or click it to open the SERP slideover with the full list of PAA questions and source URLs grouped by domain.

<figure><img src="/files/xPKXWDpu5MhaY0BeDHYE" alt=""><figcaption><p>SERP slideover panel listing every PAA appearance — questions, source URLs, and the matched domain</p></figcaption></figure>

**Filtering by PAA presence**

A new **"\[Your Domain] in PAA"** filter sits next to the SERP Features filter. Two values:

* **Featured in PAA** — keywords where your target domain has at least one PAA source appearance in the selected date range.
* **Not featured in PAA** — keywords where your target domain has zero PAA source appearances. Useful for finding **PAA opportunities**: the box exists for the keyword, but you're not the source — so you can write content targeting those questions.

<figure><img src="/files/i96w6vYWV0gLpP76cT31" alt=""><figcaption><p>"Featured in PAA" / "Not featured in PAA" filter alongside the existing SERP Features filter</p></figcaption></figure>

{% hint style="info" %}
**How matching works:** SEO Utils normalizes the source domain returned by DataForSEO (stripping the `www.` prefix) before matching against your tracked domains. So adding `kentucky.com` as a competitor will match PAA sources Google attributes to `www.kentucky.com`. Real subdomains like `blog.example.com` still require **Include Subdomains** to be enabled on the report.
{% endhint %}

{% hint style="warning" %}
**Reality check on PAA sources:** Google increasingly answers PAA questions with AI Overview content instead of citing a single source URL. When this happens, DataForSEO returns the question but no source domain — so no badges fire even though the PAA box appeared. This is a Google trend, not a tracking gap on our side. Coverage varies by query.
{% endhint %}

#### Pixels From Top Display

When **Track Pixels From Top** is enabled on the report, every rank cell in the Overview tab shows a small **px** value next to the position number. This is the vertical pixel offset of the snippet from the top of the SERP — lower numbers mean better real-world visibility.

<figure><img src="/files/6DMOyF8FC06b9f9VpTkB" alt=""><figcaption><p>Position cells showing the px value next to the rank number — e.g. "1 / 182px" or "2 / 750px"</p></figcaption></figure>

A dedicated **Pixels Diff** column also appears alongside the existing **Diff** column, showing how the pixel offset changed between the From and End dates. Color coding follows the same convention as rank diff:

* **Green** — the snippet moved up the page (fewer pixels from top) → improved visibility.
* **Red** — the snippet moved down the page → worse visibility, even if organic rank stayed the same. This is what usually happens when Google adds new SERP features above your result.
* **New** / **Lost** — the snippet appeared for the first time or disappeared between the two dates.

Hover the px value to see the exact pixel offset in a tooltip.

{% hint style="info" %}
**Pixel data for competitors works automatically.** When you add a competitor to a tracker with Track Pixels From Top enabled, SEO Utils backfills pixel offsets for that competitor across every existing snapshot — no re-scrape needed, no extra cost. The pixel data was already captured in the SERP cache during the original scrapes; adding a competitor just reads it back out for that domain. Each competitor row in the Overview grid gets its own Pixels Diff column.
{% endhint %}

{% hint style="warning" %}
**Not every position gets a pixel value.** DataForSEO only emits rectangle coordinates for snippets that were laid out within the rendered viewport. Results deeper on the page (typically beyond position \~10–15) and certain SERP item types may have no pixel measurement attached — the column simply shows the rank without a px value. This isn't a bug; the data just isn't part of DataForSEO's response.
{% endhint %}

You can also switch to the **SERP Comparison** tab. That tool allows you to instantly view side-by-side SERP results for any keywords to easily spot trends and competitors.

{% embed url="<https://drive.google.com/file/d/1yshf84UURl5w_nQiVRWRLP3Y70IWqLEu/view?usp=sharing>" fullWidth="false" %}
SERP Comparison tool in action
{% endembed %}

#### Rerun the Tracker

You can rerun the tracker at any time. This is particularly useful when you need to check the keyword ranking on-demand, without relying on a scheduled run.

<figure><img src="/files/siVKEECpEGVlRci8wzgi" alt="" width="373"><figcaption><p>Click the button to rerun the tracker.</p></figcaption></figure>

{% hint style="success" %}
When you re-run the tracker, SEO Utils only scrapes SERP data for keywords missing current date information. This helps save time and costs.
{% endhint %}

#### Run Partial Scan

For advanced users who need more control over which keywords to scan, SEO Utils offers a **Partial Scan** feature. This allows you to select specific keywords and update only their rankings, while preserving the existing ranking data for other keywords.

**How to run a partial scan:**

1. Navigate to the [Keywords management page](#manage-keywords-and-tags) by clicking on the keyword count
2. Select the specific keywords you want to scan
3. Click the "Run Partial Scan" bulk action

<figure><img src="/files/UlMYYBzEFeb8fcbxEAai" alt=""><figcaption><p>Select keywords and run partial scan</p></figcaption></figure>

**Understanding Stale Data:**

When you run a partial scan, only the selected keywords get fresh SERP data. Keywords that weren't included in the scan will show their last known positions with a **stale data indicator** (⚠️ icon).

Hovering over the stale indicator shows when that keyword was last scanned. This helps you identify which keywords have current data versus which ones are showing historical positions.

<figure><img src="/files/O9FAQG0a4A3eeotcRSdP" alt=""><figcaption><p>Stale data indicator showing when keyword was last scanned</p></figcaption></figure>

{% hint style="warning" %}
**Important: Partial Scan Best Practices**

We recommend only using partial scans when you have **disabled the schedule** (set "Rerun Every" to 0 days).

Here's why: If you have scheduled auto-runs enabled and you run a partial scan on only some keywords, the next scheduled run will automatically scan all keywords—including the ones you didn't include in your partial scan. This could lead to unexpected SERP API costs or proxy usage.
{% endhint %}

#### Annotations

<figure><img src="/files/L2uGaaXquf44iTCGwTgy" alt=""><figcaption><p>Annotations</p></figcaption></figure>

This feature let you highlight key events or changes in your data. For instance, if you’ve just wrapped up a major content audit, you can mark that event on the chart to track its impact on your rankings.

{% hint style="info" %}
When adding new keywords, SEO Utils creates a **System** annotation to indicate the date you added those keywords.
{% endhint %}

You can watch this video to see how to manage annotations.

{% embed url="<https://drive.google.com/file/d/1Mmk8nCnp6t4J0mYdYMg4yIPmnRYQDKlS/view?usp=sharing>" %}
How to manage annotations.
{% endembed %}

#### Pages Tab

You can see all the ranked pages in this tab. Like the Overview tab, you can filter by **Dates** or **Competitors**.

<figure><img src="/files/va61C9JiAKGXRoCuw6bT" alt=""><figcaption><p>View all ranked pages with filters</p></figcaption></figure>

The **Status** column displays the ranking status of each page. You can filter based on this column. This is particularly useful for identifying good or bad performing pages within a specific date range.

<figure><img src="/files/gSACktvgK347Vjg6nwXD" alt="" width="375"><figcaption><p>Extract new ranking pages or pages with improved average positions.</p></figcaption></figure>

You can also filter the pages with the status "Unchanged" to improve their ranking.

{% hint style="info" %}
**Important to know**

* <mark style="color:green;">**New**</mark>: Keywords that have no ranking on the From date but have a ranking on the End date
* <mark style="color:red;">**Lost**</mark>: Keywords that have a ranking on the From date but no ranking on the End date
* <mark style="color:green;">**Improved**</mark>: Keywords that have moved up in ranking position between the From date and End date
* <mark style="color:red;">**Declined**</mark>: Keywords that have moved down in ranking position between the From date and End date
* **Unchanged**: Keywords that have maintained the same ranking position on both the From date and End date
  {% endhint %}

The **Keyword Count** column indicates how many keywords the page is ranking for. You can also click on the down arrow icon button next to the page URL to view all ranking keywords of that page.

<figure><img src="/files/dhhTLQLNO7zzPoT2OhHh" alt=""><figcaption><p>This page has improved by 26 from September 23 to September 30.</p></figcaption></figure>

#### Rankings Distribution Tab

In [v1.25.0](https://help.seoutils.app/guide/pages/FYHJNu9cAi74Qc90ALo7#v1.25.0), SEO Utils introduced a new report for the Organic Rank Tracker that provides a detailed ranking distribution analysis. This feature lets you see how many keywords your website or competitors rank in the **top 3, top 10, top 20, and top 100**.

For each ranking range, you can also track the number of keywords that are new, lost, improved, or declined—giving you valuable insights into performance trends.

<figure><img src="/files/WqsJI5Niy9nk4fCH8uX3" alt=""><figcaption><p>Rankings Distribution report view</p></figcaption></figure>

You can click on the total number of keywords to see which keywords are ranking.

<figure><img src="/files/Kn34ZYMiLCBHlc9cHFRn" alt=""><figcaption><p>Keywords in the top 100 of vinmec.com on Jan 5, 2025.</p></figcaption></figure>

#### Competitors Discovery Tab

[In v1.26.3](https://help.seoutils.app/guide/pages/FYHJNu9cAi74Qc90ALo7#v1.26.3), SEO Utils introduces a new report: Competitors Discovery. It helps you analyze and compare your competitors’ search engine rankings.

This guide will walk you through how to read and benefit from the Competition Map (scatter plot), the timeline scrubber, and the detailed table, along with how to use the available filters.

**Understanding the Competition Map (Scatter Plot)**

<figure><img src="/files/2idQBnnlfxN5fmPwOAte" alt=""><figcaption><p>Competition Map</p></figcaption></figure>

**What does it show?**

* The **x-axis** represents the **number of keywords** a domain ranks for in Google’s top 100 search results.
* The **y-axis** represents the **average position** of a domain across all its ranked keywords.
* The **size of each bubble** represents the **visibility** of the domain. A larger bubble indicates higher visibility.
* The **color** represents different competitor domains for easy differentiation.

**How to read it?**

* **Bottom-right corner (low average position & high keyword count)** → This means a domain ranks for many keywords and is performing well (closer to position #1).
* **Top-left corner (high average position & low keyword count)** → This means a domain ranks for fewer keywords and is performing poorly.
* **Large bubbles** → These indicate competitors with strong visibility across many keywords.
* **Small bubbles** → These competitors have a lower presence in SERPs.
* **Overlapping bubbles** → Multiple domains competing for similar keywords.

{% hint style="success" %}
**Key benefits of the scatter plot**

* **Identify strong competitors** → Look for large bubbles with low average positions.
* **Spot market gaps** → Find competitors ranking for fewer keywords but with high visibility.
* **Assess keyword competition** → See who dominates a niche by ranking for many keywords.
  {% endhint %}

{% hint style="info" %}
**Tips:**

* **Minimap Toggle**: Enables zooming for a closer view.
* **Hovering Over a Bubble**: Displays a tooltip with details about that domain, including: Number of keywords, Average ranking position, Standard deviation, Visibility percentage & change over time.
  {% endhint %}

**Scrubbing Through Time with the Timeline**

Below the Competition Map sits a timeline that lets you scrub through every snapshot the report has — drag the playhead, click anywhere on the track to jump, or press **Play** to auto-advance (\~750ms per snapshot, loops back to the From anchor at the end) and watch bubbles smoothly reposition and resize as competitors gain or lose visibility over time.

<figure><img src="/files/9CjYAmGNjs6KUdJEWUKE" alt=""><figcaption><p>Timeline scrubber below the Competition Map</p></figcaption></figure>

Click the track once to focus it, then use the keyboard:

| Shortcut   | Action                                 |
| ---------- | -------------------------------------- |
| ← / →      | Step to the previous / next snapshot   |
| Home / End | Jump to the earliest / latest snapshot |
| Space      | Toggle play / pause                    |

{% hint style="info" %}
Snapshots are spaced evenly along the track (not by calendar gap), so days where the tracker didn't run don't waste width and the playhead always snaps to a real data point. The timeline hides itself for reports with fewer than two snapshots.
{% endhint %}

{% hint style="success" %}
**Scrub anywhere — including dates before your From anchor.** Bubble positions always reflect the playhead's date. Diff numbers stay mathematically consistent in both directions: positive means the competitor was bigger on the playhead date than on the anchor date.
{% endhint %}

**Understanding the Detailed Competitor Table**

<figure><img src="/files/T9mXQQkIoUUmLzIxyjmW" alt=""><figcaption><p>Competitor table</p></figcaption></figure>

The table provides more specific metrics for each domain, helping you analyze competitor trends in depth.

<table><thead><tr><th>Column</th><th>Description</th><th data-hidden></th></tr></thead><tbody><tr><td>Domain</td><td>The competitor’s website</td><td></td></tr><tr><td>Visibility</td><td>A percentage representing how visible the domain is in search results. Higher visibility means better rankings across keywords.</td><td></td></tr><tr><td>Keywords</td><td>The number of keywords the domain ranks for in the <strong>top 100</strong>.</td><td></td></tr><tr><td>Avg. Position</td><td>The <strong>average ranking position</strong> of all ranked keywords for the domain. A lower number means better rankings.</td><td></td></tr><tr><td>Std. Deviation</td><td>Measures the variation of ranking positions. A <strong>low value</strong> indicates stable rankings, while a <strong>high value</strong> suggests fluctuations.</td><td></td></tr></tbody></table>

{% hint style="success" %}
Tips:

* Sort the columns by clicking on the headers to rank competitors by Visibility, Keywords, or Average Position.
* Compare visibility changes to see which domains are gaining or losing ranking positions over time.
* Check standard deviation to determine ranking stability—domains with a low Std. Deviation have consistent rankings.
  {% endhint %}

**Using Filters for a More Targeted Analysis**

1. Date Filter

<figure><img src="/files/2De4Rxh8h0VkLbuANwKy" alt="" width="375"><figcaption><p>Date filter</p></figcaption></figure>

* Compare ranking changes over two specific dates.
* Useful for tracking ranking trends over time.

2. Depth Filter

<figure><img src="/files/AsZ0pxX6uBFu1RZecHlu" alt="" width="218"><figcaption><p>Depth filter</p></figcaption></figure>

* Select Top 100, Top 50, Top 20, Top 10, Top 5, or Top 3 domains.
* Helps you analyze only the most relevant competitors in SERPs.
* Use Case: If you want to focus on high-ranking competitors, select Top 10 or Top 5.

3. Ignored Domains Filter

<figure><img src="/files/m6EeaPOZT9tnkMncIHdF" alt="" width="350"><figcaption><p>Ignored domain filter</p></figcaption></figure>

* Exclude specific competitors that may not be relevant (e.g., social media sites like Facebook or large aggregators).
* Use Case: If a competitor dominates rankings but isn’t a direct competitor, excluding them gives clearer insights into your true competitors.

{% hint style="success" %}
You can also filter the data by searching for a specific keyword, allowing you to analyze rankings and competition for that keyword alone.
{% endhint %}

#### Keyword Fluctuation Tab

The Keyword Fluctuation tab helps you track how your keyword rankings have changed over time. Unlike the Overview tab which compares two specific dates, this tab shows ranking changes across multiple time periods at a glance.

<figure><img src="/files/aAKWw4Jmde0MuSn0PWvt" alt=""><figcaption><p>Keyword Fluctuation tab showing ranking changes over time</p></figcaption></figure>

**Understanding the Columns**

| Column  | Description                                                                                   |
| ------- | --------------------------------------------------------------------------------------------- |
| Keyword | The tracked keyword with tags                                                                 |
| Intent  | Search intent classification (I=Informational, N=Navigational, C=Commercial, T=Transactional) |
| Start   | The earliest ranking position within the selected date range                                  |
| Rank    | Current ranking position at the end of the date range                                         |
| SF      | Number of SERP features appearing for this keyword                                            |
| 1d      | Ranking change compared to 1 day ago                                                          |
| 7d      | Ranking change compared to 7 days ago                                                         |
| 30d     | Ranking change compared to 30 days ago                                                        |
| Life    | Lifetime change (difference between Start and current Rank)                                   |
| URL     | The ranking page URL                                                                          |

{% hint style="info" %}
**Reading the change columns:**

* **Green numbers** indicate ranking improvements (moved up in search results)
* **Red numbers** indicate ranking declines (moved down)
* **0** means no change in position
* **—** means data is not available (keyword wasn't ranked on that date)
  {% endhint %}

{% hint style="success" %}
**Use Cases for Keyword Fluctuation**

* **Monitor stability**: Keywords showing 0 across all time periods have stable rankings
* **Identify quick wins**: Look for keywords with positive 7d/30d changes to understand what's working
* **Spot problems early**: Negative changes in recent periods (1d, 7d) may indicate issues to address
* **Track Local Pack**: Keywords with 🗺️ map pin icons are ranking in Google's Local Pack
  {% endhint %}

#### Insights Tab

The Insights tab automatically analyzes your keyword ranking data and classifies keywords into actionable categories. It helps you identify which keywords need attention and why — without manually scanning through hundreds of rows.

<figure><img src="/files/9UepPdy6GtugSZJnbbV6" alt=""><figcaption><p>Insights tab showing summary cards for each insight type</p></figcaption></figure>

Insights are computed automatically after each snapshot completes. You don't need to trigger them manually.

**Summary Cards**

The tab displays summary cards, each representing a different insight type:

| Card          | Color  | Description                                                                                                                                           |
| ------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| Trending Up   | Green  | Keywords with a statistically significant upward ranking trend over the configured window                                                             |
| Trending Down | Red    | Keywords with a statistically significant downward ranking trend                                                                                      |
| Pogo Sticking | Orange | Keywords with unstable rankings that oscillate back and forth significantly                                                                           |
| Flickering    | Purple | Keywords that repeatedly appear and disappear from search results                                                                                     |
| Key Events    | Blue   | Keywords associated with pages that generated conversions in Google Analytics 4                                                                       |
| PAA Source    | Purple | Keywords where your target domain currently appears as a source inside the People Also Ask box. Requires PAA Click Depth to be enabled on the report. |

Click any card to see the matching keywords in a table directly below the cards. The selected card is highlighted, and you can switch between insight types by clicking different cards. Your selection is remembered across sessions.

A subtitle above the cards shows the date range used for calculations: *"Insights calculated from your last 14 snapshots (Mar 13 – Mar 26)"*. You can adjust the number of snapshots using the dropdown — options range from 7 to 90 days.

{% hint style="success" %}
**Enabling Key Events:** Connect your [Google Analytics 4](/guide/google-analytics-4) property to see which keywords drive conversions. SEO Utils matches keywords to landing pages using your rank tracker's position data. If you also have [Google Search Console](/guide/google-search-console) connected, attribution accuracy improves — GSC provides Google's actual click data showing which keyword led to which page.
{% endhint %}

**Keyword Table**

When you click a summary card, a keyword table appears showing:

* **Keyword** — with insight badges displayed inline
* **Start Position** — position at the beginning of the rolling window
* **Current Position** — position at the end of the rolling window
* **Diff** — position change over the window
* **Page** — the ranking URL

You can expand any keyword row to view its position history chart with trend lines and conversion bars.

<figure><img src="/files/cg8JCMBjrXyr2kvVeSvI" alt=""><figcaption><p>Insights tab with keyword table showing filtered results for a selected insight type</p></figcaption></figure>

**Inline Badges in Overview**

Keywords with active insights also display colored badges in the Overview tab — next to existing tags. These badges are read-only indicators that help you spot insights while browsing the full keyword table.

<figure><img src="/files/CZIdJXu4ydLypnRIQhjW" alt=""><figcaption><p>Keyword rows showing inline insight badges alongside tags in the Overview tab</p></figcaption></figure>

**Chart Overlays**

When you expand a keyword row to view its position history chart, additional overlay controls appear if that keyword has insights:

* **Show Trend Line** — Toggle a dashed regression line across the chart. Green for trending up, red for trending down.
* **Highlight Swings** — Toggle orange markers on the specific data points that triggered pogo sticking detection.
* **Key Events Bars** — When GA4 conversion data exists, subtle blue bars appear at the bottom of the chart on days that had conversions. These are always visible (no toggle needed) and show the event count in the tooltip.

<figure><img src="/files/wn7aUxfiIk6ehmBvVNl5" alt=""><figcaption><p>Position history chart with trend line overlay and GA4 conversion bars</p></figcaption></figure>

{% hint style="info" %}
**How Insight Detection Works**

* **Trend Detection** uses linear regression with an R² safety net to distinguish real trends from noise. It applies tiered thresholds — small ranking changes on page 1 are significant, while the same change on page 5 is noise.
* **Pogo Sticking** detects keywords with 2 or more significant opposing position swings within a 14-day window. The swing threshold scales by position tier (3+ positions for top 10, 5+ for positions 11-30, 10+ for positions 31-100).
* **Flickering** counts state transitions between ranked and not-ranked. Keywords with 3 or more transitions in 14 days are flagged — this indicates indexation instability, not ranking competition. For reports with a shallow tracking depth (under 50), SEO Utils automatically excludes transitions where the keyword was near the depth boundary — preventing false positives from keywords that simply bounce in and out of your configured tracking range.
* **PAA Source** is a binary current-state signal — only the most recent snapshot matters. The card count reflects "your target domain is in PAA right now" rather than "was in PAA at some point recently". Activation and resolution events fire the day you appear in or disappear from a PAA box, giving precise gained/lost alerts via [Automations](/guide/automations).
  {% endhint %}

{% hint style="warning" %}
**Requirements for Each Insight Type**

* **Trending Up/Down** — Requires a minimum number of snapshots (at least 50% of the configured trend window, minimum 7). Available for all report frequencies.
* **Pogo Sticking & Flickering** — Require **daily tracking**. These insights are locked for weekly or monthly reports because the data between snapshots is invisible. A notice appears on locked cards. For the most accurate flickering detection, use a tracking depth of 100. Shallow depths (10-30) may miss some genuine flickering because keywords near the depth boundary are automatically excluded to prevent false positives.
* **Key Events** — Requires [Google Analytics 4](/guide/google-analytics-4). Connect a GA4 property and map it to the same domain as your rank tracker report. Optionally connect [Google Search Console](/guide/google-search-console) for more accurate keyword-to-page attribution. Available for all report frequencies.
* **PAA Source** — Requires **PAA Click Depth ≥ 1** on the report (DataForSEO only). The card is locked otherwise, with a hint to enable the setting. Available for all report frequencies.
  {% endhint %}

**Insights Readiness Checklist**

Use this table to check which insights are available for your report:

| Insight          | Schedule      | Min Snapshots               | Tracking Depth                          | GA4 Connected | GSC Connected                | Other Requirement                         |
| ---------------- | ------------- | --------------------------- | --------------------------------------- | ------------- | ---------------------------- | ----------------------------------------- |
| Trending Up/Down | Any           | 7+ (or 50% of trend window) | Any                                     | Not needed    | Not needed                   | —                                         |
| Pogo Sticking    | Daily (1 day) | 7+                          | Any (100 recommended)                   | Not needed    | Not needed                   | —                                         |
| Flickering       | Daily (1 day) | 2+                          | Any (100 recommended for best accuracy) | Not needed    | Not needed                   | —                                         |
| Key Events       | Any           | Any                         | Any                                     | **Required**  | Optional (improves accuracy) | —                                         |
| PAA Source       | Any           | 1+                          | Any                                     | Not needed    | Not needed                   | **PAA Click Depth ≥ 1** (DataForSEO only) |

{% hint style="info" %}
To check your report's settings, open the report and look at the schedule frequency (daily/weekly/on-demand), tracking depth, and snapshot count. If Pogo Sticking or Flickering cards show as locked, switch your report schedule to **daily**.
{% endhint %}

**Configuring the Trend Window**

The trend detection window defaults to 14 days. You can adjust it directly on the Insights tab using the dropdown in the subtitle area (e.g., "Insights calculated from your last **\[14 ▾]** snapshots"). When you change the value, insights are automatically recomputed in the background. A longer window (e.g., 30 days) catches slower trends but requires more snapshots before badges appear.

**Insights in Exported Reports**

When you export a rank tracker report as PDF or HTML, insight badges are included in the keyword table. Each badge uses inline styling, so they render correctly in emails, PDFs, and shared links without requiring JavaScript.

### Manage Organic Rank Tracker Reports

You can add tags to your Organic Rank Tracker reports and filter by those tags.

This will be especially useful if you manage dozens of locations for a single client. You can add the client's name as a tag, and whenever you want to view all reports for that client, you can simply filter by the tag name.

<figure><img src="/files/dlO4r5w96f8p0DUugyO4" alt=""><figcaption></figcaption></figure>

### Export Reports

You can export the organic rank tracker report as **CSV**, **PDF**, or **HTML** by clicking the Actions dropdown.

<figure><img src="/files/Ck63hIKJb1PSF9NOpq9k" alt=""><figcaption><p>Export an organic rank tracker report</p></figcaption></figure>

{% hint style="info" %}
**PAA Appearances column** — When PAA Click Depth is enabled on the report, the CSV export includes a `PAA Appearances` column showing how many times each domain appeared as a PAA source within the selected date range. This lets you pivot or filter PAA visibility data externally in Excel, Sheets, or any analytics tool.
{% endhint %}

{% hint style="info" %}
**Pixels From Top columns** — When Track Pixels From Top is enabled on the report, the CSV export includes three additional columns: `Pixels From Top [from-date]`, `Pixels From Top [to-date]`, and `Pixels Diff`. Use these to analyze on-screen visibility trends outside the app or build custom reports that combine rank and pixel signals.
{% endhint %}

When exporting a report as PDF or HTML, you can personalize the report cover with your own branding by clicking the Settings icon.

<figure><img src="/files/o4hxlHAaiyeSGsFPw05q" alt="" width="229"><figcaption><p>Custom your own branding</p></figcaption></figure>

You can use placeholders to dynamically replace content in headings, subheadings, or descriptions. For example, if you include the placeholder `[domain]`in a sub-heading, it will automatically replace it with the target domain of your report.

<figure><img src="/files/IqZ4WvLL8CazwsCScyfo" alt=""><figcaption></figcaption></figure>


# Saved Keywords

Saved Keywords lets you collect and organize keywords from various tools into named lists. You can save keywords from Keyword Explorer, Google PAA, Autocomplete, Organic Keywords, and Ads Vision—all in one place.

Each list is organized by location and language, making it easy to manage keywords for different markets or projects.

## Creating a Saved Keywords List

{% stepper %}
{% step %}
**Navigate to Saved Keywords**

Go to **Keyword Research > Saved Keywords** in the sidebar.
{% endstep %}

{% step %}
**Create a New List**

* Click the **"Create List"** button in the top-right corner
* Enter a **name** for your list
* Select the **location/language** you're targeting (This is used for checking keyword metrics)
* Click **"Create List"**

<figure><img src="/files/bXhRW2fcDEEO9MFrf4JR" alt=""><figcaption><p>Create a new saved keywords list</p></figcaption></figure>
{% endstep %}
{% endstepper %}

## Saving Keywords from Other Tools

You can save keywords directly from any keyword tool using bulk actions.

{% stepper %}
{% step %}
**Select Keywords**

* Go to any keyword tool (Keyword Explorer, Organic Keywords, Google PAA, Autocomplete, or Ads Vision)
* Select the keywords you want to save using the checkboxes
  {% endstep %}

{% step %}
**Use the Save to List Action**

* Click **"Bulk Actions"**
* Select **"Save to List"**

<figure><img src="/files/PLZAX2Jh4APVG9H4Cvwi" alt=""><figcaption><p>Save keywords using bulk action</p></figcaption></figure>
{% endstep %}

{% step %}
**Choose a List**

* Select an existing list from the dropdown, or
* Click **"New List"** to create one directly from the modal
* Click **"Add Keywords"**

<figure><img src="/files/CKGmg0IkzsEJV3bGZsNp" alt=""><figcaption><p>Select a list or create a new one</p></figcaption></figure>

{% hint style="info" %}
SEO Utils automatically skips duplicate keywords. You'll see a message showing how many were added and how many were skipped.
{% endhint %}
{% endstep %}
{% endstepper %}

## Managing Keywords in a List

Click on any list to open the detail view where you can manage your keywords.

<figure><img src="/files/WbKQpwh2okxisetp9Rh6" alt=""><figcaption><p>Saved keywords list detail view</p></figcaption></figure>

### Available Actions

| Action                | Description                                              |
| --------------------- | -------------------------------------------------------- |
| Add Keywords          | Manually add keywords to the list                        |
| Check Keyword Metrics | Fetch search volume, CPC, and difficulty from DataForSEO |
| Update Tags           | Add or remove tags for selected keywords                 |
| Remove Keywords       | Delete keywords from the list                            |
| Export CSV            | Download all keywords with their metrics                 |
| Map Keyword Data      | Import external metrics from CSV/Excel files             |

### Filtering Keywords

Use filters to narrow down your list:

* **Search**: Find keywords by name
* **Volume Range**: Filter by search volume
* **CPC Range**: Filter by cost per click
* **Difficulty Range**: Filter by keyword difficulty
* **Search Intents**: Filter by user intent
* **Tags**: Filter by custom tags

## Adding Tags to Keywords

Tags help you organize keywords within a list.

### Update Tags for Multiple Keywords

{% stepper %}
{% step %}
**Select Keywords**

Select keywords using the checkboxes in the table.
{% endstep %}

{% step %}
**Apply Tags**

* Click **"Bulk Actions"** > **"Update Tags"**
* Choose tags to **add** or **remove**
* Click **"Execute"**

<figure><img src="/files/d8eLNg6E9l7CTu92Yjgz" alt=""><figcaption><p>Bulk update tags for keywords</p></figcaption></figure>
{% endstep %}
{% endstepper %}

{% hint style="success" %}
You can also update tags for a single keyword by clicking the three-dot menu on any row and selecting **"Update Tags"**.
{% endhint %}

## Importing External Data

Use **Map Keyword Data** to import metrics and tags from CSV or Excel files.

{% stepper %}
{% step %}
**Open Map Keyword Data**

Click the three-dot menu in the page header and select **"Map Keyword Data"**.
{% endstep %}

{% step %}
**Upload Files**

Upload your CSV or Excel file(s) containing keyword data.
{% endstep %}

{% step %}
**Map Columns**

Map each column to the appropriate data type:

* **Keyword**: Required - matches keywords in your list
* **Volume**: Search volume data
* **CPC**: Cost per click data
* **Intent**: Search intent classification
* **Tags**: Custom tags (comma-separated)

<figure><img src="/files/Gr6vjkY2DDMMEYPqDtGd" alt=""><figcaption><p>Map external keyword data</p></figcaption></figure>
{% endstep %}

{% step %}
**Import Data**

Click **"Import Data"** to apply the external data to matching keywords.

{% hint style="info" %}

* Keywords are matched case-insensitively by default
* External metrics override existing data
* Tags should be comma-separated (e.g., "seo, tools, analytics")
  {% endhint %}
  {% endstep %}
  {% endstepper %}

## Exporting Keywords

{% stepper %}
{% step %}
**Export to CSV**

* Open a saved keywords list
* Click the three-dot menu in the page header
* Select **"Export CSV"**
* Choose where to save the file
  {% endstep %}
  {% endstepper %}

The exported CSV includes: Keyword, Search Volume, CPC, Keyword Difficulty, Search Intents, and Tags.

## Checking Keyword Metrics

Fetch keyword metrics from DataForSEO for selected keywords.

{% stepper %}
{% step %}
**Select Keywords**

Select the keywords you want to check using the checkboxes. Select all if you want to check the entire list.
{% endstep %}

{% step %}
**Run the Action**

* Click **"Bulk Actions"** > **"Check Keyword Metrics"**
* Review the cost estimation
* Click **"Execute"**

{% hint style="info" %}
DataForSEO only charges for keywords that return data. Keywords without search volume won't incur costs.
{% endhint %}
{% endstep %}
{% endstepper %}

## Best Practices

* **Use descriptive list names**: Include the project or client name for easy identification
* **Organize by locale**: Create separate lists for different location/language combinations
* **Tag consistently**: Use the same tag names across lists for better organization
* **Import your data**: Use Map Keyword Data to enrich lists with external metrics
* **Export regularly**: Keep backups of your keyword lists


# LLM Rank Tracker

This tool enables you to monitor your brand's visibility and sentiment across AI-powered search results, including Google AI Overview and Google AI Mode. Track how often your brand appears in AI-generated responses, analyze competitor mentions, monitor citations, and measure sentiment over time to understand your brand's presence in the AI search landscape.

<div data-full-width="true"><figure><img src="/files/pLDrPB4BI1Y0emOigz6k" alt=""><figcaption><p>LLM Rank Tracker tool showing brand visibility across AI engines</p></figcaption></figure></div>

{% hint style="info" %}
**More AI Engines Coming Soon**: The tool currently support Google AI Overview and Google AI Mode, we're actively working on adding support for ChatGPT, Gemini, Perplexity, and other popular AI platforms soon.
{% endhint %}

## Initial Setup: Configuring Required API Credentials

Before you can start tracking your brand in AI responses, you need to configure the required API credentials. The LLM Rank Tracker requires two different API services to function properly.

<figure><img src="/files/EngWXH2T0XUmSCJJDJ1P" alt="" width="563"><figcaption><p>LLM Rank Tracker onboarding screen showing credential requirements</p></figcaption></figure>

### Required API Credentials

#### 1. DataForSEO Credentials

DataForSEO provides access to Google's AI-powered search features:

* **Purpose**: Required for tracking Google AI Mode and Google AI Overview
* **Cost**: Pay-as-you-go pricing, approximately $1.2 per 1,000 queries
* **Account Type**: You must have your own DataForSEO account

{% hint style="warning" %}
**Important**: You cannot use [rented API key services](/guide/rent-dataforseo-api-key) for LLM Rank Tracker. DataForSEO restricts certain endpoints that are essential for the queue mode functionality. Multiple users sharing a rented API key would slow down processing for everyone. For optimal performance, use your own DataForSEO account.
{% endhint %}

#### 2. LLM Provider API Key (OpenAI or OpenRouter)

An LLM provider is used for intelligent data extraction:

* **Purpose**: Required for extracting structured brand mentions from AI responses
* **Supported Providers**: OpenAI or OpenRouter - you only need one
* **Model Used**: o4-mini for cost-efficient extraction
* **Cost**: Minimal due to efficient prompt design and caching

{% hint style="info" %}
**Provider Selection**: The onboarding screen includes a dropdown to select your preferred provider and a "Test Provider" button to verify your API key is working correctly.
{% endhint %}

### Optional API Credentials

#### 3. Google NLP API Key (Optional)

Google's Natural Language API provides advanced sentiment analysis:

* **Purpose**: Enables sentiment analysis of brand mentions in AI responses
* **When to use**: If you want to track how positively or negatively your brand is mentioned
* **Note**: Without this API key, sentiment analysis will be skipped and sentiment scores will not be available

**Pricing Structure**:

* **Free Tier**: First 5,000 units per month are free (1 unit = 1,000 characters)
* **Paid Tiers**:
  * 5,001 to 1,000,000 units: $0.0010 per unit
  * 1,000,001 to 5,000,000 units: $0.0005 per unit
  * Over 5,000,000 units: $0.00025 per unit
* **Example**: Analyzing 2,500 characters = 3 units

{% hint style="info" %}
**Cost Estimation**: Most brand mentions are 100-500 characters, so you can analyze approximately 10,000-50,000 brand mentions within the free tier each month.
{% endhint %}

{% hint style="success" %}
If you don't have a DataForSEO account yet, visit [this guide](https://help.seoutils.app/guide/seo-data-source#how-to-connect-your-dataforseo-account-to-seo-utils) for step-by-step instructions on creating one.
{% endhint %}

## How to Create Your First LLM Rank Tracker

Creating an LLM Rank Tracker involves configuring what to track (your brand variants), where to track (AI engines), and how to track (search terms and schedule).

### Step 1: Access the LLM Rank Tracker Tool

Navigate to the LLM Rank Tracker section from the main menu. You'll see a list of existing trackers (if any) and an "Add LLM Rank Tracker" button in the top-right corner.

<figure><img src="/files/zo2zDWPmiCtXTAAJhi3M" alt=""><figcaption><p>LLM Rank Tracker list page with Add button</p></figcaption></figure>

### Step 2: Configure Basic Tracker Settings

Clicking "Add LLM Rank Tracker" opens a configuration page. Let's go through each field in detail:

<figure><img src="/files/fL69JwSiK295if1H2nwP" alt=""><figcaption><p>Complete Add LLM Rank Tracker configuration page</p></figcaption></figure>

#### Brand Variants

**Purpose**: All variations of your brand name that should be tracked in AI responses.

**How to Add**: Type a brand variant in the input field and hit the enter or comma key (",") to apply.

**What to Include**:

* Official brand name: "SEO Utils"
* Common variations: "SEOUtils", "SEO Utils App"
* Abbreviations: "SU" (if commonly used)
* Misspellings: "SEO Util", "SEOUtils"
* Previous names: If recently rebranded
* Domain variations: "seoutils.app"

{% hint style="info" %}
**Pro Tip**: The first brand variant you enter becomes the primary brand name shown in reports and the interface. Make sure to enter your official brand name first.
{% endhint %}

#### AI Engines Selection

**Available Options**:

1. **Google AI Overview**:

* Appears in regular Google search results
* Shows as a collapsible AI-generated summary
* Desktop-only feature
* Provides citations to source websites

2. **Google AI Mode**:

* Accessed via Google's AI mode search
* Conversational AI responses
* Different from regular search results
* Currently English-only

#### Location and Language Configuration

**Location / Language Dropdown**:

* Select your primary target market
* Affects how queries are sent to AI engines
* Influences the results you receive

**Geo Target (Optional)**:

* For more specific location targeting
* Enter city, state, or region
* Overrides the general location setting
* Examples: "New York, NY", "London", "California"

#### Schedule Configuration

**Schedule Frequency**: Determines how often the tracker runs automatically.

**How Scheduling Works**:

* First run happens immediately when you create the tracker
* Subsequent runs occur at the scheduled interval
* SEO Utils must be open for scheduled runs

{% hint style="success" %}
**Recommended Schedules**:

* **On-demand (0)**: Manual runs only
* **Daily (1)**: For competitive industries or active campaigns
* **Weekly (7)**: For stable markets with regular monitoring needs
* **Monthly (30)**: For long-term trend analysis or low-competition niches
  {% endhint %}

After filling all fields, click "Create Tracker". The system will redirect you to the tracker detail page

## Managing Your LLM Rank Tracker

Once your tracker is created and running, you'll need to manage various aspects to maintain effective tracking.

### Understanding the Report Header

The report header provides essential information at a glance:

<figure><img src="/files/TkeNr482fODGQAQLVPd3" alt=""><figcaption><p>LLM Rank Tracker report header with key metrics</p></figcaption></figure>

1. **Report Title**: Shows your primary brand name
2. **Edit Button**: Quick access to modify tracker settings
3. **Key Metrics Bar**:

* Brand variants count with list on hover
* AI engines count with details on hover
* Search terms count (clickable)
* Snapshots count (clickable)
* Last updated timestamp with next run on hover

### Running the Tracker Manually

To run the tracker outside of its schedule:

1. **Click "Run Tracker"** button in the top-right
2. **Confirm in the modal** showing:

* Number of brand variants
* Total search terms
* AI engines to query

3. **Monitor progress** in the Log Panel
4. **Wait for completion** notification

<figure><img src="/files/I2YkSCxDwoSNlzox1PCT" alt=""><figcaption><p>Run tracker confirmation modal</p></figcaption></figure>

{% hint style="success" %}
**Important:** SEO Utils caches DataForSEO results and OpenAI extraction data, so you won't be charged twice for re-running the same queries.
{% endhint %}

### Managing Search Terms

Access search term management by clicking the **search terms count** in the header.

<figure><img src="/files/0P4HwKVVlHaWvyjkMq7F" alt=""><figcaption><p>Search terms management page</p></figcaption></figure>

#### Organizing with Tags

Tags help categorize search terms for better analysis:

**Creating Tags**:

1. Select search terms using checkboxes
2. Click "Update Tags" from bulk actions
3. Add relevant tags:

* By intent: "informational", "commercial", "comparison"
* By product: "rank-tracker", "serp-clustering"
* By competition: "vs-competitor", "alternative-searches"
* By priority: "high-priority", "monitoring"

<figure><img src="/files/BT5Y9xbnNFqcJgd4SEp1" alt=""><figcaption><p>Search terms organized with multiple tags</p></figcaption></figure>

### Managing Snapshots

Snapshots represent daily tracking data points. Access via the snapshots count in the header.

<figure><img src="/files/ClqBFdLEEI1YewaR42gn" alt=""><figcaption><p>Visit the snapshots management</p></figcaption></figure>

#### Understanding Snapshots

**Key Concepts**:

* One snapshot per day maximum
* Re-running on the same day updates existing snapshot
* Each snapshot contains all search term results
* Deleting a snapshot removes all associated data

#### Managing Snapshot Data

**Viewing Details**:

* Snapshots are listed newest first
* Use date sorting to find specific periods
* Search by date using the search box

**Deleting Snapshots**:

1. Click the three-dot menu on a snapshot
2. Select "Delete"
3. Confirm deletion (irreversible)

{% hint style="danger" %}
**Warning**: Deleting a snapshot permanently removes:

* All position data for that date
* Associated citations and sources
* Sentiment analysis results
* Competitor data for that date
  {% endhint %}

### Manage Responses

View the exact AI responses captured for each search term. To access the list of responses, click the "Response" menu item from the "3 dots" dropdown.

You can click on the search term to see:

* Full AI response content with formatting
* Referenced URLs and sources
* Extracted brand mentions with positions
* Copy buttons for easy export

<figure><img src="/files/NMzwJ3YvowBCKH6eBQ1x" alt=""><figcaption></figcaption></figure>

**Use Cases**:

* Verify how AI describes your brand
* Analyze competitor positioning
* Check citation sources
* Understand sentiment context

{% hint style="info" %}
**Tip**: Red search terms indicate no AI content was found for that query.
{% endhint %}

## Understanding the Report Tabs

The LLM Rank Tracker provides four comprehensive analysis tabs, each offering unique insights into your brand's AI visibility.

### Date Range Filter & Comparison Data

<figure><img src="/files/IHlbptiLZt8TegcQWG3I" alt="Date range filter" width="563"><figcaption><p>The global date range filter</p></figcaption></figure>

You can choose from preset date ranges like *Last 7 Days, Last 30 Days*, or set a *custom range*.

To enable comparison, switch to the **Compare** tab. There, you can select options like *Previous Period, Year Over Year, or set a Custom Comparison Range.*

The date range filter will apply to all the following tabs below:

### Overview Tab: Brand Performance Metrics

The Overview tab provides a high-level view of your brand's performance across AI platforms.

<figure><img src="/files/pOMSfFpar3zXqFMYS3mS" alt=""><figcaption><p>Overview tab showing key performance metrics</p></figcaption></figure>

#### Key Performance Indicators (KPIs)

**1. Visibility**

* **Definition**: How often your brand appears in AI responses
* **Calculation**: (Queries with brand mention / Total queries) × 100
* **Good benchmark**: 20-30% for branded searches, 5-10% for non-branded

**2. Top 3 Visibility**

* **Definition**: Percentage of queries where your brand ranks in the top 3 positions
* **Calculation**: (Queries where brand ranks 1-3 / Total queries) × 100
* **Indicates**: How prominently your brand appears when mentioned

**3. Average Position**

* **Definition**: The average position across all queries in the selected date range where your brand was mentioned
* **Range**: 1-10+ (lower numbers indicate better visibility)
* **Position 0**: Not mentioned in the response

**4. Latest Position**

* **Definition**: The average position from the snapshot closest to your selected end date
* **Purpose**: Shows your most recent performance within the date range
* **Use case**: Quickly assess current standing without changing date ranges

#### Secondary Metrics

Below the primary KPIs, you'll find three additional metrics that provide deeper insights:

**1. Sentiment Score**

* **Definition**: Average sentiment of your brand mentions (0-100 scale)
* **Calculation**: Converts sentiment from -1 to +1 range to 0-100 scale
* **Range**: 0 (very negative) to 100 (very positive)
* **Good benchmark**: 70+ indicates positive brand perception

**2. Total Citations**

* **Definition**: Number of cited sources that mention your brand
* **What it measures**: How many URLs/sources referenced by AI contain mentions of your brand
* **Calculation**: Count of citations where your brand appears in the cited content
* **Importance**: More citations = stronger brand presence in AI's source material

**3. Detection Rate**

* **Definition**: Percentage of search terms where your brand appears
* **Calculation**: (Search terms with brand mentions / Total search terms) × 100
* **What it shows**: How many of your tracked queries mention your brand
* **Good benchmark**: Higher percentage = better brand coverage

#### Performance Chart

The line chart visualizes your selected metrics over time, comparing your brand against top competitors.

<figure><img src="/files/0vau2HJIZLuTBDwggKGA" alt=""><figcaption><p>Performance chart with metric selector</p></figcaption></figure>

**Metric Selection**: Use the dropdown to switch between different KPIs and metrics:

* Visibility Score (default)
* Average Position
* Top 3 Visibility
* Sentiment Score
* Citations Count
* Detection Rate

**Chart Features**:

* **Blue line**: Your brand's performance
* **Colored lines**: Top 10 competitors. The chart automatically selects the top 10 competitors based on your chosen metric. This means you're always comparing against the most relevant competition for each specific measurement.

{% hint style="info" %}
**Note**: For Average Position, trends are inverted—a downward movement is positive since lower positions are better.
{% endhint %}

#### Search Terms Performance Table

The table shows how your brand performs for each tracked search term:

<figure><img src="/files/leCzh5CZ5gNAz6EKhgUS" alt=""><figcaption><p>Search terms table with performance metrics</p></figcaption></figure>

**Key Metrics**:

* **Avg. Position**: Average ranking across all AI engines (lower is better)
* **Visibility**: Percentage of AI engines mentioning your brand
* **Sentiment**: Tone of mentions (0-100 scale)
* **Citations**: Number of sources referencing your brand
* **Individual AI Engines**: Position in each platform

**Using the Table**:

* Sort by any column to find opportunities
* Filter by position range to focus on specific rankings
* Search for specific terms or groups
* Compare periods to track progress

**Competitor Filter**: The table includes a Competitor filter that allows you to view performance data for specific competitors instead of just your brand:

* By default, the table shows data for your brand
* Select any competitor from the dropdown to see their performance metrics
* This helps you benchmark competitor visibility and identify gaps in their coverage

{% hint style="info" %}
**Competitor Analysis**: Use the competitor filter to analyze which search terms your competitors rank well for, their average positions, and sentiment scores. This intelligence helps you identify opportunities where competitors are weak or absent.
{% endhint %}

{% hint style="success" %}
**Quick Tip**: Focus on terms with positions 4-6—these are easiest to improve to top 3.
{% endhint %}

### Competitors Tab: Competitive Intelligence

The Competitors tab reveals who else appears in AI responses for your tracked queries.

#### Competition Map (Scatter Plot)

<figure><img src="/files/Vj7g3P6ucqY0CcDDfhCz" alt=""><figcaption><p>Competition Map showing brand and competitor positioning</p></figcaption></figure>

**What does it show?**

* The **x-axis** represents the **Detection Rate (%)** - how consistently a brand appears across all tracked search terms.
* The **y-axis** represents the **Average Position** of a brand across all its mentions.
* The **size of each bubble** represents the overall **visibility** of the brand. A larger bubble indicates higher visibility.
* The **color** represents different brands for easy differentiation.

**How to read it?**

* **Bottom-right corner (low average position & high detection rate)** → This means a brand appears consistently and ranks well (closer to position #1).
* **Top-left corner (high average position & low detection rate)** → This means a brand appears sporadically and ranks poorly.
* **Large bubbles** → These indicate brands with strong visibility across many queries.
* **Small bubbles** → These brands have lower presence in AI responses.

{% hint style="success" %}
**Key benefits of the scatter plot**

* **Identify market leaders** → Look for large bubbles in the bottom-right corner.
* **Spot opportunities** → Find areas with few competitors or weak positioning.
* **Track competitive movement** → Monitor how positions shift over time.
  {% endhint %}

{% hint style="info" %}
**Tips:**

* **Minimap Toggle**: Enables zooming and panning for detailed analysis.
* **Hovering Over a Bubble**: Displays detailed metrics including visibility score, total mentions, and trends.
  {% endhint %}

#### Competitors Performance Table

Detailed metrics for each competitor:

**Key Metrics Explained**:

1. **Visibility %**:

* How often they appear vs. total queries
* Higher percentage = stronger AI presence
* Compare to your own visibility

2. **Total Mentions**:

* Raw count of appearances
* Indicates content volume recognized by AI

3. **Average Position**:

* Their typical ranking when mentioned
* Lower numbers = more prominent placement

4. **Detection Rate**:

* Consistency of appearances over time
* 100% = mentioned every day tracked
* Lower % = sporadic mentions

5. **Top 3 Rate**:

* Percentage of mentions in positions 1-3
* Indicates prominence in AI responses

<figure><img src="/files/nbAIDHDq8HvGQOOy5k8s" alt=""><figcaption><p>Competitors table with sortable columns</p></figcaption></figure>

**Competitive Analysis Strategies**:

1. **Identify Direct Threats**:

* High visibility + good positions
* Consistent detection rates
* Growing trend lines

2. **Find Opportunities**:

* Competitors with declining metrics
* Gaps where no one dominates
* Queries with weak competition

3. **Learn from Leaders**:

* Study their content strategy
* Analyze their cited sources
* Understand their positioning

{% hint style="info" %}
**Competitor Discovery**: The system automatically identifies competitors from AI responses. You don't need to manually add them—anyone mentioned alongside your search terms appears here.
{% endhint %}

### Citations Tab: Source Authority Analysis

The Citations tab reveals which sources AI engines reference when responding to your tracked queries, helping you understand the authority landscape in your industry.

<figure><img src="/files/41nhRLUbxbdrQNZsIBOL" alt=""><figcaption><p>Citations tab showing comprehensive source analysis</p></figcaption></figure>

#### Citation Metrics Overview

At the top of the tab, five key metrics provide a snapshot of citation patterns:

**Key Metrics**:

1. **Total Citations**: Total number of links found across all AI responses for your tracked search terms
2. **Unique URLs**: Number of distinct URLs cited across all domains (not limited to your website)
3. **Unique Domains**: Number of distinct domains that received citations in AI responses
4. **Brands Found**: Number of distinct brand names detected in the citations (including yours and competitors)
5. **Most Appearances**: The highest number of times any single URL was cited

{% hint style="info" %}
**Understanding Citation Metrics**: These metrics help you gauge the diversity and concentration of sources AI engines trust. A high "Most Appearances" number indicates certain pages are heavily favored by AI.
{% endhint %}

#### Citation Analysis Charts

Two visualization charts help you understand citation patterns:

1. **Top 20 Citations by Domain**: Bar chart showing which domains are cited most frequently
2. **Daily Mentions by Top Domains**: Line chart tracking citation trends over time for the most cited domains

#### URL Overview Tab

The URL Overview provides a detailed list of all cited URLs with rich context:

<figure><img src="/files/bBPeB0OZpudXFtss9P3C" alt=""><figcaption><p>URL Overview showing individual citations</p></figcaption></figure>

**Table Information**:

* **Citation URL**: The specific page cited (with title when available)
* **Search Term**: Which query triggered this citation
* **Mentioned Brands**: Brands associated with this citation (your brand highlighted)
* **AI Engine**: Which AI platform cited this URL
* **Found On**: When the citation was first discovered

**Filtering Options**:

* Filter by AI Engine
* Filter by Mentioned Brands
* Search across URLs and search terms

#### Domain Overview Tab

The Domain Overview aggregates citations by domain, showing the bigger picture:

<figure><img src="/files/5o3K5ptphUHgGF5LF9z6" alt=""><figcaption><p>Domain Overview with expandable details</p></figcaption></figure>

**Table Information**:

* **Domain**: Website domain with citation bar visualization
* **URLs**: Number of unique pages cited from this domain (click to expand)
* **Citations**: Total citation count with percentage share

**Expandable Details**: Click the URL count to see:

* All specific pages cited from that domain
* Citation count per page
* AI engines that cited each page
* Associated brands per citation

#### Strategic Insights from Citations

**Why Citations Matter**:

1. **Authority Signals**: Frequently cited sources are considered authoritative by AI
2. **Content Opportunities**: Identify which types of content get cited
3. **Partnership Targets**: Find websites for potential collaborations
4. **Competitive Intelligence**: See where competitors get their authority

**Action Items Based on Citation Data**:

1. **Create Content on Cited Domains**: If certain domains dominate citations, consider guest posting or partnerships
2. **Analyze Cited Content**: Study what makes content "citation-worthy"
3. **Build Relationships**: Connect with editors and authors of frequently cited sources
4. **Fill Citation Gaps**: Create authoritative content where citations are lacking

{% hint style="success" %}
**Citation Strategy**: Focus on domains that appear in both the "Top Citations" chart and have high brand association. These represent the most valuable opportunities for building your AI visibility through strategic content placement.
{% endhint %}

### Sentiment Tab: Brand Perception Analysis

The Sentiment tab analyzes how AI platforms perceive and present brands in their responses, tracking sentiment scores over time and across different queries.

<figure><img src="/files/NOSerQujLGwxBTaBJgL6" alt=""><figcaption><p>Sentiment analysis tab</p></figcaption></figure>

#### Sentiment Over Time by Brand

The line chart visualizes sentiment trends for each brand across the selected date range:

**Chart Features**:

* **Multiple brand lines**: Each brand gets its own colored line
* **Sentiment scale**: 0-100 (normalized from -1 to +1 scale)
* **Interactive tooltips**: Hover to see exact sentiment scores

**Understanding Sentiment Scores**:

* **80-100**: Very positive sentiment
* **60-80**: Positive sentiment
* **40-60**: Neutral sentiment
* **20-40**: Negative sentiment
* **0-20**: Very negative sentiment

#### Sentiment Analysis by Brand Table

Below the chart, a comprehensive table breaks down sentiment metrics for each brand:

**Table Columns**:

1. **Brand**: Brand name with building icon for your brand
2. **Source**: AI engine that provided the sentiment data
3. **Sentiment**: Overall sentiment score with emoji indicator

* 😊 Positive (60%+)
* 😐 Neutral (40-60%)
* 😟 Negative (<40%)

4. **Positive/Neutral/Negative**: Count of mentions by sentiment type
5. **Mentions**: Total number of brand mentions

**Expandable Keyword Analysis**: Click the brand to reveal detailed keyword-level sentiment:

<figure><img src="/files/9ZmuxkRJRvqc9YQwVc0L" alt=""><figcaption><p>Expanded view showing sentiment by individual keywords</p></figcaption></figure>

The expanded view shows:

* **Search Term**: The specific query
* **Sentiment Score**: Score for that keyword-brand combination
* **Response Context**: Actual text where the brand was mentioned
* **AI Engine**: Which platform generated this response

This granular view helps you:

* Identify which queries generate positive/negative sentiment
* Read exact AI responses about your brand
* Spot opportunities to improve brand perception
* Compare sentiment across different AI engines

#### How Sentiment Analysis Works

**Text Analysis Process**:

1. **Text Extraction**: When a brand is mentioned in an AI response, the system extracts the specific text segment containing the brand mention
2. **Google NLP Processing**: The extracted text is sent to Google's Natural Language API for sentiment analysis
3. **Sentiment Scoring**: Google NLP returns a sentiment score ranging from -1 (very negative) to +1 (very positive)
4. **Score Normalization**: The system converts this to a 0-100 scale for easier interpretation

**What Text is Analyzed**:

* The actual text snippet where your brand is mentioned in the AI response
* Context around the brand mention is included for accurate sentiment detection
* Each brand mention is analyzed separately if multiple mentions exist

**Supported Languages for Sentiment**: Sentiment analysis is currently available for:

* English (en)
* Spanish (es)
* French (fr)
* German (de)
* Italian (it)
* Portuguese (pt)
* Japanese (ja)
* Korean (ko)
* Chinese (zh, zh-CN, zh-TW)
* Russian (ru)

{% hint style="info" %}
**Note**: If Google NLP API Key is not configured or if the content is in an unsupported language, sentiment scores will show as N/A and sentiment analysis will be skipped.
{% endhint %}

#### Strategic Insights from Sentiment Analysis

**Sentiment Monitoring Benefits**:

1. **Brand Health Tracking**: Monitor overall brand perception in AI responses
2. **Competitive Benchmarking**: Compare your sentiment against competitors
3. **Issue Detection**: Quickly spot queries generating negative sentiment
4. **Content Strategy**: Focus on improving content for problematic queries

**Action Items Based on Sentiment**:

1. **For Negative Sentiment**:

* Review the specific queries and responses
* Update content to address concerns
* Create positive content around those topics
* Monitor improvements over time

2. **For Neutral Sentiment**:

* Add more compelling value propositions
* Include customer success stories
* Highlight unique benefits

3. **For Positive Sentiment**:

* Amplify successful messaging
* Use similar tone in other content
* Leverage positive AI responses in marketing

{% hint style="warning" %}
**Sentiment Alert**: Pay special attention to queries where your brand has significantly lower sentiment than competitors. These represent immediate opportunities for improvement through better content and messaging.
{% endhint %}

{% hint style="info" %}
**Note**: Sentiment analysis is currently available for AI engines that provide detailed responses. As we add more AI platforms, sentiment tracking will expand accordingly.
{% endhint %}

## Practical Use Cases and Strategies

### Use Case 1: Brand Launch and Awareness Tracking

**Scenario**: You're launching a new brand or product and need to establish AI visibility from zero.

**Strategy**:

1. **Baseline Setup**: Initial search terms:

* What is \[brand name]
* \[Brand] reviews
* \[Brand] vs alternatives
* \[Product category] solutions
* Best \[product type] for \[use case]

2. **Track with these metrics**:

* **Detection Rate**: Start at 0%, aim for 20%+ in 3 months
* **Visibility Score**: Monitor weekly growth
* **Sentiment**: Ensure positive from the start

3. **Optimization Actions**:

* Create comprehensive "About" content
* Publish on domains with high citation rates
* Build comparison pages vs. established brands
* Monitor which content gets cited first

**Success Metrics**:

* Week 1-4: First mentions appear
* Month 2: 10%+ detection rate
* Month 3: Consistent citations from authority domains

### Use Case 2: Competitive Displacement Strategy

**Scenario**: A competitor dominates AI responses in your category.

**Strategy**:

1. **Analysis Phase** (Use Competition Map):

* Identify their detection rate and average position
* Export their top-cited URLs from Citations tab
* Study their sentiment scores by keyword

2. **Target Their Weaknesses**:

* Find keywords where they have low/negative sentiment
* Identify gaps in their citation coverage
* Look for outdated information in their cited content

3. **Content Creation Plan**:

* Create superior content on their top-cited domains
* Target keywords where they rank 4-6 (easier to displace)
* Build relationships with sites that cite them

4. **Track Progress**:

* Monitor position changes in head-to-head queries
* Track citation share shifts
* Compare sentiment scores weekly

### Use Case 3: Reputation Crisis Management

**Scenario**: Negative sentiment appears in AI responses about your brand.

**Immediate Response**:

1. **Identify Scope** (Sentiment Tab):

* Filter by negative sentiment (<40%)
* Expand keywords to see exact responses
* Check which AI engines show negative content

2. **Source Analysis** (Citations Tab):

* Find which URLs drive negative mentions
* Identify if it's from news, reviews, or forums
* Check citation frequency of negative sources

3. **Response Strategy**:

* Create authoritative response content
* Update cited pages if you control them
* Publish on high-authority domains
* Monitor daily until sentiment improves

**Tracking Recovery**:

* Daily sentiment monitoring
* Citation source changes
* Position improvements for affected queries

### Use Case 4: Product Feature Optimization

**Scenario**: Determine which features to highlight based on AI visibility.

**Strategy**:

1. **Feature-Specific Tracking**: Search terms by feature:

* \[Brand] \[feature] review
* How does \[brand] \[feature] work
* \[Brand] \[feature] vs \[competitor]
* Best \[product] with \[feature]

2. **Analyze Performance** (Overview Tab):

* Which features get mentioned most?
* Which have highest positions?
* Which generate positive sentiment?

3. **Citation Analysis**:

* Which features get cited from authority sites?
* Are technical specs or benefits cited more?

4. **Optimization**:

* Double down on well-performing features
* Improve content for underperforming features
* Create comparison content for strong features

### Use Case 5: Multi-Location Brand Management

**Scenario**: Managing brand visibility across different geographic markets.

**Setup**:

1. **Create Location-Specific Trackers**:

* One tracker per major market
* Use appropriate geo-targeting
* Include localized search terms

2. **Location-Specific Queries**:

* Best \[product] in \[city]
* \[Brand] \[location] reviews
* \[Service] near me (with geo-target)
* \[Brand] vs local competitors

3. **Comparative Analysis**:

* Compare visibility scores across locations
* Identify market-specific competitors
* Track sentiment variations by region

4. **Localization Strategy**:

* Create location-specific content
* Build local citations
* Address regional concerns

## Best Practices and Optimization Tips

### Setting Up Effective Tracking

#### 1. Search Term Strategy

**The 70-20-10 Rule**:

* **70% Core Terms**: Direct brand and product searches
* **20% Competitive**: Comparison and alternative queries
* **10% Exploratory**: Broad industry and problem-solving queries

**Search Term Templates**: Brand Searches:

* \[brand] review
* is \[brand] worth it
* \[brand] pricing
* \[brand] customer service

Comparison Searches:

* \[brand] vs \[competitor]
* \[brand] alternatives
* better than \[brand]
* \[brand] or \[competitor]

Problem Searches:

* how to \[solve problem]
* best way to \[achieve goal]
* \[industry] tools for \[use case]
* \[problem] solution

#### 2. Metric-Driven Optimization

**Weekly Review Checklist**:

* [ ] Check Performance Chart for all key metrics
* [ ] Review new competitors in Competition Map
* [ ] Analyze new citations in Citations Tab
* [ ] Monitor sentiment changes
* [ ] Export data for team reports

**Monthly Analysis**:

1. **Visibility Trends**:

* Compare month-over-month visibility scores
* Identify fastest-growing competitors
* Track market share changes

2. **Citation Patterns**:

* New domains citing content
* Changes in citation concentration
* Opportunities for guest content

3. **Sentiment Shifts**:

* Overall brand perception trends
* Keyword-specific sentiment changes
* Competitive sentiment comparison

### Advanced Optimization Techniques

#### 1. Citation Optimization Strategy

**Build Citation Authority**:

1. **Analyze Top Cited Domains** (Citations Tab):

* Sort by citation count
* Identify accessible platforms
* Study cited content types

2. **Content Placement Priority**:

* **Tier 1**: Domains with 50+ citations
* **Tier 2**: Domains with 20-49 citations
* **Tier 3**: Emerging domains with growth

3. **Citation-Worthy Content**:

* Comprehensive guides with clear sections
* Data-driven research and statistics
* Comparison tables and matrices
* Step-by-step tutorials
* Expert quotes and insights

#### 2. Position Improvement Tactics

**For Positions 4-6** (Quick Wins):

1. Identify these positions in Overview Tab
2. Check current citations for these queries
3. Create content on higher-authority domains
4. Add structured data markup
5. Update existing content with fresh data

**For No Visibility** (Position 0):

1. Analyze competitors who rank
2. Check their citation sources
3. Create foundational content
4. Build topic authority gradually
5. Target long-tail variations first

#### 3. Sentiment Optimization

**Improving Negative Sentiment**:

1. **Identify Root Causes**:

* Expand keywords in Sentiment Tab
* Read actual AI responses
* Find common negative themes

2. **Content Response Strategy**:

* Address concerns directly
* Provide updated information
* Share positive customer stories
* Create FAQ content

3. **Monitor Progress**:

* Daily sentiment tracking
* A/B test messaging approaches
* Track which content improves sentiment

#### 4. Competitive Intelligence Framework

**Weekly Competitive Analysis**:

1. **Competition Map Review**:

* Screenshot weekly positions
* Track movement patterns
* Identify rising competitors

2. **Citation Competitive Analysis**:

* Compare domain overlap
* Find exclusive citation sources
* Track citation velocity

3. **Sentiment Benchmarking**:

* Compare sentiment by keyword
* Identify perception gaps
* Find differentiation opportunities

### ROI Measurement and Reporting

#### Executive Dashboard Metrics

**Primary KPIs**:

1. **Visibility Score**: Overall brand presence
2. **Share of Voice**: Your visibility vs. total market
3. **Sentiment Index**: Average sentiment across queries
4. **Citation Authority**: Unique domains citing you

**Calculated Metrics**: Share of Voice = (Your Mentions / Total Market Mentions) × 100 Citation Quality Score = (Citations from Top 20 Domains / Total Citations) × 100 Sentiment Advantage = Your Avg Sentiment - Competitor Avg Sentiment

#### Reporting Best Practices

**Weekly Reports Should Include**:

* Visibility score with week-over-week change
* Top 5 position improvements
* New citations acquired
* Sentiment alerts (if <40%)

**Monthly Reports Should Include**:

* Comprehensive competitor analysis
* Citation growth trends
* Sentiment analysis by category
* Strategic recommendations

{% hint style="success" %}
**Pro Tip**: Create automated alerts for:

* Visibility drops >10%
* New competitors with >20% detection rate
* Sentiment scores below 40%
* Loss of citations from top domains
  {% endhint %}

### Common Pitfalls to Avoid

1. **Over-Optimizing for Current AI Behavior**:

* AI algorithms evolve rapidly
* Focus on quality content, not tricks
* Build genuine authority

2. **Ignoring Competitor Innovations**:

* Weekly Competition Map reviews are essential
* New entrants can disrupt quickly
* Learn from competitor successes

3. **Neglecting Citation Diversity**:

* Don't rely on single domains
* Build broad citation portfolio
* Maintain content freshness

4. **Reactive vs. Proactive Approach**:

* Don't wait for problems
* Anticipate market changes
* Test new content formats

{% hint style="info" %}
**Remember**: AI visibility is dynamic. What works today may change tomorrow. Focus on building genuine authority, creating helpful content, and maintaining strong sentiment across all touchpoints.
{% endhint %}


# How to Use Proxies

While proxies aren't necessary for SEO Utils, using them is recommended if you want to speed up scraping for "People Also Ask" (PAA), check if URLs are indexed, or avoid having your IP blocked by Google.

### Recommended Proxy Providers

#### Proxy Rack

* Website: <https://www.proxyrack.com/>
* Proxy plans that work for Google scraping tasks:
  * Premium Residential Proxies
  * Private Unmetered Residential Proxies

(More coming soon...)

### Renting Proxies

Residential proxies can be expensive, typically costing between $60 to $150 per month. To offer a more affordable solution, I've decided to launch a proxy rental service. Details will be released next month.

### How to Connect Proxies in SEO Utils

To use proxies in SEO Utils for tasks like scraping Google's "People Also Ask" or checking if URLs are indexed, go to the App dropdown in the top right corner of the app and select the "Proxies" menu item.

<figure><img src="/files/L2bGCOB3Wf2eMqf8vbqy" alt="" width="375"><figcaption><p>Proxies menu</p></figcaption></figure>

Then, click the "**Add Proxy**" button and fill all the required fields.

<figure><img src="/files/Z9RJmoMYokI4sp5hclcu" alt="" width="375"><figcaption><p>Fill all the fields to add a proxy</p></figcaption></figure>

After you add a proxy, SEO Utils will automatically use it for tasks that require proxies.


# Bulk Check Mentions

Updating...


# Bulk SEO Metadata Optimizer

The **Bulk SEO Metadata Optimizer** in SEO Utils allows you to optimize **titles, meta descriptions, and H1 headings** across multiple pages using AI. This tool is perfect for SEOs looking to save time while enhancing metadata for better search engine visibility and click-through rates.

<figure><img src="/files/MpLNcuHC61Shi78ywmfu" alt=""><figcaption><p>Bulk SEO Metadata Optimizer tool</p></figcaption></figure>

### Start Your First Run with the Bulk SEO Metadata Optimizer

To get started, open SEO Utils. On the left-hand sidebar, navigate to the **Utilities** section and click on **Bulk Metadata Optimizer**. This will open the dashboard where you can manage your previous reports or create a new one.

<figure><img src="/files/cE4KthmnFyNZRS3gQWOm" alt="" width="375"><figcaption><p>The tool is under Ultiltes menu</p></figcaption></figure>

To create a new optimization report, click the **Run** button located at the top-right corner of the screen. This will open the **Run Form**, where you can configure your optimization settings.

<figure><img src="/files/GgxayfKZ2oW1EWWFFNNj" alt=""><figcaption><p>Click the "Run" button to start a new run.</p></figcaption></figure>

#### **Add URLs for Optimization**

In the **Run Form**, you’ll see a text box labeled **Enter URLs (one per line)**. Here, you can paste the list of pages you want to optimize. Each URL must be on a separate line.

If you want to optimize all pages under a specific path, you can use the **wildcard (\*)** character. For example:

* Entering `https://example.com/blog/*` will scrape and optimize all pages under the `/blog/` path.
* Entering `https://example.com/category/content/*` will target every page under `/category/content/`.
* If you enter a specific page like `https://example.com/page-1`, only that exact page will be optimized.

<figure><img src="/files/vjSXDyhiwhkBqdL8OGMX" alt=""><figcaption><p>Use wilcard (*) to quickly import URLs</p></figcaption></figure>

{% hint style="info" %}
The wildcard feature is extremely useful for bulk optimization, saving you the hassle of manually adding every single URL.
{% endhint %}

{% hint style="warning" %}
You must **install Google Chrome** on your computer to use the wildcard feature.
{% endhint %}

#### **Choose the AI Model**

The next step is to select the AI model that will generate the optimized metadata. SEO Utils supports multiple AI providers, so you can choose the one that best suits your needs.

* **OpenAI:** You can choose models like GPT-4o, GPT-4o Mini, and more. Get an API key at <https://platform.openai.com/settings/organization/api-keys>
* **Anthropic**: You can use Claude models like Claude 3.5 Sonnet or Claude 3 Ocpus by getting your API key at <https://console.anthropic.com/dashboard>
* **OpenRouter**: This platform gives you access to around 281 different AI models, providing plenty of options. Register an account at <https://openrouter.ai/>

{% hint style="info" %}
You can access the list of models from OpenRouter at <https://openrouter.ai/models>
{% endhint %}

Once you have the API keys, go to the Services settings to enter them. You don’t need to enter all the keys—just input the one for the provider you want to use.

<figure><img src="/files/ARjVIop33DTCwKIkFsaC" alt=""><figcaption><p>Enter LLM Provider API keys</p></figcaption></figure>

* **Local Models via Ollama**: If you prefer not to rely on **cloud APIs**, you can use local models like *Mistral* for **FREE**. To set up Ollama:
  1. Download and install Ollama from <https://ollama.com>.
  2. Open the **Terminal** app on your computer and run the command `ollama pull mistral` to download the model. Ensure your PC meets the requirements specified for the model. For example, Mistral requires at least 16GB of RAM.

<figure><img src="/files/bU7Qf8L4vZd7jomqYpvP" alt=""><figcaption><p>Run the command from your Terminal app to download Ollama models.</p></figcaption></figure>

{% hint style="info" %}
You don’t need an API key to use local models from Ollma. Just keep the Ollama app open, and SEO Utils will find and display all the downloaded models in the dropdown.
{% endhint %}

{% hint style="success" %}
Using local models is cost-effective, but keep in mind they require strong hardware to run efficiently. You can access the list of models at <https://ollama.com/search>
{% endhint %}

#### **Customize Advanced Settings**

Below the AI model selection, there is an option to **Toggle Advanced Settings**. Clicking this will reveal additional customization options to fine-tune the optimization process.

<figure><img src="/files/KmMTkPYlSOjMOL3VyXgx" alt=""><figcaption><p>Advance settings</p></figcaption></figure>

In the **Instruction** field, you can provide a clear instruction for the AI to follow. For example, you might write:

> "You are an SEO expert tasked with improving metadata. Write engaging meta titles, descriptions, and headings that include target keywords and improve click-through rates."

The **Prompt** field is where you can provide SEO metadata that you want to improve using placeholders.

Placeholders are special tags that SEO Utils will automatically replace with the actual content when scraping data from each URL. Here is a breakdown of available placeholders:

* `[title]`: This will be replaced with the page title scraped from the URL.
* `[meta_description]`: This will be replaced with the meta description found on the page.
* `[heading_1]`: This will be replaced with the main H1 heading of the page.
* `[content:50]`: This will include the first 50 words of the page content, and you can edit the number to include any amount of words you prefer, such as 100 or 200 words.

For example, you can define the prompt as follows:

```
Title: [title]
Meta Description: [meta_description]
Heading 1: [heading_1]
Content Preview: [content:50]
```

With this setup, SEO Utils will scrape the page content for each URL, replace the placeholders with the corresponding values, and send them to the AI for optimization.

{% hint style="success" %}
Keep the **Instruction** and **Prompt** fields empty if you want to use the default value that SEO Utils provides.
{% endhint %}

#### **Start the Optimization**

Once you’ve entered your URLs, selected the AI model, and customized the advanced settings, you’re ready to start the optimization process. Click the **Optimize SEO Metadata** button at the bottom of the form.

SEO Utils will process all the URLs and send the scraped data to the selected AI model. Depending on the number of URLs and the model chosen, the optimization may take a few moments to complete.

After the optimization is complete, you will be redirected to the **Report Detail Page** where you can review the results.

### Review the Results

The Report Detail Page provides a clear view of the optimized metadata generated for each URL. For every URL, you can see the **original version** alongside the **improved version** generated by the AI.

<figure><img src="/files/ZlBdNGvHAupO9cmygHAD" alt=""><figcaption><p>Preview changes of each URL</p></figcaption></figure>

Changes are highlighted for easy comparison:

* **Green**: New content that has been added.
* **Red**: Content that has been removed.

If you want to make manual adjustments to any metadata, simply click the **pencil icon** beside the corresponding field. This will allow you to edit the title, meta description, or H1 heading directly.

To modify additional aspects of the optimization, switch to the **Main Content** tab. Here, you can edit the extracted content from the page. If you need to adjust the AI instructions or prompt message for a specific URL, switch to the **Messages** tab. This lets you refine the instructions or prompt to better suit your needs, and placeholders can still be used here for consistency.

<figure><img src="/files/QSJTDpq9ZV4KM26o26l5" alt=""><figcaption><p>Edit data if needed</p></figcaption></figure>

After making changes, you can re-optimize the URL by selecting it and clicking the **Re-optimize** button.

{% hint style="info" %}
**Tip:** You can make small edits to the **Improved version** before [publishing changes](#publish-changes-to-your-website) by clicking the pencil icon next to it.
{% endhint %}

### Publish Changes to Your Website

SEO Utils makes it easy to publish the optimized metadata directly to your website through **Site Integrations**.

{% hint style="info" %}
SEO Utils currently support integration with WordPress. More integrations, such as Shopify, Webflow, and custom platforms, will be added gradually soon.
{% endhint %}

To connect your website:

1. Go to the **Settings** section in the sidebar and select **Site Integrations**.
2. Click **Add Integration** and enter the following details:
   * **Site URL**: The URL of your WordPress site.
   * **Platform**: Select WordPress.
   * **Username** and **App Password**: These can be generated in WordPress.

<figure><img src="/files/6tu3tcPchfX7X3TVYoXp" alt="" width="563"><figcaption><p>Access Site Integrations</p></figcaption></figure>

To generate an App Password in WordPress:

1. Go to your WordPress dashboard.
2. Navigate to **Users > Profile**.
3. Edit a user who has permission to edit posts or pages. If you're unsure, just choose the admin user.
4. Scroll down to the **Application Passwords** section.
5. Generate a new password and copy it.
6. Paste the application password & username into the SEO Utils integration form.

<figure><img src="/files/JvFOnfbCRFTavRkM43aP" alt=""><figcaption><p>Make sure you copy the correct username.</p></figcaption></figure>

<figure><img src="/files/ZLAFuUVdzb1Btuwkp0aB" alt=""><figcaption><p>Create an app password</p></figcaption></figure>

{% hint style="info" %}
SEO Utils will use this application password to change metadata on your website using the SEO Utils WordPress plugin (please install it below).

This application password is **NOT the same as the password** you use to log into your WordPress dashboard, and you can revoke it anytime you need.
{% endhint %}

**Install SEO Utils WordPress plugin**

This plugin will provide a REST API endpoint that lets the SEO Utils app send a request to your website to update metadata.

Please [download it](https://larseov2.s3.us-east-1.amazonaws.com/seo-utils/site-integrations/seo-utils.zip) and install it as a normal WordPress plugin.

**Note**: To update metadata, ensure you have one of the following SEO plugins installed on your WordPress site:

* Yoast SEO
* Rank Math
* All-in-One SEO Pack
* SEOPress
* Slim SEO
* Squirrly SEO

If these plugins are not installed, only the H1 heading can be updated, as it is part of the WordPress core content.

After connecting your site, return to the [**Report Detail Page**](#review-the-results). Click the pencil icon, and you will see a dropdown to select your connected site.

<figure><img src="/files/MVyBK3Js5xYYBee33Xjt" alt=""><figcaption><p>Edit the report to select the added site integration from the previous step.</p></figcaption></figure>

Once the site is selected, a **Publish** button will appear.

<figure><img src="/files/m3YlJYakmvEYUMpFoss9" alt=""><figcaption><p>The "Publish" button appears after connecting to your site.</p></figcaption></figure>

You can publish the following fields:

* Meta Title
* Meta Description
* H1 Heading

{% hint style="danger" %}
Before publishing, always back up your data to avoid any unintended changes.
{% endhint %}

### Bulk Actions

You can select multiple URLs and bulk publish or re-optimize them at once.

<figure><img src="/files/6hvijy64NFuLS7ByPNQt" alt=""><figcaption><p>Bulk Publish URLs</p></figcaption></figure>

{% hint style="info" %}
While the bulk action is running, you can view the log in the Log Panel at the bottom of the page.
{% endhint %}

### Export the Report

If you need to save the results for further analysis or reporting, SEO Utils allows you to export the optimized metadata. On the [Report Detail Page](#review-the-results), click the **Export** button at the top-right corner.


# How to Save Costs when Using DataForSEO

To save costs while using DataForSEO data on SEO Utils, consider implementing the following strategies:

### 1. Reusing Past Searches with Recent Searches & Local Cache

Every DataForSEO search you run is stored locally in your SQLite database. Under each tool's search bar, a **Recent searches** list lets you re-open past searches in one click — no API credits spent if the data is still cached. A small freshness widget in the bottom-right corner shows how old the data is and has a Refresh button for when you need the latest.

<mark style="color:green;">Read the instructions at:</mark> [Recent Searches & Cache](/guide/recent-searches-and-cache)

### 2. Using S3 Cache to Share Data

SEO Utils can cache DataForSEO API responses using S3-compatible storage (AWS S3, Cloudflare R2, DigitalOcean Spaces, MinIO), and the data is cached for up to 7 days. Your teammates can access the same data without paying any extra fees.

<mark style="color:green;">Read the instructions at:</mark> [S3 Cache for DataForSEO Data](/guide/data-sharing-with-s3)

### 3. Using Default Filters

Since [v1.13.0](https://help.seoutils.app/guide/pages/FYHJNu9cAi74Qc90ALo7#v1.13.0), you will be able to set default filters for each request to DataForSEO. SEO Utils will apply those filters on the initial load, helping you save costs by avoiding pulling unneeded data.

For example, I often look for keywords that get searched at least **800 times per month**, have a **Keyword Difficulty of no more than 25**, and are used for **informational purposes**. I can set the default filters as shown in the following image.

Every time I visit the **Organic Keywords** page, the same filters will be applied during the initial loading.

<figure><img src="/files/3pheCeKWmBEvvn30RNkr" alt=""><figcaption><p>Set default filters for the tool that pulls DataForSEO data to save costs.</p></figcaption></figure>


# Manage SERP Data

This tool allows you to seamlessly transfer SERP data from one device to another

<figure><img src="/files/MVGJk41gUTyCvx9J5ubc" alt=""><figcaption><p>SERP Data</p></figcaption></figure>

### SERP Data Exporter / Importer

You can export your SERP data from one computer and easily import it onto another, making it convenient to work across multiple devices. This helps reduce costs for [SERP Clustering](/guide/serp-clustering), [N.A.P Finder](/guide/n.a.p-finder), and [Organic Rank Tracker](/guide/organic-rank-tracker).

Additionally, SEO Utils supports importing external SERP data, making it an ideal solution when migrating your SERP data from other tools.

In the screenshot below, I uploaded over **18,000 keywords** to the SERP Clustering tool and used SERP data from the past 7 days. The cost came to just **$0.0390**, saving me **$11.2470**! SEO Utils only sent **65 keywords** to the SERP API for new data, as most of the keywords already had recent SERP data within 7 days.

<figure><img src="/files/AVZTBwZv79UoSvLGP9y3" alt=""><figcaption><p>Save money when using old SERP data.</p></figcaption></figure>

### Delete Old SERP Data

By default, SEO Utils stores all your SERP data in a database indefinitely. However, as your database grows over years of running SERP Clustering, you may notice slower performance.

To address this, you can view your SERP database size and set a data retention period. Any SERP data older than this period will be automatically deleted at startup, helping the app run reports—like SERP Clustering and Organic Rank Tracker—more efficiently.

<figure><img src="/files/YUT04rGYzL6OLT97qZUb" alt=""><figcaption><p>SERP Database Manager</p></figcaption></figure>

In the example above, I've set the retention period to **90 days (3 months)**, so SEO Utils will only keep SERP data from the past 90 days on my computer. You can adjust this to any timeframe you like, such as 365 days for one year, or set it to 0 to store data indefinitely.

### DataForSEO SERP Data Getter

{% hint style="info" %}
Available since v1.38.3
{% endhint %}

This feature allows you to directly import SERP data from DataForSEO by entering task IDs. This is useful when you have existing DataForSEO tasks and want to save their SERP data to your local database for use in [SERP Clustering](/guide/serp-clustering), [Organic Rank Tracker](/guide/organic-rank-tracker), and other tools.

<figure><img src="/files/cBYRVUhahrhcfnnJPrIG" alt="DataForSEO SERP Data Getter"><figcaption><p>DataForSEO SERP Data Getter</p></figcaption></figure>

**Where to find your task IDs**

Your task IDs are listed in your DataForSEO account under [**API Dashboard → SERP**](https://app.dataforseo.com/api-detail/serp). Each row is a task you have already paid for, with its ID, keyword and creation date. Copy the IDs you want and paste them into SEO Utils, one per line.

{% hint style="warning" %}
DataForSEO keeps completed results for roughly **30 days**. After that the ID can no longer be fetched, so import anything you still need before the window closes.
{% endhint %}

**How to use:**

1. Enter your DataForSEO task IDs (one per line) in the text area
2. Select the search engine type (Organic, or AI Mode)
3. Click "Fetch SERP Data"

The tool will automatically:

* Fetch the SERP data from DataForSEO using the task IDs
* Extract all necessary metadata (keyword, location, language, device type, etc)
* Save the data to your local database

This is particularly helpful when:

* You've run SERP tasks through DataForSEO's API directly
* You want to import historical SERP data from DataForSEO
* You're migrating data from another system that uses DataForSEO

#### Restoring missing days in an Organic Rank Tracker report

By default, this tool saves results into the shared SERP cache only. Turn on **"Also backfill Organic Rank Tracker reports"** and it can also put those results back into the report **and the day** they belong to.

This is for the situation where a tracker run was interrupted — the app closed mid-run, the computer restarted, a run failed part-way — and a day is missing from your report even though you already paid DataForSEO for those results. Instead of re-running the keywords and paying a second time, you paste the task IDs and put the results you already own back where they belong.

<figure><img src="/files/BTIaNpx1u0PYORUx8JdO" alt=""><figcaption><p>The "Also backfill Organic Rank Tracker reports" switch on the DataForSEO SERP Data Getter</p></figcaption></figure>

{% hint style="info" %}
Tracker backfill works with **Organic** results only. AI Mode results are still saved to the shared cache as before.
{% endhint %}

**How it works**

{% stepper %}
{% step %}

#### Paste your task IDs and turn the switch on

* Enter your task IDs, one per line
* Leave **Search Engine Type** on **Organic**
* Turn on **"Also backfill Organic Rank Tracker reports"**
* Click **"Fetch SERP Data"**

There is no task limit in this mode. Long lists are processed in batches of up to 1,000.
{% endstep %}

{% step %}

#### Wait while the tool checks each task

Results are fetched one at a time, so a long list takes a while. The screen shows how many tasks are done and an estimated time remaining, calculated from how fast your own tasks are actually coming back.

You can leave this page, or close the app entirely. The job continues where it stopped when you come back.

<figure><img src="/files/LaVBe33uU0cBWFbpvGsA" alt=""><figcaption><p>Analysis progress showing processed tasks and estimated time remaining</p></figcaption></figure>
{% endstep %}

{% step %}

#### Review the plan before anything is saved

Nothing is written until you confirm. You'll see your results grouped by report and date, marked either **Exact** or **Suggested**, with a preview of what each result contains.

<figure><img src="/files/V8uhDtuCO2fzEtNpNBso" alt=""><figcaption><p>Confirmation screen showing report groups, match confidence and import previews</p></figcaption></figure>
{% endstep %}

{% step %}

#### Choose the groups and confirm

* Tick the groups you want, or click **"Select all exact"**
* Set a destination date for any suggested group
* Tick any confirmation the screen asks for
* Click **"Confirm backfill"**

The import then runs in the background, and you can leave the page.
{% endstep %}
{% endstepper %}

**Exact and suggested matches**

The tool separates what it can prove from what it can only guess, and never applies a guess on its own.

| Match type    | What it means                                                                                                                                           | What you need to do                                                          |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| **Exact**     | The task ID matches a task this app created, so the report and the original day are both known.                                                         | Nothing. These are safe to select and are the ones "Select all exact" picks. |
| **Suggested** | The keyword, location, language, device and other search settings fit a report, but nothing proves the result came from it or which day it belonged to. | Check the destination date, then confirm you understand it is an estimate.   |

{% hint style="warning" %}
A suggested match uses DataForSEO's fetch time as the destination date. That is when the result was **collected**, which is not always the day your tracker was scheduled to run. Set the date yourself if you know better.
{% endhint %}

**The import preview**

Each keyword shows a small card so you can judge a match before importing it, rather than importing first and checking afterwards.

| On the card                        | What it tells you                                  |
| ---------------------------------- | -------------------------------------------------- |
| **#3** (or similar)                | Your tracked domain's best position in this result |
| **Not ranked**                     | The result is valid, but your domain isn't in it   |
| Page title and link                | The exact page that ranked                         |
| Organic results / Other SERP items | How much the fetched result contains               |

The card shows your domain's best organic position. The full result is imported, including other rankings and supported SERP features.

{% hint style="danger" %}
If you change a report's **target domain** or its **Include subdomains** setting after the analysis, the import stops and asks you to analyze the task IDs again. The preview you approved was read under the old settings, so it no longer describes what would be saved.
{% endhint %}

**Tasks with no matching report**

Task IDs that don't fit any tracker keyword can still be imported as ordinary SERP data, using DataForSEO's proven fetch date. This is on by default and changes no tracker positions. A task is only skipped entirely when DataForSEO returns no fetch date and no original task can be found, in which case there is no date that can be trusted.

**Confirmations you may be asked for**

Each checkbox covers a different decision, so you're only asked for the ones that apply.

| Confirmation                  | When it appears                                                                          |
| ----------------------------- | ---------------------------------------------------------------------------------------- |
| Suggested dates are estimates | You selected at least one suggested group                                                |
| Replacing tracker data        | A selected destination already holds data for that date, or you changed a suggested date |
| Replacing shared cache data   | An unmatched task already has data for its fetch date                                    |

<details>

<summary>If the analysis or import reports errors</summary>

The screen lists up to 100 details under **"Review details"**. Common causes:

1. **A task ID DataForSEO no longer has.** Results are kept for roughly 30 days, after which the ID can't be fetched.
2. **A task ID that isn't ready yet.** The result hasn't finished on DataForSEO's side; try it again later.
3. **A report changed after the analysis.** If the keyword, target domain or search settings changed, run the analysis again so the plan matches the report as it is now.
4. **A report is currently running.** A backfill won't compete with a live run for the same report and day. Wait for the run to finish, then analyze the task IDs again.

Results that imported successfully are always kept. Re-running the same task IDs never imports the same result twice — anything already imported is reported as "already imported" and skipped.

</details>

{% hint style="success" %}
Interrupted work is picked up automatically. If the app closes during an analysis or an import, it resumes at the point it reached the next time you open SEO Utils.
{% endhint %}


# DataForSEO Task Monitor

See what your paid DataForSEO tasks are doing, and whether anything actually needs your attention

Every SERP report you run creates paid tasks at DataForSEO. Most of the time they complete quietly in the background. The DataForSEO Task Monitor is where you look when you want to check on them — whether they're still with DataForSEO, already collected and waiting to be saved, recovering on their own, or genuinely stuck.

This is a monitoring page. You read it to understand what's happening; the app handles the fixing.

<figure><img src="/files/e6PdKdXsQqG7tbLSirEW" alt=""><figcaption><p>The DataForSEO Task Monitor showing summary counters, collector health and the active tasks table</p></figcaption></figure>

## Opening the monitor

Go to **Settings → DataForSEO Monitor**.

You can also reach it from the Dashboard. When something needs looking at, a **DataForSEO Needs Attention** card appears there with a link to this page. When everything is healthy, that card stays hidden — so if you don't see it, there's nothing to check.

## The four counters

| Counter                   | What it counts                                                                                              |
| ------------------------- | ----------------------------------------------------------------------------------------------------------- |
| **Waiting on DataForSEO** | Tasks being prepared, submitted, or waiting for DataForSEO to finish. Also shows the age of the oldest one. |
| **Ready to import**       | Results already downloaded to your computer, waiting to be saved into the report that asked for them.       |
| **Automatic recovery**    | Tasks older than 24 hours that the app is still collecting on its own.                                      |
| **Needs attention**       | Tasks that failed, were rejected, or have not moved for more than 15 minutes.                               |

{% hint style="info" %}
The counters describe different things about the same tasks, so one task can appear in more than one. A task under **Automatic recovery** is also still **Waiting on DataForSEO**.
{% endhint %}

{% hint style="warning" %}
**A high "Waiting on DataForSEO" number is usually normal.** Standard-queue tasks can legitimately take hours. Look at **Needs attention** to decide whether anything is actually wrong.
{% endhint %}

## Collector Health

A collector is the background worker that asks DataForSEO whether results are ready. The monitor tracks five of them:

* Organic SERP
* Google Maps
* Google AI Mode
* ChatGPT
* Business Reviews

Each one shows whether it's running, when it last checked in, and how many results DataForSEO had waiting during that check. There's also a button to open that collector's log.

A collector counts as running if it checked in within the last three minutes.

{% hint style="info" %}
**"Ready on last check" is not your backlog.** It's the number of results DataForSEO showed on the last page it looked at. A low number doesn't mean few tasks are outstanding.
{% endhint %}

A stopped collector only raises a warning at the top of the page when it currently owns active tasks. A collector for a tool you don't use sits idle without raising a false alarm.

## Active Tasks table

The table opens in **Needs attention** mode, so you see the problems first. Switch to **All active** to see every task currently in flight.

<figure><img src="/files/ZThD7b3ynjTksswz4Sqc" alt=""><figcaption><p>Active tasks table filtered to tasks that need attention</p></figcaption></figure>

Each row shows the task's current state, its collector, the keyword, its DataForSEO task ID, whether it belongs to a durable run or is a legacy task, the date the data is for, and how old it is. Two more columns — the last provider check, and which report owns the task — can be switched on when you need them.

You can search by keyword, task ID, provider status, endpoint or owner, and filter by state, collector, owner type and age.

## Alerts

| Alert                                   | What it means                                                                                     |
| --------------------------------------- | ------------------------------------------------------------------------------------------------- |
| **Disk is full**                        | Collection is paused until you free up space. Results stay at DataForSEO in the meantime.         |
| **A collector has stopped checking in** | A collector that currently owns tasks is no longer running, which may be holding up paid results. |

Task problems don't get their own banner — that's what the **Needs attention** counter and the filtered table are for.

## Staying up to date

The page refreshes itself every 15 seconds. The **Refresh** button reloads the counters, collector health and the task table immediately, and confirms when it's done.

## Logs and diagnostics

* Open any collector's log from the **Collector Health** section. Logs can be refreshed, copied, or opened in your default editor.
* **Export retired tasks** saves a file of tasks the app has finished with. This is for sending to support when you're investigating something.

## Why you can't delete tasks here

Earlier versions let you delete task records by hand. That option has been removed, and the app now refuses those requests even if an older screen still offers the button.

The reason is that deleting a task row throws away the DataForSEO task ID and the downloaded result file. Those are exactly what the app needs to recover a result **you have already paid for**. Deleting the row doesn't cancel anything at DataForSEO — it only destroys your own copy of how to fetch it.

Retiring and cleaning up old tasks is handled automatically in the background.

{% hint style="danger" %}
**Don't re-run a report just because a task looks slow.** If the task appears under **Automatic recovery**, the app still has its DataForSEO task ID and is still trying to collect the result. Running the report again pays for the same keywords a second time.
{% endhint %}

<details>

<summary>What to do when tasks need attention</summary>

1. **Check Collector Health first.** If a collector has stopped checking in, results can't be collected no matter what the tasks say. Restarting SEO Utils starts the collectors again.
2. **Check for the disk-full alert.** Collection pauses when there's no room to save results safely.
3. **Look at the age column.** A task a few minutes past the 15-minute mark is often just slow, not broken.
4. **Open the collector's log** for the tasks in question. The log shows what the collector saw on its most recent checks.
5. **Export retired tasks** if you need to send the history to support.

Wait before re-running a report. A paid result that is still recoverable is worth more than a fast retry.

</details>

{% content-ref url="/pages/D1TDLflLs8kfQXbkpdvI" %}
[Manage SERP Data](/guide/manage-serp-data)
{% endcontent-ref %}


# Migration Tools

These tools help you seamlessly transfer all data from one device to another.

### Database Backup Tool

To access the tool, please navigate to the user dropdown and select **Backup Tools > Database**.

<figure><img src="/files/gpNjNonJx9OAEVX2SQDq" alt=""><figcaption><p>Access Database backup tool</p></figcaption></figure>

#### Create Backup

The backup tool shows your current database size and, if you have SERP HTML snapshots, the number of files and their total size.

**SERP HTML Snapshots** are the actual Google search result pages captured during rank tracking. These files are stored separately on disk (not in the database). If you want to view SERP snapshots after restoring a backup, you must include them in the backup.

You can toggle **"Include SERP HTML snapshots in backup"** to choose whether to include these files:

* **Enabled (default)**: Creates a full backup (`.tar.gz`) containing both the database and HTML snapshots
* **Disabled**: Creates a database-only backup (`.db.gz`) without HTML snapshots

<figure><img src="/files/YjtVto4UW8MAEEcB7awE" alt=""><figcaption></figcaption></figure>

Simply click the **Create Backup** button, and select a folder to save the backup file.

There are some **important** things you need to note.

{% hint style="warning" %}

1. You won't be able to use the app while the backup is being created, and all background jobs will be paused.
2. Please ensure that no reports are running before starting the backup to avoid data corruption.
   {% endhint %}

The process will take 1 to 15 minutes, depending on the size of your database. Once the backup is complete, you can click "Back to Database Backup" to return to the previous page.

<figure><img src="/files/mEi0xUAOqJQcp3NDZuwH" alt=""><figcaption><p>Create backup process is completed!</p></figcaption></figure>

### Restore Backup

You can restore a backup on your current device or a different one. **Please note:**

{% hint style="warning" %}

1. The version of SEO Utils on the device you're restoring to must match the version used to create the backup file.
2. Restoring a database will overwrite all current data on the device.
   {% endhint %}

Please select a backup file and click the "Import Database" button. The tool supports both backup formats:

* **Full backup** (`.tar.gz`): Contains database and SERP HTML snapshots
* **Database-only backup** (`.db.gz`): Contains only the database (legacy format)

After selecting a file, the tool displays the **Backup Contents** showing:

* Database size
* Number of SERP HTML snapshot files and their total size (if included)
* For legacy backups, it indicates that SERP HTML snapshots are not included

<figure><img src="/files/FeSFAByJm0vuBoYoS5yf" alt=""><figcaption><p>Restore a backup file</p></figcaption></figure>

After the restore process is complete, please restart the app to apply the changes.

<figure><img src="/files/SQWyTRPJwGK5lOLsoHL5" alt=""><figcaption><p>The restore process is complete.</p></figcaption></figure>

### App Configurations Backup Tool

In addition to the database, consider backing up your app configurations to save time on re-setting important settings like the [DataForSEO API](/guide/seo-data-source#how-to-connect-your-dataforseo-account-to-seo-utils), [Renting API Key](/guide/rent-dataforseo-api-key), [Google Maps API](/guide/google-my-business-rank-tracker#setup-the-google-places-api), [IndexNow API](/guide/indexnow), and others.

To access the tool, please navigate to the user dropdown and select **Backup Tools > App Configurations**.

<figure><img src="/files/Iz7yzHoK8VpqNr2pS3qL" alt=""><figcaption><p>Access the app configurations backup tool</p></figcaption></figure>

Just like the database backup tool, you’ll be able to create and restore a backup file for your app configuration.

<figure><img src="/files/aSY8mNAqCNwSwUrdrzBA" alt=""><figcaption><p>Create &#x26; restore app confugrations</p></figcaption></figure>

### Cloud Database

This feature is coming in January 2025.


# Dashboard

The health check you see when you open SEO Utils

The Dashboard is the first screen you see when you open SEO Utils. It answers four questions at a glance: which version you're running, how much API credit you have left, whether your local database needs maintenance, and whether any of your paid DataForSEO tasks need attention.

<figure><img src="/files/Ca6l9vNTapHi42NhIKMa" alt="The SEO Utils Dashboard"><figcaption><p>The Dashboard, with the DataForSEO Needs Attention card showing 66 tasks to review</p></figcaption></figure>

The **Onboarding** button in the top-right corner reopens the setup walkthrough at any time, which is useful when you're connecting a new service.

## Version

Shows the version you're running and its release date.

Click **What's new** to read what changed in this version without leaving the app.

## DataForSEO Balance

Your remaining credit on your own DataForSEO account. This card appears once you've connected your DataForSEO credentials.

**Top Up Balance** opens your DataForSEO account page in your browser so you can add credit.

{% hint style="warning" %}
Reports stop when your balance runs out. If you schedule daily rank tracking, check this card regularly — an empty balance means tasks are never created, and a missed day cannot be recovered later.
{% endhint %}

## Renting API Balance

Your remaining credit if you use a [rented API key](/guide/rent-dataforseo-api-key) instead of your own DataForSEO account. **Top Up Balance** opens the purchase page.

{% content-ref url="/pages/gwYT1OgDY4moZ5jr2WTJ" %}
[Rent DataForSEO API Key](/guide/rent-dataforseo-api-key)
{% endcontent-ref %}

## Database Fragmentation

As you add and delete data over months of reports, your local database accumulates unused space. This card shows how much.

| Badge      | What it means                                                                                   |
| ---------- | ----------------------------------------------------------------------------------------------- |
| **Normal** | Under 20% — nothing to do.                                                                      |
| **High**   | Over 20% — a **Maintain** button appears so you can compact the database and reclaim the space. |

Compacting is optional housekeeping. A fragmented database makes reports slower but doesn't put your data at risk.

## DataForSEO Needs Attention

This card appears **only when something needs looking at**. A Dashboard without it means your paid tasks are healthy.

It shows two badges when they apply:

* **N tasks** — tasks that failed, were rejected, or have not moved for more than 15 minutes
* **N collectors offline** — background workers that have stopped checking DataForSEO for results

Click the card to open the DataForSEO Task Monitor, where you can see collector health and which tasks are recovering on their own.

{% content-ref url="/pages/o4Z0dWCJONqiSdJfaDrV" %}
[DataForSEO Task Monitor](/guide/dataforseo-task-monitor)
{% endcontent-ref %}

{% hint style="danger" %}
**Don't re-run a report to force a slow task.** You pay for the same keywords twice, and the original task is usually still recoverable. Open the Task Monitor first — if the task appears under **Automatic recovery**, the app still has its DataForSEO task ID and is still collecting the result you already paid for.
{% endhint %}

## Disk Full alert

If your disk runs out of space, a **Disk Full** alert appears above the cards and task collection pauses until you free some up.

Nothing is lost while collection is paused. Your results stay at DataForSEO and are collected once there is room to save them safely.

<details>

<summary>Repair actions removed from earlier versions</summary>

Older versions showed Organic SERP and Google Maps queue cards on the Dashboard, along with manual repair actions under **Settings → Services**:

* **Free Organic SERP Tasks**
* **Free Stuck GMB Rank Trackers**
* **Delete DataForSEO Post Tasks**

All of these have been removed. Stuck queues now clear on their own through automatic recovery, and the DataForSEO Task Monitor shows you whether that is happening.

The last action was also unsafe: deleting a task record threw away the DataForSEO task ID and the downloaded result file, which are exactly what the app needs to recover a paid result. Deleting the record never cancelled anything at DataForSEO — it only destroyed your own copy of how to collect it.

If you're following older instructions that mention any of these actions, use the Task Monitor instead.

</details>


# Organic Rank Tracker

The Organic Rank Tracker Dashboard provides a centralized view of all your rank tracking reports, allowing you to monitor performance across multiple domains, devices, and locations from a single screen.

<figure><img src="/files/MNL5bkrzyu0K402hf5LN" alt=""><figcaption><p>Organic Rank Tracker Dashboard</p></figcaption></figure>

## Accessing the Dashboard

### Via the Left Sidebar Menu

1. Look for the **Dashboard** section in the left sidebar
2. Click on **Organic Rank Tracker** under the Dashboard menu
3. The dashboard will load showing all your rank tracking reports

<figure><img src="/files/Lk4l0KXWVtO3MKVFRxmX" alt="" width="375"><figcaption><p>Access the Organic Rank Tracker Dashboard from the left sidebar</p></figcaption></figure>

### Via the Reports Page

You can also access the dashboard from the [Organic Rank Tracker Reports](/guide/organic-rank-tracker) page by clicking the **Dashboard** button in the top right corner.

## Understanding the Dashboard Layout

### Date Range Filter

At the top of the dashboard, you'll find the date range filter. This filter controls the time period for all data displayed on the page.

<figure><img src="/files/aXKSzI59mHob5lOLdzoC" alt="" width="375"><figcaption><p>Date range filter with preset options</p></figcaption></figure>

{% hint style="info" %}
**Preset Options Available:**

* Past 2 days
* Past 7 days
* Past 30 days
* Past 60 days
* Past 90 days
* Previous Month
* All Time
  {% endhint %}

### Average Position Chart

The chart displays average position trends for all your tracked domains. This powerful visualization helps you spot trends across your entire portfolio at a glance.

<figure><img src="/files/o4QFG2KuNOa0rEmwIxUF" alt=""><figcaption><p>Average position trends consolidated by domain</p></figcaption></figure>

**How the Chart Works:**

* **Each line represents one domain** - If you track the same domain across multiple locations or devices, they're combined into a single line
* **Automatic averaging** - When you have multiple reports for one domain (e.g., tracking in US, UK, and Canada), the chart shows the average position across all locations
* **Lower is better** - The Y-axis shows positions, where position 1 is the best
* **Interactive tooltips** - Hover over any point to see exact positions and dates

{% hint style="success" %}
**Example**: If you track "example.com" in 3 different cities, the chart shows one line representing the average performance across all 3 locations, giving you a unified view of your domain's performance.
{% endhint %}

### Reports by Domain

The dashboard intelligently groups your reports by domain, making it easy to monitor performance across different configurations.

<figure><img src="/files/qpu3KKi5xjQTg6wXtKGA" alt=""><figcaption><p>Reports grouped by domain for easy comparison</p></figcaption></figure>

**Benefits of Domain Grouping:**

* **Compare device performance** - See how your mobile vs desktop rankings differ
* **Monitor multiple locations** - Track performance across different countries or cities
* **Unified domain view** - All reports for a domain are visually grouped together

### Domain Search

Quickly find specific domains using the search bar. This is especially helpful when managing many domains.

<figure><img src="/files/WfDzDUJQCdI36rAmptnE" alt=""><figcaption><p>Filter reports by domain name</p></figcaption></figure>

## Understanding Report Cards

Each report is displayed as a card containing comprehensive ranking data and metrics.

<figure><img src="/files/gN8O8NoWwI6rc1T0rmsm" alt=""><figcaption><p>Report card</p></figcaption></figure>

### Card Header

The card header displays:

* **Domain name** (e.g., laravel.com)
* **Actual comparison dates** (e.g., Feb 20, 2025 → May 29, 2025)
* **Report configuration**: Device type, search engine, location, and language
* **View Report button** to access the full report details

{% hint style="warning" %}
**Important: Closest Available Dates**

The dates shown in the card header (next to the View Report button) are the actual dates being compared, which may differ from your selected date range. The system automatically finds the closest available snapshot dates for each report.

For example:

* You select: May 25-29, 2025
* Report only has data for: Feb 20 and May 29, 2025
* Dashboard shows: Feb 20 → May 29 comparison
  {% endhint %}

### Metrics Section (Left Side)

<figure><img src="/files/IhUGgcGBelkLQEQ5dKXM" alt=""><figcaption><p>Metric section</p></figcaption></figure>

The left side of each card displays position distribution metrics:

#### Position Rankings

* **Top 3**: Keywords ranking in positions 1-3
* **Top 10**: Keywords ranking in positions 1-10
* **Top 20**: Keywords ranking in positions 1-20
* **Top 100**: Keywords ranking in positions 1-100

Each metric shows:

* Previous count → Current count
* Change indicator (↑ increase, ↓ decrease)
* Net change value in parentheses

#### Overall Changes

Below the position rankings, you'll find the overall change summary:

* 🟢 **New**: Keywords that started ranking (weren't ranking before)
* 🔵 **Improved**: Keywords that improved their positions
* 🔴 **Lost**: Keywords that stopped ranking (were ranking before)
* 🟠 **Declined**: Keywords that dropped in positions
* ⚪ **Unchanged**: Keywords that maintained their positions

### Keywords Table (Right Side)

<figure><img src="/files/DABIQ39cDArINvLH3vIj" alt=""><figcaption><p>Top 10 performing keywords</p></figcaption></figure>

The right side displays the top 10 performing keywords with:

* **Keyword**: The tracked keyword
* **Position columns**: Shows positions for both comparison dates
* **Diff**: Position change (positive = improvement, negative = decline)
* **Volume**: Monthly search volume
* **KD**: Keyword difficulty score
* **CPC**: Cost per click value

{% hint style="info" %}
**Keyword Sorting**

Keywords are sorted by best current position, with search volume as a secondary sort to ensure consistent ordering when multiple keywords have the same position.
{% endhint %}

## Important Notes

### Understanding Domain Grouping

The dashboard makes it easy to manage multiple reports for the same domain:

* **Visual grouping** - All reports for a domain appear together under a domain header
* **Separate cards** - Each configuration (device/location) gets its own card for detailed analysis
* **Combined chart data** - The average position chart intelligently combines all reports for a domain into one line

{% hint style="success" %}
**Perfect for Multi-Location Tracking**: If you track "mysite.com" for New York, Los Angeles, and Chicago, you'll see:

* 3 separate cards showing detailed metrics for each city
* 1 line in the chart showing the overall average performance
* All 3 cards grouped together under "mysite.com" for easy comparison
  {% endhint %}

## Common Use Cases

**1. Quick Performance Overview**\
Use the dashboard to get a bird's-eye view of how all your tracked domains are performing without opening individual reports.

**2. Identify Trends**\
The average position chart helps you spot overall trends across your portfolio of tracked domains.

**3. Spot Issues Quickly**\
The change metrics (New, Improved, Lost, Declined) help you quickly identify domains that need attention.

**4. Compare Time Periods**\
Use the date filter to compare different time periods and understand how your rankings have evolved.

## Tips for Best Results

### Monitoring Multiple Locations

When tracking the same domain across different locations:

* Each location gets its own detailed card
* The chart combines all locations to show overall trend
* Use this to identify which locations perform best

### Device Comparison

Track both mobile and desktop for comprehensive insights:

* Quickly spot mobile vs desktop ranking differences
* Identify device-specific SEO opportunities
* All device data for a domain stays grouped together

### Using Date Comparisons

The dates shown next to "View Report" button are the actual dates being compared:

* These may differ from your selected range if exact dates aren't available
* The system automatically finds the closest available data
* All metrics in the card use these same dates for accuracy

{% hint style="info" %}
**No data showing?** Check if the report has tracking data within your selected date range. The system needs at least two different dates with data to show comparisons.
{% endhint %}


# NLP Text Analysis

Easily extract important topics and entities from any text or webpage with our NLP Text Analysis tool. Using popular APIs like Google NLP, TextRazor, and Dandelion, it supports around 20 languages.

Whether optimizing content for SEO, performing competitive research, uncovering hidden trends, or finding gaps in topics and entities, NLP Text Analysis provides the clarity and precision your workflow demands. Boost your efficiency and elevate your strategy with deep semantic insights at your fingertips.

### Supported API Drivers

#### 1. Text Razor

Register for an account at [TextRazor](https://www.textrazor.com/signup).

TextRazor offers a free plan with up to 500 requests per day. The free tier includes full access to all features, allowing you to extract entities and topics effectively.

If you need more than 500 requests per day, please consider a paid plan at [TextRazor Plans](https://www.textrazor.com/plans).

After registering an account, you can obtain your API key at your [TextRazor Console](https://www.textrazor.com/console).

To enter the API key to SEO Utils, please visit the **Services** > **Natural Language Processing** page.

<figure><img src="/files/K6zXBvDS1Uwyb2GcyDTB" alt=""><figcaption><p>Add TextRazor API Key to SEO Utils</p></figcaption></figure>

#### 2. Google NLP

To use Google NLP, you must first enable the "**Cloud Natural Language API**" in your project.

Google NLP offers a free tier providing **5,000 units per month**, where each unit represents 1,000 characters processed. Additional usage beyond the free tier incurs minimal charges based on character count. For complete pricing details and calculations, visit [Google NLP Pricing](https://cloud.google.com/natural-language/pricing).

Visit [Google Cloud Console](https://console.cloud.google.com/) and search for "Cloud Natural Language API" in the top search bar.

<figure><img src="/files/umHKv4DJMQnamaJIRpdy" alt=""><figcaption><p>Find the Cloud Natural Language API.</p></figcaption></figure>

After enabling the API, go to the Credentials tab from the left sidebar. Click on the "Create Credentials" button and select "API Key."

<figure><img src="/files/rd9isAmhx3CFsMYXCjqP" alt=""><figcaption><p>Create an API key.</p></figcaption></figure>

{% hint style="info" %}
If you already have an existing API key, you can use that instead.
{% endhint %}

Copy the API key from the pop-up window.

<figure><img src="/files/SWcFq16DZ6f2RzOHgo1e" alt=""><figcaption><p>Copy the API key.</p></figcaption></figure>

You can edit the API key to add a name and restrict access. It is recommended to restrict the key to only allow access to the Cloud Natural Language API.

<figure><img src="/files/EbplBZhGjmloizUk0JDf" alt=""><figcaption><p>Restrict API key.</p></figcaption></figure>

To enter the API key to SEO Utils, please visit the **Services** > **Natural Language Processing** page.

<figure><img src="/files/YqtlDyhicMBrVnYS7wyy" alt=""><figcaption><p>Enter the Google NLP API Key.</p></figcaption></figure>

#### 3. Dandelion

Register for an account at [Dandelion](https://dandelion.eu/accounts/register/).

Dandelion offers a free tier allowing up to 1,000 requests per day, approximately 30,000 requests per month.

Obtain your API key by visiting your [Dandelion Dashboard](https://dandelion.eu/profile/dashboard/).

For additional requests beyond the free tier, consider upgrading to a paid plan at [Dandelion Pricing](https://dandelion.eu/profile/plans-and-pricing/).

To enter the API key to SEO Utils, please visit the **Services** > **Natural Language Processing** page.

<figure><img src="/files/MBJEx8skvuoTHt7IBc1z" alt=""><figcaption><p>Enter Dandelion API Key to SEO Utils.</p></figcaption></figure>

### How to Use the NLP Text Analysis Tool

To access the NLP Text Analysis tool, navigate to **NLP > Text Analysis** in the left sidebar. Hit the "Run" button to perform a new analysis.

<figure><img src="/files/uTdqMk5K3BxQi9NgGX2w" alt=""><figcaption><p>Text Analysis tool</p></figcaption></figure>

You can enter raw text, HTML, or multiple URLs into the provided input area.

Next, select your preferred API Driver and the language for analysis from the dropdown menus.

After the analysis process is finished, SEO Utils will provide three report pages: **Text Analysis**, **Entities**, **Topics**.

#### 1. Text Analysis Tab

The **Text Analysis** tab breaks your content down sentence by sentence and highlights all detected entities. Simply hover over an entity to view its details!

<figure><img src="/files/7g3c6WyKPv0bBJNS5jvB" alt=""><figcaption><p>Text Analysis tab</p></figcaption></figure>

Instead of scanning through large blocks of text, you get a clear, digestible view of the key topics, terms, and important concepts in every sentence. This makes it incredibly easy to refine your content, optimize for SEO, and ensure that your messaging is precise and impactful.

#### 2. Entities Tab

An **entity** is a meaningful word or phrase that represents a real-world concept, such as a person, place, object, event, or idea. Unlike simple keywords, entities have deeper meanings and are linked to other related concepts. This helps you understand not just what words appear in your content, but what they actually represent.

For example, if your text mentions “**New York**”, SEO Utils doesn’t just recognize it as a word but understands it as a city, which belongs to a larger category of locations. This deeper understanding helps you structure content better, and ensure search engines correctly interpret your topics. By detecting and categorizing entities, you can fine-tune your content, focus on the most important subjects, and make it more relevant to your audience.

<figure><img src="/files/yQBwhBDAYAjaGnsn5x2S" alt=""><figcaption><p>Entities Tab</p></figcaption></figure>

* **Relevance Score:** Measures how strongly an entity relates to your content. A high score means the entity is central to the text.
* **Confidence Score:** Measures how confident the API Driver is that the detected entity is correct. A higher score means the detection is more reliable.
* **Mention Count:** Tracks how many times an entity appears in your content. A high count means the entity is frequently referenced.
* **Types**: Categorizes entities based on their meaning, such as **Software**, **Person**, or **Location**. This helps you quickly understand what kind of concepts appear in your content.

Key difference between Relevance Score and Confidence Score:

| Feature              | Relevance Score                                               | Confidence Score                                                              |
| -------------------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| Definition           | Measures how relevant an entity is to the input text.         | Measures how confident the API Driver is that the detected entity is correct. |
| What it Evaluates    | Contextual similarity between the entity and the source text. | Probability that the detected entity is correct, based on multiple signals.   |
| Use Case             | Helps rank entities by importance in the text.                | Helps filter out incorrect or uncertain entity detections.                    |
| Supported API Driver | [TextRazor](#id-1.-text-razor) only.                          | All API Drivers.                                                              |

**Using Mention Count Toggle Button**

You can see how many times each entity appears in your content by clicking the toggle button on each entity row in the table.

<figure><img src="/files/RAnJ7Zc4rybA5OYXpSv5" alt=""><figcaption><p>Mention Count Toggle Button</p></figcaption></figure>

**Using Filters for Entity List**

1. **Filter by Relevance Score** – Focus on the most important topics in your content.

* **Use Case:** If you want to analyze core topics for SEO or research, filtering by high Relevance Score ensures you see only the most relevant entities. For example, if your article is about “*coffee brewing*”, terms like “*espresso*” and “*French press*” will have high relevance, while broader terms like “*beverages*” might be excluded.

2. **Filter by Confidence Score** – Remove incorrect or uncertain entity detections.

* **Use Case:** If you are analyzing a large text and need high-accuracy results, filtering by high Confidence Score ensures that only correctly detected entities are included. For example, if “*Apple*” appears in a tech article, a high confidence score ensures it refers to the company rather than the fruit.

3. **Filter by Mention Count** – Identify the most frequently used entities.

* **Use Case:** If you want to track dominant topics in your content, filtering by mentionCount helps you find terms that appear most often. This is useful for content structuring and topic clustering. For example, if “*climate change*” is mentioned 20 times in an article, but “*global warming*” only appears twice, you might focus on emphasizing “climate change” in your SEO strategy.

By adjusting these filters, you can fine-tune your entity analysis, whether you need **precise topic identification** (high relevance), **accurate entity detection** (high confidence), or **frequently mentioned topics** (high mention count). 🚀

#### 3. Topics Tab

{% hint style="warning" %}
Only [TextRazor](#id-1.-text-razor) supports topic extraction, so you can only see the Topics tab when using that API driver.
{% endhint %}

A **topic** is a broad subject or theme that your content discusses. Topics provide a high-level understanding of what your text is about, grouping related concepts under general categories like Business, Science, or Technology. Unlike entities, which represent specific names or objects, topics capture the overall theme of your content, helping you see its main focus at a glance.

<figure><img src="/files/rGP6sSmrxaCpOwaaXK6Q" alt=""><figcaption><p>Topics Tab</p></figcaption></figure>

* **Score:** Measures how relevant a topic is to the input text. The higher the score, the more relevant the topic is. Score ranges from 0 to 1.
* **Coarse Topics:** General categories.

**Key Differences Between Topics and Entities**

| Feature     | Topics                                                  | Entities                                         |
| ----------- | ------------------------------------------------------- | ------------------------------------------------ |
| Definition  | General themes or subject categories                    | Specific real-world objects, names, or concepts  |
| Purpose     | Helps categorize content and understand its broad focus | Identifies key terms and their semantic meaning  |
| Examples    | *Business, Science, Mathematics*                        | *New York, Tesla, Python (programming language)* |
| Granularity | High-level classification                               | Detailed and specific references                 |

While **entities tell you exactly what appears in the text, topics help you see the bigger picture**, making it easier to categorize, summarize, and optimize your content for relevance and clarity.

**Key Differences Between Topics and Coarse Topics**

| Feature     | Topics (Fine-grained)     | Coarse Topics (Broad)     |
| ----------- | ------------------------- | ------------------------- |
| Granularity | More specific topics      | General categories        |
| Example     | Google Search             | Technology                |
| Use Case    | Detailed topic extraction | Broad text classification |

**Use Cases for the Topics Tab**

1. **Content Categorization & Relevance**

* Use Case: Ensure your content aligns with your target niche.
* Example: If you’re writing about “*eCommerce trends*,” but the detected topics are **Business** and **Marketing**, it confirms your content is on track. However, if unrelated topics like **Mathematics** or **Arts** appear, you might need to adjust your content focus.

2. **Topic Gap Analysis**

* Use Case: Compare your content topics against competitor content to find missing areas.
* Example: If competitors covering “*email marketing*” are categorized under **Digital Marketing**, but your article only shows **Business**, you may need to add more relevant details to strengthen topic alignment.

3. **Improving Search Intent Matching**

* Use Case: Make sure your content aligns with what search engines expect for a given keyword.
* Example: If you’re targeting “*AI in healthcare*,” but your topics only show **Technology**, adding more medical references can help trigger **Health & Medicine** topics for better search relevance.

4. **Optimizing Internal Linking & Topic Clusters**

* Use Case: Identify content clusters for better internal linking.
* Example: If multiple articles on your site are categorized under **Web Development**, you can interlink them to create a **stronger topical authority** on that subject.

5. **Structuring Content for Featured Snippets**

* Use Case: Improve content structure by ensuring clear topic coverage.
* Example: If your article about “*Best SEO Practices*” is categorized under **Business** but lacks SEO or **Digital Marketing**, adding a structured section with on-page, off-page, and technical SEO could improve your chances of ranking in Google’s featured snippets.

By leveraging topic detection, you can ensure **better content alignment, improve topical authority, and optimize your content for higher rankings in search results**. 🚀


# Content Struct

The **Content Struct** tool lets you input one or multiple seed keywords. SEO Utils will then scrape the top 20 Google SERP results for those keywords, collecting all headings, main content, and SEO metadata—including meta titles and descriptions.

<div data-full-width="true"><figure><img src="/files/tjqS2E1OiTBKotCQxf0F" alt=""><figcaption><p>Content Struc tool</p></figcaption></figure></div>

You can export the scraped data to other tools within SEO Utils, such as [NLP Text Analysis](/guide/nlp-text-analysis), to extract entities and topics from the content. Alternatively, you can use the data to manually build a comprehensive content outline—or generate one instantly with AI, all in a single click.

### Create a Content Struct

To create a new Content Struct, head to the left sidebar and click on “Content Struct.” Then, simply click the “**Create Content Struct**” button to get started.

<figure><img src="/files/0aQ0rCbqh5FwypknssEp" alt=""><figcaption><p>Access the Content Struct tool.</p></figcaption></figure>

Next, enter your main keyword and choose the target locale you’d like to focus on.

**Excluded Domains:** If you want to skip scraping headings and metadata from certain domains (e.g., youtube.com, reddit.com), simply add them to this field.

**Scrape SERP With:** This field functions just like the Organic Rank Tracker tool. For detailed information on how it works, please refer to the “Scraping SERP Methods” section in the [Organic Rank Tracker guide](https://help.seoutils.app/guide/organic-rank-tracker#scraping-serp-methods).

{% hint style="warning" %}
**Important:** To use the SERP API, you must have your own DataForSEO account. [Renting API key services](https://help.seoutils.app/guide/rent-dataforseo-api-key) isn't viable because DataForSEO restricts certain endpoints that I utilized to implement the Queue mode. If multiple users rely on a rented API key from my account, it will slow down the process for everyone. For the quickest results, using your own DataForSEO account is the best approach.
{% endhint %}

<figure><img src="/files/NqIKuEZ7ucDQ9CWV8PhY" alt=""><figcaption><p>New Conent Struct Form</p></figcaption></figure>

#### Bulk Mode

You can enable Bulk Mode by toggling the switch on, allowing you to enter multiple keywords at once. When Bulk Mode is active, you can also assign a Group Name to organize your keywords. This makes it easy to identify which keywords belong to the same group, filter them accordingly, and quickly switch between them.

<figure><img src="/files/Ra6eZbPXtGy4DhF6XBZG" alt=""><figcaption><p>Filter content structs by group</p></figcaption></figure>

### Content Struct Detail

After creating a new Content Struct, you’ll be redirected to the Content Struct detail page, which is divided into two main sections.

On the **left side**, you’ll find all the scraped data from the top 20 Google SERP results—this includes headings, metadata, and main content.

On the **right side**, you’ll see your Content Outline. You can use the “**Show/Hide My Content Outline**” button to toggle the visibility of your outline as needed.

<figure><img src="/files/ZZgdDvCyZau0TzlX6NGY" alt=""><figcaption><p>Content Struct Detail</p></figcaption></figure>

You can copy all headings, metadata, and main content—or add specific headings from a competitor’s URL directly to your content outline.

<figure><img src="/files/Ra3ZNuc44v0c32Wv4cc7" alt="" width="375"><figcaption><p>Copy or add headings to your content outline</p></figcaption></figure>

#### Manage Your Content Outline

Use the checkboxes to select headings in your content outline. You can then delete them, promote a heading (using the left arrow icon), or demote a heading (using the right arrow icon) to adjust its level.

<figure><img src="/files/EzyZs8ge1mnly0mqPsZJ" alt="" width="375"><figcaption><p>Manage your content outline</p></figcaption></figure>

You can also rearrange headings by simply dragging and dropping them into your preferred order.

<figure><img src="/files/tYNKNfSHxe7JFlCLx2l8" alt="" width="375"><figcaption><p>Move headings</p></figcaption></figure>

### Auto-generate Content Outline using AI

In addition to adding headings manually, you can use AI to generate a content outline automatically. The AI-generated outline includes hierarchical headings, a meta title, and a meta description to help you get started quickly.

<figure><img src="/files/OX7HldpZY9T5aGZM5p1w" alt="" width="563"><figcaption><p>Auto Generate Outline</p></figcaption></figure>

Please [follow this guide](/guide/bulk-seo-metadata-optimizer#choose-the-ai-model) to set up your LLM provider API keys or connect a local LLM using Ollama.

Once your API keys are configured, click the “**Auto Generate Outline**” button. You can choose your preferred AI model and customize both the **instruction** and **prompt** sent to the LLM.

{% hint style="info" %}
SEO Utils also provides a default setup, so you can start generating content outlines right away.
{% endhint %}

<figure><img src="/files/Nv78w5e73ZHMU0jQ2Qam" alt=""><figcaption><p>Customize prompt and instruction</p></figcaption></figure>

{% hint style="success" %}
**Tips**

* Please select an AI model with a **large context window**, as SEO Utils sends detailed competitor data—including metadata and headings—to the model.
* Local models with smaller parameters (*e.g., llama3.2:latest (3.2B), mistral:latest (7.2B), llama2:latest (7B)*) typically do not generate high-quality content outlines. For better results, use a larger model (e.g., **32B, 70B**) or a **cloud-based model** from providers like **OpenAI** or **Anthropic**.
  {% endhint %}

### Export a Content Struct

ou can export your Content Struct as a **DOCX** file directly to **Google Drive** by clicking the **download icon** button.

<figure><img src="/files/5SjOJ8LSjARlvexxrZlE" alt=""><figcaption><p>Export your content sturct</p></figcaption></figure>

### Setup Google Drive API Integration

To export to Google Drive, you'll need to take one extra step: enable the Google Drive API. Please [follow this guide](/guide/google-service-accounts) to create a Google Service Account and obtain your **JSON key file**—it's completely free. Make sure to also enable the **Google Drive API** in your Google Cloud project.

After obtaining your API key and copying the service account email, go to [Google Drive](https://drive.google.com/drive/u/0/) and create a new folder. Then, share the folder with the service account email.

Next, copy the Folder ID from the URL of your Google Drive folder. For example, if the URL is:

`https://drive.google.com/drive/u/0/folders/1GvqiPSvGEDgq2yKOC52VGtS433iZXMIv`

then the **Folder ID** is: `1GvqiPSvGEDgq2yKOC52VGtS433iZXMIv` .

<div data-full-width="true"><figure><img src="/files/AyJsr5QSYOssxEeUoVHi" alt=""><figcaption><p>Create a folder on Drive and share the permission to the Google Service Account email.</p></figcaption></figure></div>

Lastly, In the SEO Utils app, go to the Services page from the left sidebar.

Upload the **Google Service Account JSON Key file** you downloaded earlier, and paste the **Google Drive Folder ID** into the corresponding input field—just like shown in the screenshot below.

<div data-full-width="true"><figure><img src="/files/H2HQBkm6nsPZaCNgYVnM" alt=""><figcaption><p>Etner all information</p></figcaption></figure></div>

That’s it! You can now export your Content Struct to Google Drive. All exported files will be saved directly to the folder you created.

### Troubleshooting

#### Unable to retrieve headings due to error.

<figure><img src="/files/6ncW7mYjcg0OfbSVA0X8" alt="" width="563"><figcaption><p>Error when scraping data</p></figcaption></figure>

Sometimes, you may see an error like the one shown in the screenshot above. This usually happens when the website blocks SEO Utils’ scraper, preventing it from retrieving the data.

To fix this, click the “**Enter HTML manually instead**” button. A modal will open, where you can click the provided link to open the URL in your browser.

<figure><img src="/files/EZ80g4orVrrd5EqbAmr4" alt="" width="563"><figcaption><p>Add HTML content modal</p></figcaption></figure>

After that, right-click anywhere on the page and select “**View Page Source**” from the context menu.

<figure><img src="/files/zc47ISqiaKKcmoTrVT8j" alt="" width="563"><figcaption><p>View page source to grab HTML</p></figcaption></figure>

Then, copy the entire HTML content and paste it into the “**HTML Content**” field in the SEO Utils app. Click the “**Extract Data**” button, and you’ll see the headings, metadata, and main content extracted from that URL.


# Log File Analysis

Track which bots — Googlebot, Bingbot, GPTBot, ClaudeBot, PerplexityBot, ChatGPT-User and more — are crawling your site, what they're fetching, and whether they respect your robots.txt. The tool reads raw server access logs and turns them into an AEO/GEO-focused dashboard.

## Creating a report

Open **Log File Analysis** in the sidebar and click **Create New Analysis**. Enter a report name and domain, then pick how SEO Utils should get your logs:

<figure><img src="/files/60XSb43Tf24oIvITFBL1" alt=""><figcaption><p>Log File Analysis in the sidebar</p></figcaption></figure>

<figure><img src="/files/3sOv5ossI0wZrH7guuP8" alt=""><figcaption><p>Create form</p></figcaption></figure>

{% tabs %}
{% tab title="Upload files manually" %}
Best for one-off analyses, historical archives, or servers without SSH/FTP access.

Drag `access.log` / `.gz` archives into the create form and submit. Apache Combined and Nginx Combined formats are auto-detected; compressed `.gz` archives work without unzipping.

**Where to find logs:**

| Server                 | Path                          |
| ---------------------- | ----------------------------- |
| Apache (Ubuntu/Debian) | `/var/log/apache2/access.log` |
| Apache (CentOS/RHEL)   | `/var/log/httpd/access_log`   |
| Nginx                  | `/var/log/nginx/access.log`   |
| cPanel                 | Metrics → Raw Access          |
| Plesk                  | Websites & Domains → Logs     |

Re-uploading is safe. SEO Utils fingerprints the first 20 lines of each file, so the same file twice is a no-op, and an extended file imports only the new entries.

To add more files later, open the report and click **Add Log Files** — same dedup rules apply.

<figure><img src="/files/WRRum0Tgs0HbAL98FeIg" alt=""><figcaption><p>Add Log Files dialog on an existing report</p></figcaption></figure>
{% endtab %}

{% tab title="Connect a server source" %}
Best for continuous monitoring. Give SEO Utils SFTP, FTP, or FTPS access once and it pulls new logs on a schedule. After submitting the create form, the Add Source dialog opens automatically.

{% hint style="info" %}
**Is this for me?** If your site runs on **cPanel, shared hosting, Wix, Squarespace, or Webflow**, automated log access is usually disabled — use **Upload files manually** instead. SFTP/FTP is common on VPS providers (Laravel Forge, Hetzner, DigitalOcean, AWS Lightsail) and managed-WordPress hosts that advertise SFTP support (Kinsta, WP Engine, Pressable).
{% endhint %}

**What you'll need before you start:**

* The server's **hostname or IP** (e.g. `45.63.38.207` or `logs.example.com`)
* A **username** with read access to the log directory
* Either a **password** or a **private key file** — your host or developer gave you one of these when they set up the server
* The **folder path** where access logs live on that server (we'll list the common ones below)

If any of those are unfamiliar, ask your developer or host for "SFTP credentials and the path to the access log directory" — that one sentence covers it.

{% hint style="info" %}
The scheduler runs in-process — sources fetch only while SEO Utils is open, with a catch-up pass on every launch.
{% endhint %}

{% stepper %}
{% step %}
**Connection details**

* **Source name** — any label, e.g. "production web1".
* **Protocol** — leave as **SFTP** unless your host specifically told you otherwise. SFTP is the same secure protocol as the `ssh` command and is what nearly every modern VPS uses. Pick FTP or FTPS only if your host instructed you to.
* **Host / Port / Username** — the port auto-fills to the standard for each protocol (22 for SFTP, 21 for FTP, 990 for FTPS implicit). Only change it if your host uses a non-standard port.

{% hint style="warning" %}
If Test connection later returns `lookup HOST: no such host` for an IP address you typed, the Host field has trailing whitespace from copy-paste. Re-type it.
{% endhint %}
{% endstep %}

{% step %}
**Authentication**

Pick whichever your host gave you:

* **Password** — type the SFTP/FTP password they supplied. Simplest if you have it.
* **Private key** *(SFTP only)* — paste the entire contents of your private key file, including the `-----BEGIN…-----` and `-----END…-----` header/footer lines. On macOS/Linux the file is typically `~/.ssh/id_rsa` or `~/.ssh/id_ed25519`; on Windows look in `C:\Users\<you>\.ssh\`. If the key is protected with a passphrase, a passphrase field appears — fill it in.

For **FTPS** specifically, your host will tell you Explicit mode (port 21, the common case) or Implicit (port 990, rare).

{% hint style="info" %}
Credentials never touch the SEO Utils database. They live in your OS keychain (macOS Keychain, Windows Credential Manager, Linux Secret Service); the report row only stores an opaque pointer.
{% endhint %}
{% endstep %}

{% step %}
**File selection**

**Remote directory** — the folder on the server that contains your access logs.

| Server / Host            | Common path                                       |
| ------------------------ | ------------------------------------------------- |
| Nginx (default)          | `/var/log/nginx/`                                 |
| Apache (Ubuntu/Debian)   | `/var/log/apache2/`                               |
| Apache (CentOS/RHEL)     | `/var/log/httpd/`                                 |
| Laravel Forge (per-site) | `/home/forge/<your-site>/` *or* `/var/log/nginx/` |
| Plesk (per-site)         | `/var/www/vhosts/system/<your-site>/logs/`        |

Not sure? Ask your host or developer "where do my access logs live?" and paste their answer here.

**File glob** — a simple wildcard pattern that picks which files to fetch.

| If you want…                                         | Pattern                   |
| ---------------------------------------------------- | ------------------------- |
| The active log plus rotated archives *(recommended)* | `access.log*`             |
| Just one site on a multi-site server                 | `example.com-access.log*` |
| Anything Nginx writes that mentions access           | `*access*`                |

The trailing `*` is what catches the rotated archives (`access.log.1`, `access.log.2.gz`, …).
{% endstep %}

{% step %}
**Schedule and backfill**

* **Interval** — Hourly / Every 6 hours / Daily *(default Daily)*. Daily is enough for most sites; pick Hourly if you need near-realtime AEO monitoring.
* **Initial backfill** — Last 7 days, **Last 30 days** *(recommended)*, Last 90 days, or Everything available. This decides how far back the first run looks; later runs only pick up new entries.

{% hint style="warning" %}
The backfill cutoff is **permanent for this source**. Files older than the cutoff are never fetched, even on a future "Run now". If you need older history later, upload those archives manually instead.
{% endhint %}
{% endstep %}

{% step %}
**Test connection and save**

Click **Test connection**. SEO Utils opens the connection, lists matching files, and samples the newest one to confirm the format is supported.

A green "Found N files… Detected format: nginx\_combined" panel means you're good to **Save**. The source then appears in the report's **Sources** tab and the scheduler picks it up within a minute.

<figure><img src="/files/NGYU5Rb8iK3va3DjKJZO" alt=""><figcaption><p>Successful Test connection result with file count and detected format</p></figcaption></figure>

**If Test connection fails, the error usually maps to one of these:**

| Error                    | What it usually means                                            |
| ------------------------ | ---------------------------------------------------------------- |
| `lookup …: no such host` | Trailing whitespace in Host (re-type), or DNS can't resolve it   |
| `i/o timeout`            | Wrong port, or the server's firewall is blocking your IP         |
| `permission denied`      | Wrong password/key, or the username doesn't match the credential |
| `no files matched`       | Remote directory is wrong, or the glob pattern doesn't match     |

{% hint style="info" %}
**About the host-key check (SFTP only):** on first connect SEO Utils records the server's SSH fingerprint. If that fingerprint changes on a future run (unusual), SEO Utils blocks the run as a safety measure — that pattern can indicate someone intercepting your connection. If you legitimately rebuilt the server, delete and re-add the source.
{% endhint %}
{% endstep %}
{% endstepper %}
{% endtab %}
{% endtabs %}

## Managing sources

Each source row has a status badge and three actions.

| Badge                 | Meaning                                  |
| --------------------- | ---------------------------------------- |
| **Pending first run** | Saved but never run yet                  |
| **Running**           | Actively fetching (with a spinner)       |
| **OK**                | Last run succeeded                       |
| **Failing (N)**       | N consecutive failures. Auto-pauses at 5 |
| **Paused**            | Disabled                                 |

* **Run now** — fire immediately, ignoring the schedule.
* **Pause / Resume** — toggle on/off. Resuming clears the failure counter.
* **Delete** — removes the config and its keychain credentials. Historical imports stay; aggregates aren't touched.

<figure><img src="/files/5YiljNv5nh3sLDQIC49d" alt=""><figcaption><p>Sources tab with status badges and per-source actions</p></figcaption></figure>

## Switching between upload and source modes

You can mix both modes on the same report. One thing to know:

* **Rotated archives are safe.** Both paths key dedup on `(report_id, SHA256 of first 20 lines)`. A manual upload of `access.log.5.gz` plus the source scanning the same file → second one is skipped.
* **The growing `access.log` is the trap.** It uses byte-offset watermarking with a synthetic per-run identifier, so it can't dedup against a manual snapshot of the same content. Uploading a tail of the live file AND connecting a source to the same path will double-count the overlap.

Practical rule: **let the source own the live file.** Use manual uploads for one-off historical archives.

## Classifying newly detected bots

SEO Utils ships with a built-in list of known bots. When your logs contain a bot that isn't on it, the bot is added automatically with a best-guess category and flagged for review. A banner appears at the top of the report asking you to confirm.

Getting these right matters: the category decides which AI View bucket the bot's traffic lands in (AI Answer, AI Assistant, AI Training, Search…), so your AEO charts are only as accurate as these classifications.

<figure><img src="/files/lMVPc84VbbqhcyavnDbR" alt=""><figcaption><p>New bots banner with Review all and Copy bot names buttons</p></figcaption></figure>

Each bot gets one of these categories:

| Category          | Examples                           |
| ----------------- | ---------------------------------- |
| AI Answer engines | PerplexityBot, OAI-SearchBot       |
| AI Assistants     | ChatGPT-User, Claude-User          |
| AI Training       | GPTBot, CCBot, Bytespider          |
| Search engines    | Googlebot, Bingbot                 |
| Social            | Facebook, Twitter/X link previews  |
| SEO tool          | AhrefsBot, SemrushBot              |
| Monitoring        | Uptime checkers, security scanners |
| Other             | Everything else                    |

For a handful of bots, pick a category per row in the banner and click **Confirm**. For a large batch, click **Review all** to open a dialog that lists every pending bot at once.

### Reviewing in bulk with AI help

The fastest way to classify dozens of bots is to let an AI assistant do the first pass:

{% stepper %}
{% step %}

#### Open the review dialog

Click **Review all** on the banner. The dialog lists every pending bot with its current best-guess category.
{% endstep %}

{% step %}

#### Copy the AI prompt

Click **Copy AI prompt**. This copies a ready-made prompt containing the category list and all bot names in the expected answer format.

Paste it into ChatGPT, Claude, or any AI assistant.
{% endstep %}

{% step %}

#### Paste the answer back

Copy the AI's reply, paste it into the **Paste AI answer** box, and click **Apply to list**.

SEO Utils matches each line to a bot and pre-selects its category. A summary shows how many lines were applied; lines that couldn't be matched are listed so you can handle those bots manually.

<figure><img src="/files/6aauVVouEbwsKmM9tplC" alt=""><figcaption><p>Review dialog after applying a pasted AI answer</p></figcaption></figure>
{% endstep %}

{% step %}

#### Adjust and confirm

Scroll the list, correct anything the AI got wrong, then click **Confirm all**. The whole batch is saved and the banner clears.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
Prefer to work in your own spreadsheet or chat? **Copy bot names** (on the banner and in the dialog) copies all pending bot names, one per line, without the prompt wrapper.
{% endhint %}

Clicking **Dismiss** hides the banner for now; unreviewed bots reappear the next time you open the report.

## The report dashboard

Each report has six tabs.

| Tab                     | What it shows                                                            |
| ----------------------- | ------------------------------------------------------------------------ |
| **AI View** *(default)* | AEO/GEO panels — see below                                               |
| **Overview**            | Summary metrics, daily activity timeline, status/file-type/device donuts |
| **Bot Details**         | Per-bot activity, error rates, device breakdown                          |
| **Pages**               | Most-crawled pages with per-bot hit counts                               |
| **Sources**             | Connected SFTP/FTP sources (see above)                                   |
| **Advanced**            | Maintenance — see below                                                  |

### AI View

The default tab. A range picker in the report header (default: Last 30 days) drives the windowed panels; two are all-time by design.

<figure><img src="/files/ekVyDTvwTnLqRLGLMCnT" alt=""><figcaption><p>AI View tab with the six AEO/GEO panels</p></figcaption></figure>

#### AI vs Search traffic

Stacked area chart of daily hits by bucket — AI Answer (PerplexityBot, ClaudeBot, OAI-SearchBot…), AI Assistant (ChatGPT-User, Claude-User, Gemini-User), AI Training (GPTBot, CCBot, Google-Extended, Bytespider…), Search (Googlebot, Bingbot…). Watch the AI Answer line growing relative to Search — that's the AEO story.

#### Pages fetched by AI answer engines

URLs hit by `ai_answer` bots, with per-bot breakdown, last AI visit, and an expandable "top queries" cell. Sortable by total hits, last hit, or error rate.

#### Top queries routing AI to your site

Grouped by extracted query string, with the dominant bot and top landing pages per query.

<figure><img src="/files/SxEUEtHpreqgqBme9ig7" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Why this list might look short:** SEO Utils can only extract queries from bots that share them in the `Referer` header — Perplexity, You.com (YouBot), Phind. ChatGPT-User, Claude-User, and Gemini-User intentionally strip prompt data, so their hits never produce a query row. A low total is normal if your AI traffic is mostly OpenAI/Anthropic assistants.
{% endhint %}

#### Stale for AI / AI-only interest *(all-time)*

<figure><img src="/files/7sYupfubUpFydcWwTJ6E" alt=""><figcaption></figcaption></figure>

* **Stale for AI** — pages Googlebot has crawled recently where AI bots are 7+ days behind or have never visited. Content AI engines may be missing.
* **AI-only interest** — pages AI bots crawl that Googlebot rarely touches. Long-tail content AI is finding that traditional search is deprioritising.

#### Per-bot error rates

<figure><img src="/files/Ti4UukmJ9yxyxvkg8Utw" alt=""><figcaption></figcaption></figure>

Status-class matrix per AI bot: 2xx / 3xx / 4xx / 5xx + computed error rate. A 4xx/5xx spike means AI engines are seeing broken pages — those errors poison their answers about your site.

#### Robots.txt compliance

<figure><img src="/files/ofMlInHNt4v68ggInRzQ" alt=""><figcaption></figcaption></figure>

Per-AI-bot table showing whether each bot is allowed at `/`, total hits in the window, and how many of those hits violated a `Disallow` rule.

| `allowed` | `violations` | Meaning                                    |
| --------- | ------------ | ------------------------------------------ |
| true      | 0            | Welcome and behaving                       |
| false     | 0            | Opted out and respecting it ✓              |
| false     | > 0          | **Ignoring your `Disallow`** — investigate |

Your `robots.txt` is fetched from `https://{your-domain}/robots.txt` once per 24h and cached on the report.

### Overview, Pages, Bot Details

The classic dashboard, broken across three tabs.

#### Summary cards

Total requests, unique bots, error rate, and average response time. Response time is "N/A" if your server isn't logging it — add `%D` to Apache `LogFormat` or `$request_time` to Nginx `log_format`.

<figure><img src="/files/CVY5Ww0ROWPK9pDhXUu3" alt=""><figcaption><p>Summary cards</p></figcaption></figure>

#### Bot activity timeline

Daily volume per bot — useful for spotting crawl-rate changes after a content update or robots.txt change.

<figure><img src="/files/rSzDn9Z5up03Qrx6JKyl" alt=""><figcaption><p>Bot activity timeline</p></figcaption></figure>

#### Distribution donuts

Status codes, file types, and devices at a glance. If images / CSS / JS dominate file types, your crawl budget is being burned on assets — block them in `robots.txt` for AI bots.

<figure><img src="/files/kq5V3NcmVVuHW4uwbGy3" alt=""><figcaption><p>Status / file type / device donuts</p></figcaption></figure>

#### Most crawled pages *(Pages tab)*

Sorted by crawl frequency, with per-bot hit columns and "Every N minutes" cadence labels. High-frequency pages are your most valuable surface — make sure AI bots are in the per-bot mix.

<figure><img src="/files/v20fqCS3k0u5BfrmPCGr" alt=""><figcaption><p>Most crawled pages</p></figcaption></figure>

#### Per-bot detail *(Bot Details tab)*

Pick any bot to see its requests, status-class breakdown, devices, and a per-day trend.

<figure><img src="/files/2Zx8L0oZdBjt2Pefmd6S" alt=""><figcaption><p>Per-bot detail</p></figcaption></figure>

#### Inconsistent status alerts

If a page returns different status codes across requests, an alert appears with a "View Details" link. Common causes: load-balancer or CDN misconfiguration, intermittent 503s under load, dynamic 404/200 conflicts. Fix the root cause, then re-import to confirm.

<figure><img src="/files/1cMFTuH43yMD7odvOiiQ" alt=""><figcaption><p>Inconsistent status code alert</p></figcaption></figure>

### Advanced

Two cards.

* **Optimize historical data** — visible only on reports created before the AI/LLM upgrade (`bucket_schema_version = 0`). Click **Rebuild bucket columns** to backfill the denormalised AI Answer / Assistant / Training / Search hit columns. The AI View works without this — it falls back to a live join — but rebuilding is faster on long date ranges. Idempotent; the button disappears once complete.
* **Danger zone — Delete report** — removes the report and everything attached: aggregates, log import history, sources, AI-request rows, and the keychain credentials those sources used. Cannot be undone.

## Exporting tables to CSV

Most analytical tables have an **Export CSV** button in their header. Exports honour the active date range and the table's current sort. Paginated tables export every row, not just the visible page. Filenames default to `{domain}-{table}-{YYYY-MM-DD}.csv`.

| Tab     | Tables with Export CSV                                                                                                      |
| ------- | --------------------------------------------------------------------------------------------------------------------------- |
| AI View | Pages fetched by AI answer engines, Top queries, Per-bot error rates, Robots.txt compliance, Stale for AI, AI-only interest |
| Pages   | Most Crawled Pages                                                                                                          |

## Tips for LLM SEO

* Aim for an overall error rate under 5%. AI bots don't retry as aggressively as search engines.
* Keep response times under 500ms — slow servers shrink crawl budget.
* Don't block AI bots in `robots.txt` unless you mean to. Once blocked, your content can't influence their answers.
* If AI Answer traffic is flat while Search keeps growing, something on your site is blocking AI specifically — check `robots.txt`, firewall rules, and bot user-agent allowlists.
* Re-import logs weekly so trends and freshness signals stay fresh. Or connect a source and forget about it.


# White-labeled Client Report

This feature lets you generate a white-labeled client report. You can customize it with your company logo, domain, and even add a password for security. Simply share the link with your client so they can view their ranking data directly.

{% hint style="info" %}
**Note:** *This is an optional feature, available in* [v1.29.0 or above](http://help.seoutils.app/changelog#v1.29.0).
{% endhint %}

{% hint style="success" %}
**Shared report demo:** <https://share.seoutils.app/gb/920d3d27-49b1-4a05-9436-b1087e633ec7/timeline>
{% endhint %}

### How Does It Work?

When you enable sharing on a report, SEO Utils will automatically sync it to the cloud and generate a shareable link. You can send this link to your client or [embed the report](#embed-report) directly on your website or dashboard.

<figure><img src="/files/Ambx1sH5Wfh8uZcFWtFM" alt=""><figcaption><p>Enable sharing on a report.</p></figcaption></figure>

### Register a Cloud Database

To share reports via the cloud, you’ll need to register a cloud database. Just head over to <http://share.seoutils.app/register> to create an account.

Once you’re registered, go to your [SEO Utils Share Dashboard](https://share.seoutils.app/dashboard) and subscribe to the “Shareable Report Link” plan to enable cloud sharing.

<figure><img src="/files/wMDA4POotUgSzjCMQAZu" alt=""><figcaption><p>Subscribe to the "Shareable Report Link" plan.</p></figcaption></figure>

#### **Why is there an extra monthly fee for this feature?**

This feature is completely optional. You only need it if you want to share cloud-hosted reports with your clients. Without it, you can still use SEO Utils as usual with no limitations.

The extra fee covers the cost of securely storing and delivering your reports from a cloud database. It’s the minimum amount needed to help me maintain the service and cover cloud provider costs.

#### Create an API key

To start sharing your reports, you’ll need to create an API key.

1. Go to API Tokens from the user menu in the left sidebar, or visit: <https://share.seoutils.app/user/api-tokens>

<figure><img src="/files/6m9MBagc4QLYqdu1bG6Q" alt=""><figcaption><p>Visit the API Tokens page.</p></figcaption></figure>

2. Enter a name for your API key and click Create.

<figure><img src="/files/wqCCYLfAyTMqEpn8sOCu" alt=""><figcaption><p>Create an API key</p></figcaption></figure>

3. Copy the generated API token.

Next, open the **SEO Utils desktop app**:

4. Go to the Services page in the left sidebar. Scroll down to **Shareable Report Settings**.
5. Paste the API token into the field labeled “**SEO Utils Shareable API Key**”.

<figure><img src="/files/8evSZNXbUBQqoiLyUB3X" alt=""><figcaption><p>Paste the API key in the SEO Utils app.</p></figcaption></figure>

That’s it! 🎉 You’re now ready to share your reports with clients.

### Share GMB Rank Tracker Reports

To share a GMB Rank Tracker report in the SEO Utils desktop app:

1. Open the report you want to share.

<figure><img src="/files/CpZiwYSf9dgnhLxbJHyT" alt=""><figcaption><p>Access the "Share" action.</p></figcaption></figure>

2. Click the Actions dropdown and select the "**Share**" action. This will open the Share Report modal:

<figure><img src="/files/vTE2MZMHcnxrhapRxdCC" alt=""><figcaption><p>Share Report modal</p></figcaption></figure>

Toggle the “**Share Report**” switch to enable or disable sharing for that specific report.

You can also set a password to protect the report. Your client will need to enter this password to view the report.

{% hint style="warning" %}
If password protection is enabled, the [embed code](#embed-report) will be disabled.
{% endhint %}

That’s it! You’re all set. From now on, whenever your report is run or updated, the data will automatically sync to the cloud database.

You can also trigger a manual run by selecting the "**Sync Current Snapshot**" action. It will start the sync for the selected snapshot.

<figure><img src="/files/xOzgKj7Mxf31hbsCnPQm" alt=""><figcaption><p>Trigger a manual sync for the selected snapshot.</p></figcaption></figure>

#### Add Google Maps API key

To display Google Maps in your shared report, you’ll need to add a **Google Maps API key**.

{% hint style="success" %}
**Important:** You should use a different API key from the one you use in the SEO Utils app. This key will be public, so it’s important to restrict it to prevent unauthorized use.
{% endhint %}

1. Please follow [this guide to enable the **Maps JavaScript API**](https://help.seoutils.app/guide/google-my-business-rank-tracker#setup-the-google-places-api)**.** If you have already enabled it in your project, you can just create a new API key (Step 8).
2. After creating a new API key, please edit it:
   1. Under **Application restrictions**, select **Websites**.
   2. Add `share.seoutils.app` to the list.

{% hint style="info" %}
If you use a [custom domain](#custom-domain), you want to add that domain to the list as well.
{% endhint %}

<figure><img src="/files/xvAUpPX61jnKhNQkSLTl" alt=""><figcaption><p>Add website restrictions.</p></figcaption></figure>

3. *(Optional but recommended)* Under **API restrictions**, allow access to only the **Maps JavaScript API**. This setup ensures your API key is safe and only used for displaying maps in shared reports.

<figure><img src="/files/6nF6MVBGoYzGsHHtBYWw" alt=""><figcaption><p>Only allow Maps Javascript API.</p></figcaption></figure>

Last step, visit the **Settings** page on <https://share.seoutils.app/> and enter the created API key under the **Google Maps** section.

<figure><img src="/files/J4HRjA5CyHvj2IaIT5Ry" alt=""><figcaption><p>Enter the created Google Maps API key.</p></figcaption></figure>

### Share Organic Rank Tracker Reports

Coming soon...

### Embed Report

To get the embed code:

1. Visit <https://share.seoutils.app/> and edit the report you want to embed.

<figure><img src="/files/Wr0fnnJicJveAQriVmOW" alt=""><figcaption><p>Get the report embed code.</p></figcaption></figure>

2. *Optional:* Choose the snapshot and keyword you’d like to display by default on initial load.
3. Copy the generated embed code and paste it anywhere—your website, dashboard, or client portal.

<figure><img src="/files/dtMQRFoT2DgN90yffgap" alt=""><figcaption><p>Copy the embed code.</p></figcaption></figure>

{% hint style="warning" %}
The embed code doesn't work if you enable the password protection for the report.
{% endhint %}

### Add Your Custom Logo & Company Website

You can personalize your shared reports by adding your company logo and website. Just head over to the **Company Settings** page on <https://share.seoutils.app/>

<figure><img src="/files/QvGxhdAvNJ7B1ej0mXZE" alt=""><figcaption><p>Add your own logo and website URL.</p></figcaption></figure>

{% hint style="success" %}
SEO Utils will use your company logo and website URL for all shared reports by default. If you’d like to **customize the logo and website URL for a specific report**, simply edit that report and upload a custom logo or enter a different website URL.
{% endhint %}

### Custom Domain

Coming soon...


# Embedding Database

The **Embedding Database** feature lets you convert text into mathematical representations (embeddings) that capture semantic meaning. SEO Utils uses these embeddings to find similar content, group related topics, and perform intelligent analysis—even when the exact words don't match.

<div data-full-width="true"><figure><img src="/files/wQYviT6MS8xhK8zfbOeH" alt=""><figcaption><p>Embedding Settings</p></figcaption></figure></div>

With embeddings, you can discover that "best coffee shops NYC" and "top cafes in New York" are semantically similar, enabling smarter content grouping and analysis.

### Why Use Embeddings?

Traditional keyword matching only finds exact or partial text matches. Embeddings understand **meaning**, allowing SEO Utils to:

* Group semantically related search queries
* Find content gaps and opportunities
* Build topical clusters based on actual intent
* Analyze content relationships beyond keywords

### Supported Providers & Models

SEO Utils supports both **paid cloud models** and **free local models**, giving you flexibility based on your needs and budget.

**Cloud Models (OpenAI)**

* [**Text Embedding 3 Small**](https://platform.openai.com/docs/models/text-embedding-3-small)**:** Multilingual, highly efficient, 5x cheaper than ada-002. 1536 dimensions, 8191 max tokens ($0.02 per 1M tokens)
* [**Text Embedding 3 Large**](https://platform.openai.com/docs/models/text-embedding-3-large)**:** Multilingual, best accuracy, 54.9% MIRACL score. 3072 dimensions, 8191 max tokens ($0.13 per 1M tokens)

**Local Models (Ollama - Free)**

* [**Nomic Embed Text v1.5**](https://ollama.com/library/nomic-embed-text)**:** English-focused, surpasses OpenAI ada-002 & text-embedding-3-small, local & free. 768 dimensions, 8192 max tokens
* [**Nomic Embed Text v2 MoE (Q6\_K)**](https://ollama.com/toshk0/nomic-embed-text-v2-moe)**:** Multilingual (\~100 languages), MoE architecture, 65.8 MIRACL score, local & free. 768 dimensions, 512 max tokens
* [**Snowflake Arctic Embed v1**](https://ollama.com/library/snowflake-arctic-embed)**:** English-only, 334M BERT, optimized for retrieval, local & free. 1024 dimensions, 512 max tokens
* [**Snowflake Arctic Embed v2**](https://ollama.com/library/snowflake-arctic-embed2)**:** Multilingual, 567M BERT, beats text-embedding-3-large on MTEB, MRL compression, local & free. 1024 dimensions, 8192 max tokens
* [**mxbai-embed-large**](https://ollama.com/library/mxbai-embed-large)**:** English-only, 334M BERT, SOTA for its size, beats text-embedding-3-large, local & free. 1024 dimensions, 512 max tokens
* [**BGE-M3 (BAAI)**](https://ollama.com/library/bge-m3)**:** Multilingual (100+ languages), 567M XLM-RoBERTa, dense+sparse+colbert retrieval, local & free. 1024 dimensions, 8192 max tokens

{% hint style="success" %}
**Understanding Dimensions**

Embedding dimensions represent the size of the vector that stores semantic information. Think of it like image resolution—higher dimensions can capture more detail, but with tradeoffs:

* **768 dimensions**: Fast and efficient, perfect for most keyword clustering and query grouping
* **1024 dimensions**: Balanced performance, better for multilingual content and complex queries
* **1536-3072 dimensions**: Maximum semantic detail, but requires more storage and slower searches

For most SEO tasks, 768-1024 dimensions provide excellent results. Higher dimensions are only needed for highly nuanced semantic analysis or when working with very similar content that requires fine-grained distinctions.
{% endhint %}

{% hint style="info" %}
Local models run entirely on your computer—no API costs, no data sent to external servers. Perfect for privacy-conscious users or those processing large volumes of data.
{% endhint %}

### Enable Embedding Database

To start using embeddings, head to the left sidebar and click on "**Settings**," then navigate to "**Embedding**".

<figure><img src="/files/t6fvk61Uqv3LzuOExO7g" alt=""><figcaption><p>Access Embedding Settings</p></figcaption></figure>

Next, toggle the "**Enable Embeddings**" master switch to activate the embedding system.

<figure><img src="/files/UjgOMTlnwYB7m9c3u7r9" alt=""><figcaption><p>Enable the embedding database</p></figcaption></figure>

Once enabled, you'll see available features that can use embeddings. Each feature can use a different model based on your requirements.

#### For Cloud Models (OpenAI)

1. Ensure you have your OpenAI API key configured in the Services page

<figure><img src="/files/VbRjjaEL9S62IbpGohIn" alt="" width="563"><figcaption></figcaption></figure>

2. Select "OpenAI" as the provider
3. Choose your preferred model (Text Embedding 3 Small recommended for most use cases)

#### For Local Models (Ollama)

1. Install Ollama on your computer from [ollama.com](https://ollama.com)
2. Open Terminal and pull the model you want to use:

   ```bash
   ollama pull nomic-embed-text
   ```

<figure><img src="/files/xW9p6BcL4Qbq01gweC6j" alt="" width="563"><figcaption></figcaption></figure>

3. Ensure Ollama is running (it runs in the background by default)
4. Select "Ollama" as the provider
5. Choose from installed models (unavailable models will be disabled)

<figure><img src="/files/AxW73DwOSpEeiB99COOb" alt=""><figcaption><p>Choose embedding model for each feature</p></figcaption></figure>

### How Embeddings Are Stored

SEO Utils stores all generated embeddings in your local database. Once content is embedded, it won't be re-embedded again—saving API costs, processing time, and computational resources. This means you can experiment with different similarity thresholds and search queries without regenerating embeddings each time.

### Understanding Similarity Scores

When using semantic search in most of the semantic tools, you'll work with **similarity score thresholds** that control how closely items must match:

* **Score range**: -1 to 1 (where 1 = identical meaning, 0 = unrelated, -1 = opposite meaning)
* **Finding the right threshold**: Each model and dataset combination requires different thresholds
* **Ollama models**: Typically need 0.8–0.9 for good matches with SEO data
* **OpenAI models**: Often work well with 0.7–0.9 (higher dimensions allow slightly lower thresholds)
* **Fine-tuning tip**: Use precise decimals (0.810, 0.825, 0.835) to find the sweet spot for your specific data

<figure><img src="/files/4zSehos5byJ9m1mecQTA" alt=""><figcaption><p>Similarity threshold is used in the Topic Cluster tool of the Google Search Console Queries.</p></figcaption></figure>

### Available Features

Currently, SEO Utils uses embeddings for:

#### **1. Google Search Console Queries -** [**Topic Clusters**](/guide/google-search-console/topic-clusters)**:**

Generate embeddings for your search queries to enable semantic clustering. Group related queries by topic to analyze their collective performance.

{% hint style="success" %}
**Coming Soon**

* Internal Linking Suggestions
* Topical Map Builder
* Semantic Clustering v3
  {% endhint %}

### How to Choose the Right Model

#### **By Budget & Privacy:**

* **Zero cost + Maximum privacy:** Use Ollama models (all processing stays on your computer)
* **Pay-as-you-go + Fast processing**: Use OpenAI models (data sent to OpenAI servers)
* **Large volume processing**: Local models save money long-term despite slower speed

#### **By Language Requirements:**

* **English-only content**: Nomic Embed Text v1.5 (768D) or mxbai-embed-large (1024D)
* **Multilingual content**: BGE-M3 or Snowflake Arctic Embed v2 (both support 100+ languages)
* **Mixed content**: Text Embedding 3 Small offers good multilingual support with cloud speed

#### **By Computer Specs:**

* **Limited RAM (8GB)**: Use cloud models or stick to smaller embedding models (768D requires \~150MB per model)
* **Standard specs (16GB RAM)**: Can run all embedding models comfortably (1024D models need \~400MB)
* **Power users (32GB+ RAM)**: Run multiple models simultaneously or process large batches locally
* **Apple Silicon (M1/M2/M3/M4)**: 3-5x faster than CPU-only, with M3/M4 delivering best performance for local models

#### **By Use Case Complexity:**

* **Basic keyword clustering**: 768D models (Nomic Embed Text) are sufficient
* **Topic clustering & semantic search**: 1024D models provide better accuracy
* **Fine-grained content analysis**: Consider 1536D+ models for nuanced distinctions
* **Large query volumes (10,000+)**: Prioritize speed—use cloud models or accept longer processing

#### **Quick Recommendations:**

* **Most users**: Start with Nomic Embed Text (free, fast, good quality)
* **Agencies with client data**: Use local models for privacy compliance
* **High-volume operations**: OpenAI Text Embedding 3 Small balances cost and speed
* **Maximum accuracy needed**: Text Embedding 3 Large or BGE-M3


# Automations

### How Does the Automations Tool Work?

SEO Utils allows you to automate actions when rank tracking completes. When an Organic Rank Tracker or Google Business Rank Tracker snapshot finishes, you can automatically export PDFs, send emails to clients, or trigger webhook URLs.

The automation system processes actions sequentially. If one action fails, subsequent actions that don't depend on its output will still run. Only actions requiring output from failed actions will be skipped.

### How to Create an Automation

To get started, head to Automations in the left sidebar. Then, click the Add Automation button.

<figure><img src="/files/YJnOI6ZaxHdf0LsSA5H8" alt=""><figcaption><p>Access the Automations tool in the left sidebar</p></figcaption></figure>

The automation form has three steps:

#### Step 1: Basic Information

* **Name**: Give your automation a descriptive name like "Send GMB Report to Client"
* **Description**: Optional notes about what this automation does
* **Active Status**: Toggle whether the automation should run

#### Step 2: Configure Trigger

Select when the automation should run:

* **Trigger Type**: Choose between Organic Rank Tracker or GMB Rank Tracker completion
* **Run On**: Select "All Reports" or choose specific reports
* **Run Once**: Enable this to run the automation only once per report, preventing duplicate actions like sending multiple emails when re-running the tracker

<figure><img src="/files/LN5Qw2maHRcIqB4adfLZ" alt=""><figcaption><p>Configure the trigger</p></figcaption></figure>

#### Step 3: Define Actions

Add one or more actions that execute in sequence. Each action type has specific configuration options.

### Using Variables in Actions

Variables allow you to use dynamic data from your rank tracking reports. Variables are wrapped in double curly braces `{{variable_name}}`.

Click the **Variables** button in any text field to search and insert variables quickly. You can search by typing keywords like "action 1" or "email" to find relevant variables.

<figure><img src="/files/wBSWf4WqWApilggnmkQB" alt=""><figcaption><p>Use Varaibles Selector button to quickly find and insert variables</p></figcaption></figure>

**GMB Rank Tracker Trigger Variables:**

* `{{trigger.reportID}}` - ID of the GMB rank tracker report
* `{{trigger.reportType}}` - Type of report (google-business-rank-tracker)
* `{{trigger.fromDate}}` - Date of the comparison snapshot (based on automation's comparison days setting)
* `{{trigger.toDate}}` - Date of the current snapshot that triggered this automation
* `{{trigger.ranOn}}` - Date when the snapshot was created
* `{{trigger.snapshotID}}` - ID of the current snapshot
* `{{trigger.businessName}}` - Business name being tracked
* `{{trigger.address}}` - Business address
* `{{trigger.comparisonDays}}` - Number of days between snapshots

### Example: GMB Report Email Automation

Here's a practical template for automatically sending GMB ranking reports to clients:

#### Action 1: Export PDF

* **Action Type**: Export PDF
* **Export Folder**: `/Users/yourname/Downloads` (or your preferred folder)

**Output Variables** (automatically available for next actions):

* `exportDate` - Date when the file was exported
* `exportTime` - Full timestamp of export
* `fileName` - Name of the PDF file
* `filePath` - Full path to the exported PDF file
* `fileSize` - Size of the file in bytes

#### Action 2: Send Email

* **Action Type**: Send Email
* **SMTP Credential**: Select your configured credential or leave empty for default
* **Recipients**: `client@example.com`
* **CC Recipients**: *(optional)*
* **Email Subject**: `GMB Rankings Report - {{trigger.businessName}} - {{trigger.ranOn}}`
* **Email Body**:

```
Hi,

Your Google Business ranking report for {{trigger.businessName}} is ready.

Comparison Period: {{trigger.fromDate}} to {{trigger.toDate}}
Location: {{trigger.address}}

The detailed report is attached to this email.

Best regards,
Your SEO Team
```

* **Attachments**: Use the Variables button to insert the file path from Action 1. It will look like: `{{action.act_[actionId].filePath}}`

{% hint style="info" %}
**Tip**: The action ID (like `act_1757983518769_inus10vs5`) is automatically generated when you create the action. Use the Variables button to easily insert the correct reference without typing it manually.
{% endhint %}

<figure><img src="/files/FP9cDoC65GJUghFpfLzz" alt=""><figcaption><p>Configure multiple actions to run in sequence</p></figcaption></figure>

{% hint style="info" %}
**Important**: To send emails, you must first configure SMTP credentials. See [SMTP Credentials](/guide/smtp-credentials) Setup for instructions.
{% endhint %}

### Monitoring Automation History

The Automation detail page shows comprehensive execution history:

#### Execution Statistics

* **Total Runs**: How many times the automation has triggered
* **Successful/Failed/Partial**: Breakdown of execution results

#### Execution History Tab

View each automation run with:

* **Status**: Completed, Failed, or Partial (some actions failed)
* **Duration**: How long the automation took
* **Actions**: Number of actions executed
* **Trigger Data**: The snapshot or report that triggered it

<figure><img src="/files/fw8UMMKMaTIPfswDz8Hi" alt=""><figcaption><p>Monitor automation execution history and retry failed actions</p></figcaption></figure>

### Retrying Failed Automations

When an automation fails or partially completes, you have two retry options:

1. Click the **vertical three dots** next to the execution
2. Choose your retry method:
   * **Retry All Actions**: Runs the entire automation from the beginning
   * **Retry Failed & Cancelled Actions**: Only retries actions that failed or were cancelled
3. The system will:
   * For "Retry All": Execute all actions from the start
   * For "Retry Failed & Cancelled": Skip completed actions and only retry failed/cancelled ones
   * Use the **original trigger data** (not current automation settings)

### Execution & Action Status Types

#### Automation Execution Status

* **Running**: Automation is currently executing
* **Success**: All actions completed successfully
* **Failed**: All actions failed
* **Partial**: Some actions succeeded, others failed or cancelled

#### Individual Action Status

* **Running**: Action is currently executing
* **Completed**: Action executed successfully
* **Failed**: Action encountered an error
* **Cancelled**: Action was stopped before completion


# MCP Server (AI Integration)

The MCP Server lets you connect AI assistants like Claude Desktop, Claude Code, or any MCP-compatible client to your SEO data. Ask questions in plain English and get instant answers — no need to navigate dashboards or export reports manually.

<div data-full-width="true"><figure><img src="/files/mcnTpNdY4Hr8kQkCDVib" alt=""><figcaption><p>MCP Server settings in SEO Utils</p></figcaption></figure></div>

{% hint style="info" %}
MCP (Model Context Protocol) is an open standard that lets AI assistants connect to external data sources. SEO Utils runs an MCP server locally on your machine — your data never leaves your computer.
{% endhint %}

### Example Reports Generated by MCP

These reports were generated entirely by the MCP Server — one prompt, zero manual work:

* [**Laravel.com Complete SEO & Backlink Report**](https://app.seoutils.app/laravel-complete-seo-report) — Traffic analytics, keyword rankings, backlink profile, competitor analysis, and trend charts in one interactive dashboard.
* [**SEO Health Report for tuikhoeconban.com**](https://app.seoutils.app/seo-health-report-tuikhoeconban) — Google Search Console audit with CTR opportunities, keyword cannibalization, zero-click queries, and prioritized recommendations.

## What Can You Do With It?

| Use Case                     | Example Prompt                                                                                                                                                                     |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Generate reports**         | "Generate a weekly SEO report for example.com"                                                                                                                                     |
| **Find weak pages**          | "Find pages with high impressions but low CTR"                                                                                                                                     |
| **Keyword cannibalization**  | "Which keywords have multiple pages competing?"                                                                                                                                    |
| **Ranking trends**           | "Show me my biggest ranking winners and losers this month"                                                                                                                         |
| **Content gaps**             | "Find queries I'm ranking for but don't have dedicated pages"                                                                                                                      |
| **Local SEO**                | "Generate a local SEO report for my business"                                                                                                                                      |
| **Multi-location analytics** | "Compare my Haidilao hot pot rankings across all locations"                                                                                                                        |
| **Client reports**           | "Create a professional client-ready report for example.com"                                                                                                                        |
| **Keyword research**         | "Check keyword metrics for: seo tools, rank tracker"                                                                                                                               |
| **SERP analysis**            | "What's ranking for 'seo tools' in Google?"                                                                                                                                        |
| **Backlink analysis**        | "Show me the backlinks for example.com"                                                                                                                                            |
| **Content gap**              | "Find keywords competitors rank for but I don't"                                                                                                                                   |
| **Backlink gap**             | "Find sites linking to competitors but not me"                                                                                                                                     |
| **Traffic analytics**        | "Show me the traffic overview for laravel.com"                                                                                                                                     |
| **Organic keywords**         | "What keywords does laravel.com rank for?"                                                                                                                                         |
| **Demographics**             | "Show me population and income data around my business"                                                                                                                            |
| **Bulk analysis**            | "Compare organic traffic for laravel.com, symfony.com, and codeigniter.com"                                                                                                        |
| **NAP Finder**               | "Which domains have the most NAP citations for my business?"                                                                                                                       |
| **Keyword explorer**         | "What are the keyword suggestions for 'keto diet' in the US?"                                                                                                                      |
| **Saved keywords**           | "Create a keyword list called 'Competitors' and add: seo tools, rank tracker"                                                                                                      |
| **Grow rank tracker**        | "Add the top 20 content-gap keywords from my competitor into my example.com rank tracker"                                                                                          |
| **Clean up rank tracker**    | "Remove these irrelevant keywords from my example.com rank tracker: foo, bar, baz"                                                                                                 |
| **Automations**              | "Create an automation that exports PDF when my rank tracker finishes"                                                                                                              |
| **Indexing health**          | "How many of my pages are indexed? Which directories have the worst indexing rate?"                                                                                                |
| **Indexing diagnostics**     | "Find pages with zero internal links that aren't indexed — orphan pages"                                                                                                           |
| **Internal link analysis**   | "Which pages have the most internal links pointing to them?"                                                                                                                       |
| **AI log analysis**          | "Which AI bots are violating my robots.txt? What questions is Perplexity asking about my site?"                                                                                    |
| **Keyword insights**         | "Which keywords are trending up in my rank tracker?"                                                                                                                               |
| **GA4 conversions**          | "Which pages generate the most conversions from organic search?"                                                                                                                   |
| **Custom queries**           | "How many keywords am I tracking across all reports?"                                                                                                                              |
| **Manage workspaces**        | "Create a new workspace called Client A" or "Rename my Personal workspace to Side Projects"                                                                                        |
| **SEO Tests**                | "Create a split test on example.com comparing /pricing vs /pricing-v2 — 50/50 traffic, hypothesis is the new layout will lift CTR"                                                 |
| **Local rank tracking**      | "Create a GMB rank tracker for Haidilao Hot Pot in Bellevue, WA — 5x5 grid at 500m radius, tracking 'hot pot bellevue' and 'best chinese bellevue', weekly on Mondays 9am Pacific" |
| **AI visibility tracking**   | "Create an LLM rank tracker for my brand Acme (variants: Acme, Acme Inc) tracking 'best crm software' and 'top crm tools' in ChatGPT and Google AI Overview, weekly"               |
| **Review monitoring**        | "Start tracking the Google reviews for Haidilao Hot Pot Bellevue — pull the 200 most recent reviews and tell me which ones have no owner response"                                 |
| **Citation discovery**       | "Run a NAP Finder for Monsoon Seattle at 615 19th Avenue East, phone (206) 325-2111, then show me which directories cite the business"                                             |
| **Content briefs**           | "Create a content struct for 'keto meal plan', wait for the analysis, then generate an AI outline with GPT and write an article draft from it"                                     |
| **Keyword clustering**       | "Cluster these 50 keto keywords by SERP similarity and tell me how many pages I need to cover them — use the DataForSEO SERP API"                                                  |
| **Entity analysis**          | "Run an NLP analysis on my keto guide and my competitor's page with TextRazor — which entities do they cover that I don't?"                                                        |

The MCP server gives the AI read-only access to your database, can fetch live data from external APIs (keyword metrics, SERP results, backlinks), and can manage your saved keyword lists.

## Requirements

* A valid SEO Utils license key
* MCP Access (one-time purchase)
* For Claude Desktop: Node.js installed (used by the mcp-remote bridge)

## Setting Up the MCP Server

{% stepper %}
{% step %}
**Purchase MCP Access**

Go to **Settings → Services** and scroll down to the **MCP Server (AI Integration)** section. Click **"Purchase MCP Access"** to complete the one-time purchase via Stripe.

<figure><img src="/files/PJnM3T4SxRQldkoY4Gry" alt=""><figcaption><p>Purchase MCP Access button in Settings</p></figcaption></figure>

Alternatively, you can purchase MCP access directly from your browser at [app.seoutils.app/mcp/purchase](https://app.seoutils.app/mcp/purchase) — enter your license key and complete the checkout.

{% hint style="info" %}
MCP access is a one-time purchase with unlimited updates — no subscription. It's tied to your license key, works on all devices associated with your license, and cannot be transferred. An active (non-expired) SEO Utils license is required.
{% endhint %}
{% endstep %}

{% step %}
**Refresh Purchase Status**

After completing your purchase, go back to **Settings → MCP Server** and click the **"Refresh"** button to verify your purchase. This confirms your MCP access is active.

<figure><img src="/files/NGTdYZv54ooVDHRE4FzQ" alt=""><figcaption><p>Click Refresh to verify your purchase</p></figcaption></figure>
{% endstep %}

{% step %}
**Enable the MCP Server**

Once your purchase is verified, toggle **"Enable MCP Server"** to start the server. You should see the status change to **Running (port 19515)**.

<figure><img src="/files/E1V6Ji1y88Slur0Ym4Mb" alt=""><figcaption><p>MCP Server enabled and running</p></figcaption></figure>
{% endstep %}

{% step %}
**Connect to Claude**

Choose one of the three connection methods described below.
{% endstep %}
{% endstepper %}

## Connecting to AI Assistants

Pick the method that matches your setup:

| Method                                                              | Best for               | Requires Node.js? | Requires public URL?    |
| ------------------------------------------------------------------- | ---------------------- | ----------------- | ----------------------- |
| **Claude Desktop — Auto Install**                                   | Most users             | Yes               | No                      |
| **Claude Code**                                                     | Developers             | No                | No                      |
| **OpenAI Codex (App, CLI, IDE)**                                    | Developers             | No                | No                      |
| **Google Antigravity**                                              | Developers             | Yes               | No                      |
| **OpenClaw**                                                        | Self-hosted AI users   | Yes               | No                      |
| **Perplexity (Mac)**                                                | Perplexity users       | Yes               | No                      |
| **ChatGPT Desktop**                                                 | ChatGPT users          | No                | No (with tunnel) or Yes |
| **Claude Web / ChatGPT Web / Perplexity (Remote) / n8n / Make.com** | Cloud tools, VPS users | No                | Yes (HTTPS)             |

<details>

<summary>Claude Desktop (Recommended)</summary>

**One-Click Install** — works with both Claude Desktop and Cowork (desktop version). Connects locally — no public URL needed.

1. Install [**Node.js**](https://nodejs.org) (LTS version) if you haven't already
2. In the MCP Server settings, click the **"Auto Install"** tab
3. Click **"Install in Claude Desktop"**
4. **Restart Claude Desktop** to apply changes

You'll see SEO Utils appear under **Settings → Connectors** in Claude Desktop.

{% hint style="warning" %}
**Node.js is required.** Claude Desktop can only connect to local MCP servers using a bridge tool called `mcp-remote`, which runs on Node.js. Without it, the install will appear to succeed but Claude Desktop won't be able to connect. Download Node.js from [nodejs.org](https://nodejs.org).
{% endhint %}

{% hint style="info" %}
**Don't want to install Node.js?** Use **Claude Code** instead — it connects directly without any bridge.
{% endhint %}

</details>

<details>

<summary>Claude Code</summary>

**No Node.js required** — Claude Code connects directly to the MCP server over HTTP.

**Option A: One-line command**

Copy the token from the MCP Server settings (**Manual Config** tab), then run:

```bash
claude mcp add --transport http seo-utils http://localhost:19515/mcp \
  --header "Authorization: Bearer YOUR_TOKEN_HERE"
```

**Option B: Add to `.mcp.json`**

1. In the MCP Server settings, click the **"Manual Config"** tab
2. Click **"Copy Config"** to copy the JSON configuration
3. Add it to your project's `.mcp.json`:

```json
{
  "mcpServers": {
    "seo-utils": {
      "url": "http://localhost:19515/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_TOKEN_HERE"
      }
    }
  }
}
```

The actual token is included in the copied config — you don't need to fill it in manually.

**Option C: Import from Claude Desktop** (if already installed there)

```bash
claude mcp add-from-claude-desktop
```

This imports all MCP servers from your Claude Desktop config, including SEO Utils. Mac and WSL only.

</details>

<details>

<summary>OpenAI Codex (Desktop App, CLI &#x26; IDE Extension)</summary>

**No Node.js required** — Codex connects to HTTP MCP servers directly with bearer token auth. Settings are shared across the Codex desktop app, CLI, and IDE extension because they all read the same `config.toml`.

**Option A: Codex Desktop App (UI)**

1. Open the Codex app and go to **Settings → Integrations & MCP**
2. Click **Add MCP server** and enter:
   * **Name**: `seo-utils`
   * **URL**: `http://localhost:19515/mcp`
   * **Bearer token**: paste the token from SEO Utils **Settings → MCP Server → Manual Config**
3. Save — the connection becomes available immediately. No restart needed.

The desktop app writes these settings to `~/.codex/config.toml`, so the same server automatically becomes available in the Codex CLI and IDE extension too.

**Option B: Codex CLI or IDE Extension (`config.toml`)**

1. Open (or create) the Codex config file:

   * **macOS / Linux**: `~/.codex/config.toml`
   * **Windows**: `%USERPROFILE%\.codex\config.toml`

   In the IDE extension, you can open it from **MCP settings → Open config.toml** in the gear menu.
2. Add the SEO Utils server:

```toml
[mcp_servers.seo-utils]
url = "http://localhost:19515/mcp"
bearer_token_env_var = "SEO_UTILS_MCP_TOKEN"
```

3. Export the token in your shell. Copy the token from SEO Utils **Settings → MCP Server → Manual Config**, then run:

On **macOS / Linux** (add to `~/.zshrc` or `~/.bashrc` to persist):

```bash
export SEO_UTILS_MCP_TOKEN="YOUR_TOKEN_HERE"
```

On **Windows** (PowerShell, persist with `setx`):

```powershell
setx SEO_UTILS_MCP_TOKEN "YOUR_TOKEN_HERE"
```

4. Run `codex` and use `/mcp` in the TUI to confirm SEO Utils is connected.

For trusted projects, you can put the `[mcp_servers.seo-utils]` block in `.codex/config.toml` at your project root instead of the global `~/.codex/config.toml`. Config changes are picked up automatically — no restart needed.

**Option C: stdio bridge (requires Node.js)**

If you prefer stdio over HTTP, use the same `mcp-remote` bridge as Claude Desktop:

```bash
codex mcp add seo-utils -- npx -y mcp-remote@latest http://localhost:19515/mcp --header "Authorization: Bearer YOUR_TOKEN_HERE" --allow-http
```

See the [Codex MCP docs](https://developers.openai.com/codex/mcp) for additional options like `startup_timeout_sec`, `enabled_tools`, and `default_tools_approval_mode`.

</details>

<details>

<summary>Google Antigravity</summary>

**Requires Node.js** — Antigravity uses `mcp_config.json` with the same bridge approach as Claude Desktop.

1. Open **Antigravity** → click **"..."** in the Agent Panel → **MCP Servers**
2. Click **Manage MCP Servers** → **Edit configuration** to open `mcp_config.json`
3. Add the SEO Utils server:

**macOS / Linux:**

```json
{
  "mcpServers": {
    "seo-utils": {
      "command": "npx",
      "args": ["-y", "mcp-remote@latest", "http://localhost:19515/mcp", "--header", "Authorization: Bearer YOUR_TOKEN_HERE", "--allow-http"]
    }
  }
}
```

**Windows:**

```json
{
  "mcpServers": {
    "seo-utils": {
      "command": "cmd",
      "args": ["/c", "npx", "-y", "mcp-remote@latest", "http://localhost:19515/mcp", "--header", "Authorization: Bearer YOUR_TOKEN_HERE", "--allow-http"]
    }
  }
}
```

Replace `YOUR_TOKEN_HERE` with the token from SEO Utils Settings → MCP Server → Manual Config.

4. Save the file and **restart Antigravity**
5. Ask the agent "What tools do you have access to?" to confirm the connection

{% hint style="info" %}
Requires [**Node.js**](https://nodejs.org) installed.
{% endhint %}

</details>

<details>

<summary>OpenClaw</summary>

**Requires Node.js** — OpenClaw supports MCP servers natively via `openclaw.json`.

Add the SEO Utils MCP server to your `openclaw.json` config:

**macOS / Linux:**

```json
{
  "mcpServers": {
    "seo-utils": {
      "command": "npx",
      "args": ["-y", "mcp-remote@latest", "http://localhost:19515/mcp", "--header", "Authorization: Bearer YOUR_TOKEN_HERE", "--allow-http"]
    }
  }
}
```

**Windows:**

```json
{
  "mcpServers": {
    "seo-utils": {
      "command": "cmd",
      "args": ["/c", "npx", "-y", "mcp-remote@latest", "http://localhost:19515/mcp", "--header", "Authorization: Bearer YOUR_TOKEN_HERE", "--allow-http"]
    }
  }
}
```

Replace `YOUR_TOKEN_HERE` with the token from SEO Utils Settings → MCP Server → Manual Config.

Restart OpenClaw and the MCP tools will be available to your agents.

{% hint style="info" %}
Requires [**Node.js**](https://nodejs.org) installed.
{% endhint %}

</details>

<details>

<summary>ChatGPT Desktop</summary>

**Via Developer Mode** — ChatGPT Desktop supports MCP servers through Developer Mode (beta). It requires an HTTPS URL, so you'll need a tunnel for local connections.

1. Open **ChatGPT Desktop** → **Settings** → **Advanced settings** → Enable **Developer Mode**
2. Install [Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/downloads/) (free, no account needed):
   * **macOS**: `brew install cloudflare/cloudflare/cloudflared`
   * **Windows**: Download from [cloudflare.com](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/downloads/) and run the installer
   * **Linux**: `wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb && sudo dpkg -i cloudflared-linux-amd64.deb`
3. Start the tunnel to expose your local MCP server:

```bash
cloudflared tunnel --url http://localhost:19515
```

4. Copy the generated HTTPS URL from the terminal output (e.g., `https://xxx.trycloudflare.com`)
5. In ChatGPT, go to **Settings** → **Connectors** → **Create**
6. Enter the connector URL: `https://xxx.trycloudflare.com/mcp`
7. Add the auth header: `Authorization: Bearer YOUR_TOKEN_HERE`

Copy the token from SEO Utils Settings → MCP Server → Manual Config.

{% hint style="warning" %}
**ChatGPT requires HTTPS.** It cannot connect to `http://localhost` directly. The Cloudflare Tunnel must be running whenever you use the MCP server. If you restart the tunnel, you'll get a new URL and need to update the connector.
{% endhint %}

{% hint style="info" %}
Developer Mode requires **ChatGPT Plus, Pro, or Enterprise** plan.
{% endhint %}

</details>

<details>

<summary>Perplexity (Mac — Local)</summary>

**Requires Node.js** — Perplexity Mac app supports local MCP servers via a helper app.

1. Open Perplexity → **Settings** → **Connectors**
2. Install the **PerplexityXPC** helper when prompted
3. Click **Add Connector** → **Simple** tab
4. Set **Server Name** to `SEO Utils`
5. Set the **Command** to:

```
npx -y mcp-remote@latest http://localhost:19515/mcp --header "Authorization: Bearer YOUR_TOKEN_HERE" --allow-http
```

Replace `YOUR_TOKEN_HERE` with the token from SEO Utils Settings → MCP Server → Manual Config.

6. Click **Save** and wait for status to show **Running**
7. Go to Perplexity homepage and toggle your MCP on under **Sources**

{% hint style="warning" %}
**macOS only.** Perplexity local MCP is currently only available on the Mac App Store version. Windows and Linux users need to use the remote MCP option (see "Claude Web / n8n / Make.com" below) with a Cloudflare Tunnel or VPS.
{% endhint %}

{% hint style="info" %}
Requires **Node.js** installed ([nodejs.org](https://nodejs.org)) and a **Perplexity paid plan**.
{% endhint %}

</details>

<details>

<summary>Claude Web / Perplexity (Remote) / n8n / Make.com</summary>

**Requires a publicly accessible HTTPS URL**

Claude Web (claude.ai), Cowork (web version), n8n (cloud), and Make.com cannot connect to `localhost`. You need to make your MCP server accessible over the internet.

**Option A: Cloudflare Tunnel (easiest, free, no VPS needed)**

1. Install [cloudflared](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/downloads/):
   * **macOS**: `brew install cloudflare/cloudflare/cloudflared`
   * **Windows**: Download from [cloudflare.com](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/downloads/) and run the installer
   * **Linux**: `wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb && sudo dpkg -i cloudflared-linux-amd64.deb`
2. Run: `cloudflared tunnel --url http://localhost:19515`
3. Copy the generated `https://xxx.trycloudflare.com` URL
4. In Claude.ai, go to **Settings → Connectors → Add custom connector** and enter the URL with `/mcp` appended

**Option B: VPS with reverse proxy**

If you're running SEO Utils on a VPS:

1. Set up a reverse proxy (Nginx on Linux, [Caddy](https://caddyserver.com) on any OS) with HTTPS pointing to `127.0.0.1:19515`
2. In Claude.ai, go to **Settings → Connectors → Add custom connector**
3. Enter your public URL (e.g., `https://mcp.yourdomain.com/mcp`)

**Option C: Self-hosted n8n on the same machine**

If n8n runs on the same machine as SEO Utils, just use `http://localhost:19515/mcp` directly — no public URL or tunnel needed.

{% hint style="warning" %}
**Cannot connect to localhost from the cloud.** Claude.ai, cloud-hosted n8n, and Make.com run on remote servers and cannot reach your local machine. Use Cloudflare Tunnel or a VPS to make it accessible.
{% endhint %}

{% hint style="info" %}
Custom connectors on Claude.ai require a **Pro or Max plan**.
{% endhint %}

</details>

## Install the SEO Utils Skill (Recommended)

Install our free skill to help your AI assistant choose the right MCP tool automatically. Without it, the AI sometimes calls the wrong tool — for example, fetching third-party API data when you ask about your own rank tracker reports.

The skill uses the open [Agent Skills](https://agentskills.io) format (SKILL.md) and works across all major AI assistants.

<details>

<summary>Claude Desktop / Cowork</summary>

1. [Download the skill ZIP](https://github.com/seoutilsapp/seo-utils-skills/archive/refs/heads/main.zip)
2. In Claude Desktop, go to **Customize → Skills**
3. Click **"+"** → **"Upload a skill"**
4. Upload the downloaded ZIP file
5. Toggle the skill on

</details>

<details>

<summary>Claude Code</summary>

```bash
mkdir -p ~/.claude/skills/seo-utils-mcp-guide
curl -sL https://raw.githubusercontent.com/seoutilsapp/seo-utils-skills/main/Skill.md \
  -o ~/.claude/skills/seo-utils-mcp-guide/SKILL.md
```

</details>

<details>

<summary>OpenAI Codex (Desktop App, CLI &#x26; IDE Extension)</summary>

Codex follows the open Agent Skills standard. Copy the skill to your user-level skills directory:

```bash
mkdir -p ~/.agents/skills/seo-utils-mcp-guide
curl -sL https://raw.githubusercontent.com/seoutilsapp/seo-utils-skills/main/Skill.md \
  -o ~/.agents/skills/seo-utils-mcp-guide/SKILL.md
```

Or for workspace-only: copy to `<your-project>/.agents/skills/seo-utils-mcp-guide/SKILL.md`

The skill is picked up automatically by the Codex desktop app, CLI, and IDE extension — they all scan the same location.

</details>

<details>

<summary>ChatGPT</summary>

1. [Download the skill ZIP](https://github.com/seoutilsapp/seo-utils-skills/archive/refs/heads/main.zip)
2. In ChatGPT, go to **Customize → Skills**
3. Click **"New skill"** → **"Upload from your computer"**
4. Upload the downloaded ZIP file

</details>

<details>

<summary>Perplexity</summary>

1. Download the [Skill.md file](https://raw.githubusercontent.com/seoutilsapp/seo-utils-skills/main/Skill.md)
2. In Perplexity Computer, go to the **My Skills** tab
3. Upload the `Skill.md` file

</details>

<details>

<summary>Google Antigravity</summary>

Copy the skill to your global skills directory:

```bash
mkdir -p ~/.gemini/antigravity/skills/seo-utils-mcp-guide
curl -sL https://raw.githubusercontent.com/seoutilsapp/seo-utils-skills/main/Skill.md \
  -o ~/.gemini/antigravity/skills/seo-utils-mcp-guide/SKILL.md
```

Or for workspace-only: copy to `<your-project>/.agents/skills/seo-utils-mcp-guide/SKILL.md`

</details>

<details>

<summary>OpenClaw</summary>

Copy the skill to your global skills directory:

```bash
mkdir -p ~/.openclaw/skills/seo-utils-mcp-guide
curl -sL https://raw.githubusercontent.com/seoutilsapp/seo-utils-skills/main/Skill.md \
  -o ~/.openclaw/skills/seo-utils-mcp-guide/SKILL.md
```

Or for workspace-only: copy to `<your-project>/skills/seo-utils-mcp-guide/SKILL.md`

</details>

Source: [github.com/seoutilsapp/seo-utils-skills](https://github.com/seoutilsapp/seo-utils-skills)

## Run SEO Tasks from Your Phone

You can run SEO tasks from your phone using either Cowork (Dispatch) or Telegram/Discord channels. Both methods process tasks on your desktop using the MCP server.

{% tabs %}
{% tab title="Using Cowork" %}
With [**Dispatch**](https://support.claude.com/en/articles/13947068-assign-tasks-to-claude-from-anywhere-in-cowork) in Cowork, you can assign SEO tasks from your phone and Claude will execute them on your desktop.

<figure><img src="/files/oLxndNRGNCn9yWFvkwa8" alt="" width="188"><figcaption><p>Assign SEO tasks from your phone using Dispatch in Cowork</p></figcaption></figure>

For example, you can message Claude from your phone:

* "Generate a weekly SEO report for example.com and save it as HTML"
* "Check the backlink profile for competitor.com"
* "Find keyword cannibalization issues for my site in GSC"

Claude processes the task on your desktop using your local SEO data and MCP tools, then returns the results to your phone.

{% hint style="warning" %}
**Requirements:** Your computer must be awake and Claude Desktop must be open. You need a Claude **Pro or Max plan** and the latest Claude mobile + desktop apps installed.
{% endhint %}
{% endtab %}

{% tab title="Using Telegram or Discord" %}
With [**Channels**](https://code.claude.com/docs/en/channels) in Claude Code, you can send SEO prompts from Telegram or Discord — Claude processes them on your computer and replies right back in the chat.

<figure><img src="/files/S5alSXyV6WyOGOn6IgmE" alt="" width="188"><figcaption><p>Send SEO prompts from Telegram to Claude Code with MCP access</p></figcaption></figure>

{% stepper %}
{% step %}
**Create a project folder and set up MCP**

Create a folder for your SEO workspace and add the SEO Utils MCP server:

```bash
mkdir ~/seo-workspace && cd ~/seo-workspace
claude mcp add --transport http seo-utils http://localhost:19515/mcp \
  --header "Authorization: Bearer YOUR_TOKEN_HERE"
```

Replace `YOUR_TOKEN_HERE` with the token from SEO Utils Settings → MCP Server → Manual Config.

{% hint style="info" %}
You can also use any other method from the **Claude Code** tab above (`.mcp.json` or import from Claude Desktop).
{% endhint %}
{% endstep %}

{% step %}
**Install** [**Bun**](https://bun.sh) (required for channel plugins)

```bash
curl -fsSL https://bun.sh/install | bash
```

{% endstep %}

{% step %}
**Set up Telegram or Discord channel**

Follow the official guide for your platform:

* [**Telegram setup**](https://code.claude.com/docs/en/channels) — Create a bot via BotFather, install the plugin, configure, and pair
* [**Discord setup**](https://code.claude.com/docs/en/channels) — Create a bot in Discord Developer Portal, install the plugin, configure, and pair
  {% endstep %}

{% step %}
**Start Claude Code with channels enabled**

```bash
cd ~/seo-workspace
claude --channels plugin:telegram@claude-plugins-official
```

Or for Discord:

```bash
claude --channels plugin:discord@claude-plugins-official
```

{% endstep %}

{% step %}
**Send SEO prompts from your phone**

Open Telegram or Discord on your phone and message your bot:

* "Show me the top trending queries in GSC for my site"
* "Generate a backlink report for competitor.com"
* "Create an automation that emails me when rank tracking completes"

Claude processes the request on your computer and replies in the chat.
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
**Requirements:** Your computer must be running with Claude Code open. Channels require Claude Code v2.1.80+, a Claude **Pro or Max plan**, and [Bun](https://bun.sh) installed.
{% endhint %}

**Multiple channels for different clients**

Run separate Claude Code sessions with different bot tokens — one per client or project. Each session has its own MCP connection, workspace, and chat bot.

```bash
# Client A
cd ~/seo-workspace-client-a
TELEGRAM_BOT_TOKEN=<token_A> claude --channels plugin:telegram@claude-plugins-official

# Client B
cd ~/seo-workspace-client-b
TELEGRAM_BOT_TOKEN=<token_B> claude --channels plugin:telegram@claude-plugins-official
```

The environment variable overrides the saved config, so each session uses a different bot. Works the same way for Discord with `DISCORD_BOT_TOKEN`.
{% endtab %}
{% endtabs %}

## Available Tools

The MCP server exposes the following tools that the AI uses automatically:

**Data Tools** (read your existing SEO data):

| Tool              | Description                                                                                    |
| ----------------- | ---------------------------------------------------------------------------------------------- |
| `list_tables`     | Lists all database tables with descriptions                                                    |
| `describe_table`  | Shows columns, types, and relationships for a specific table                                   |
| `query_database`  | Executes read-only SQL queries against your SEO data                                           |
| `query_gsc`       | Specialized SQL tool for Google Search Console data with built-in timezone and filter guidance |
| `list_workspaces` | Lists all workspaces and shows the active one                                                  |
| `set_workspace`   | Switches to a different workspace                                                              |

**Action Tools** (fetch live data from APIs):

| Tool                                 | Description                                                                                                                                                                                                                       |
| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `check_keyword_metrics`              | Check search volume, difficulty, CPC, and search intents for keywords via DataForSEO                                                                                                                                              |
| `fetch_serp_data`                    | Fetch live Google SERP results for keywords. Caches results to avoid duplicate API calls                                                                                                                                          |
| `get_backlink_summary`               | Get backlink overview: total backlinks, referring domains, domain rank, spam score, distributions                                                                                                                                 |
| `get_backlink_history`               | Get historical backlink trends: new/lost backlinks and referring domains over time                                                                                                                                                |
| `fetch_backlinks`                    | Fetch individual backlink records with filters (dofollow, platform type, etc.)                                                                                                                                                    |
| `get_referring_domains`              | Get list of domains linking to a target with rank, spam score, and backlink count                                                                                                                                                 |
| `get_anchor_texts`                   | Get anchor text distribution — which texts are used most in backlinks                                                                                                                                                             |
| `get_backlink_competitors`           | Find domains competing for the same backlink sources                                                                                                                                                                              |
| `get_content_gap`                    | Find keywords competitors rank for but you don't                                                                                                                                                                                  |
| `get_backlink_gap`                   | Find domains linking to competitors but not you                                                                                                                                                                                   |
| `get_demographics`                   | Fetch demographic data (population, income, age, homeownership) around a location — supports US, UK, Australia, and Canada                                                                                                        |
| `get_gmb_report_group_dashboard`     | Get aggregated multi-location dashboard — visibility score, rankings, trends across all locations in a report group                                                                                                               |
| `create_gmb_report_group`            | Create a report group from existing individual GMB rank tracker reports for multi-location analytics                                                                                                                              |
| `delete_gmb_report_group`            | Delete a report group (individual reports are not affected)                                                                                                                                                                       |
| `find_google_business`               | Resolve a business name/address to a Google Place ID via Google Places autocomplete (used before create\_gmb\_rank\_tracker\_report or create\_google\_business\_review\_fetch)                                                   |
| `find_google_business_from_maps_url` | Resolve a Google Maps link (full URL, maps.app.goo.gl share link, or ?cid= link) to the business's Place ID, name, and address — no Google Places API key needed; goes through DataForSEO                                         |
| `create_gmb_rank_tracker_report`     | Create a new GMB rank tracker report with full grid, schedule, and keyword setup. Auto-geocodes place\_id → center coords; auto-generates the measurement grid (square/circle/polygon) or accepts an explicit list of coordinates |
| `update_gmb_rank_tracker_report`     | Partially update an existing GMB rank tracker report — change schedule, grid, locale, branding, or measurement points. Markers regenerate automatically when grid inputs change                                                   |
| `run_gmb_rank_tracker`               | Trigger a fresh snapshot run for an existing GMB rank tracker report. Asynchronous; consumes DataForSEO credits (one task per keyword × grid point)                                                                               |
| `get_traffic_summary`                | Get organic traffic overview (ETV, keyword counts, paid traffic) for a domain                                                                                                                                                     |
| `get_organic_keywords`               | Get keywords a domain ranks for with position, volume, traffic, difficulty                                                                                                                                                        |
| `get_traffic_competitors`            | Find organic search competitors with shared keyword overlap                                                                                                                                                                       |
| `get_top_pages`                      | Get top pages by organic traffic for a domain                                                                                                                                                                                     |
| `get_historical_rank`                | Get historical organic traffic and ranking trends over time (monthly)                                                                                                                                                             |
| `get_keyword_suggestions`            | Get Google keyword suggestions with full metrics (volume, KD, CPC, backlinks, SERP info)                                                                                                                                          |
| `get_bing_related_keywords`          | Get Bing related keywords with metrics                                                                                                                                                                                            |
| `fetch_autocomplete_keywords`        | Trigger autocomplete keyword generation from Google or Bing (background)                                                                                                                                                          |
| `get_autocomplete_keywords`          | Get autocomplete keywords with metrics from the database                                                                                                                                                                          |
| `bulk_traffic_analysis`              | Analyze organic traffic for multiple domains at once                                                                                                                                                                              |
| `bulk_backlink_analysis`             | Analyze backlink profiles for multiple URLs/domains at once                                                                                                                                                                       |
| `submit_url_for_google_indexing`     | Submit a URL for Google indexing via the Indexing API                                                                                                                                                                             |
| `check_google_indexing_status`       | Check a URL's indexing status via the URL Inspection API (returns coverage state, verdict, etc.)                                                                                                                                  |
| `trigger_indexing_action`            | Run batch inspection scan, trigger internal link crawl, check crawl status, recalculate paths                                                                                                                                     |
| `submit_url_to_index_now`            | Submit a URL to IndexNow for Bing indexing                                                                                                                                                                                        |
| `check_index_now_status`             | Check if a URL is indexed by Bing                                                                                                                                                                                                 |
| `send_email`                         | Send an email with optional attachments using your configured SMTP credentials                                                                                                                                                    |
| `get_robots_compliance`              | Per-bot robots.txt compliance for a log analysis report — which bots are allowed, how many requests violated a Disallow rule. Uses the Go-side robots.txt matcher (SQL can't evaluate robots.txt rules)                           |

**Saved Keywords Tools** (manage your keyword lists):

| Tool                         | Description                                      |
| ---------------------------- | ------------------------------------------------ |
| `list_saved_keywords_lists`  | List all keyword lists with keyword counts       |
| `create_saved_keywords_list` | Create a new keyword list with a name and locale |
| `update_saved_keywords_list` | Rename a keyword list                            |
| `delete_saved_keywords_list` | Delete a keyword list and all its keywords       |
| `add_keywords_to_list`       | Add keywords to a list (duplicates are skipped)  |
| `remove_keywords_from_list`  | Remove keywords from a list by their IDs         |

**Organic Rank Tracker Tools** (set up trackers, grow tracked keyword sets, and queue runs):

| Tool                                   | Description                                                                                                                                                                                                                                                                                                                                                                                                           |
| -------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `create_organic_rank_tracker_report`   | Create a new rank tracker report for a domain — full setup including keywords, locale, schedule (interval plus an optional business-hours time window, days of the week, and timezone), scrape method, device type, and DFS-specific pixel/PAA options. Auto-runs the first scan unless you say otherwise; when the current time is outside the configured window, the first scan waits for the next window instead.  |
| `update_organic_rank_tracker_report`   | Partially update an existing rank tracker report — change name, schedule (interval, time window, days, timezone), scrape method, business name, include-subdomains, or DFS-only settings. Domain, keywords, locale, and device type are immutable (create a new report to change those). Pixel-tracking settings lock once a snapshot has captured pixel data. Toggling include\_subdomains triggers an async resync. |
| `add_organic_rank_tracker_keywords`    | Add keywords to an existing rank tracker report. Duplicates are silently skipped. Does NOT rerun the tracker — the AI asks you separately.                                                                                                                                                                                                                                                                            |
| `remove_organic_rank_tracker_keywords` | Remove keywords from a rank tracker report by their text. Destructive — also deletes those keywords' historical positions, PAA appearances, and insights. Keywords not found in the report are reported back but don't cause an error.                                                                                                                                                                                |
| `run_rank_tracker`                     | Queue a rank tracker run for a report. Background job; consumes DataForSEO credits. Optional `force_refresh` to rescrape everything.                                                                                                                                                                                                                                                                                  |

**LLM Rank Tracker Tools** (track brand visibility in AI answers):

| Tool                             | Description                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `create_llm_rank_tracker_report` | Create a new LLM rank tracker — brand variants, search terms, AI engines (ChatGPT, ChatGPT Web Search, Google AI Overview, Google AI Mode), locale, and schedule. Auto-runs the first snapshot unless you say otherwise (scheduled reports still auto-start within \~15 minutes; use an on-demand schedule to fully defer). Requires DataForSEO credentials and a configured LLM extraction provider. The first brand variant becomes the report's title |
| `run_llm_rank_tracker`           | Queue a snapshot run for an existing LLM rank tracker report. Background job; sends every search term to every configured AI engine and consumes DataForSEO credits. One snapshot per day — re-running the same day updates today's snapshot                                                                                                                                                                                                             |

**Review Fetcher Tools** (track Google Business Profile reviews):

| Tool                                  | Description                                                                                                                                                                                                                                                                                                                                                                                                             |
| ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `create_google_business_review_fetch` | Start tracking a business's Google reviews — resolves the business via `find_google_business` (name) or `find_google_business_from_maps_url` (Google Maps link), sets the initial pull depth, locale, and DataForSEO queue priority, and runs the first fetch unless you say otherwise. Requires DataForSEO credentials. Note: there is no automatic schedule for review fetches — each snapshot is triggered on demand |
| `run_google_business_review_fetch`    | Trigger a review fetch for a tracked business. Background job; pulls the latest reviews via DataForSEO, deduplicates them, and flags new, missing (removed/filtered by Google), and reinstated reviews. Returns the snapshot ID so progress can be checked                                                                                                                                                              |

**N.A.P Finder Tools** (find local citation pages):

| Tool             | Description                                                                                                                                                                                                                                                                                                                                                                                                                         |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `run_nap_finder` | Create and run a N.A.P Finder report in one step — searches Google for exact-match combinations of your business name, address, and phone number to find the pages that cite them. Each call is a fresh report (reports are one-shot and can't be re-run). Scrapes via DataForSEO, your own IP, or proxies; supports custom search-term template lists, excluded domains, and per-country locales. Results arrive in the background |

The AI resolves the business address and phone automatically via `find_google_business` when you only give a name, and analyzes finished reports through `query_database` on the `nap_finder_items` table (e.g. citations per domain, missing listings).

**Content Struct Tools** (competitor content analysis and AI outlines):

| Tool                       | Description                                                                                                                                                                                                                                                                                                                                                                                               |
| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `create_content_struct`    | Create a content analysis report for one or more keywords — scrapes the top Google results and extracts meta titles, descriptions, and heading structures (H1–H4) from up to 20 top-ranking competitor pages per keyword. Multiple keywords are grouped. Scrapes via your own IP (default), proxies, or the DataForSEO SERP API (consumes credits). The analysis runs in the background                   |
| `generate_content_outline` | Generate an AI content outline from a finished content struct report — sends the competitor headings to your chosen AI model (OpenAI, Anthropic, Gemini, OpenRouter, or Ollama) and produces a suggested meta title, meta description, and a full H1–H4 outline. Replaces any existing outline once the new one is ready (a failed generation keeps the old outline); uses your AI provider's API credits |

**SERP Clustering Tools** (group keywords into topic clusters):

| Tool                            | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `create_serp_clustering_report` | Create a SERP clustering report and run it — scrapes the Google results for every keyword and groups keywords into clusters when their SERPs share enough URLs (keywords whose results overlap can be targeted by one page). Supports a similarity threshold (3–7 shared results), three clustering algorithms (default / strict / balanced strict), per-country locales, device choice, and an optional target domain for per-cluster rank analysis. Scrapes via your own IP (default), proxies, or the DataForSEO SERP API (consumes credits); with DataForSEO connected it also fetches search volume / CPC / difficulty for the keywords. Runs in the background |
| `run_serp_clustering`           | Re-run clustering for an existing report — optionally adding new keywords first. Reuses SERP data newer than `saved_serp_days` instead of re-scraping, and can either re-cluster everything from scratch or keep existing clusters and only distribute new keywords into them. The similarity threshold can change per run; locale, device, and SERP depth stay fixed                                                                                                                                                                                                                                                                                                |

**Text Analysis Tools** (extract entities and topics with NLP):

| Tool               | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `run_nlp_analysis` | Run an NLP entity analysis on pasted text/HTML or on live URLs (scraped first) — extracts the named entities (people, organizations, places, products, concepts) the content is about, with confidence scores, Wikipedia links, and mention counts; TextRazor also extracts topics. Uses whichever NLP provider you configured (TextRazor, Dandelion, or Google NLP — API key required in Settings, uses that provider's quota). Each call creates a new Text Analysis report and runs in the background |

**Automation Tools** (manage your workflows):

| Tool                              | Description                                            |
| --------------------------------- | ------------------------------------------------------ |
| `get_automation_schemas`          | Get available trigger types, action types, and configs |
| `create_automation`               | Create a new automation workflow                       |
| `update_automation`               | Update or pause/resume an automation                   |
| `delete_automation`               | Delete an automation and its history                   |
| `save_automation_report_mappings` | Set which reports trigger an automation                |

**Workspace Tools** (manage your workspaces):

| Tool               | Description                                                                                                        |
| ------------------ | ------------------------------------------------------------------------------------------------------------------ |
| `create_workspace` | Create a new workspace for organizing projects. Name must be unique; new workspaces are not made active by default |
| `update_workspace` | Rename a workspace or update its logo URL. Default workspace can be renamed                                        |

To list, query, or switch workspaces, the AI uses the existing `list_workspaces` / `set_workspace` data tools. Deleting a workspace is done in the desktop app (and is blocked if the workspace still contains data).

**SEO Test Tools** (manage your SEO experiments):

| Tool              | Description                                                                                                                      |
| ----------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `create_seo_test` | Create a new SEO test (split / time\_based / url\_switch). Validates type-specific fields and fetches baseline metrics from GSC  |
| `update_seo_test` | Update an existing SEO test's name, description, hypothesis, end\_date, or type-specific timing fields (test\_type is immutable) |

To list, view metrics, or delete tests, the AI uses `query_database` on the `tests`, `test_pages`, and `test_metrics` tables. Deleting a test is done in the desktop app.

**Keyword Insights Tools** (analyze ranking behavior):

| Tool                          | Description                                                                               |
| ----------------------------- | ----------------------------------------------------------------------------------------- |
| `get_keyword_insight_summary` | Get insight counts (trending up/down, pogo sticking, flickering, key events) for a report |

The AI can also query the `keyword_insights`, `keyword_insight_histories`, `ga4_landing_page_metrics`, and `ga4_property_mappings` tables directly via `query_database` for deeper analysis.

{% hint style="info" %}
SQL queries are **read-only** — the AI cannot modify your data via SQL. Action tools fetch data from external APIs (DataForSEO) and may incur API costs. Saved Keywords, Organic Rank Tracker, LLM Rank Tracker, Review Fetcher, and N.A.P Finder tools can create, update, and delete keyword lists, add or remove keywords in rank tracker reports, create LLM rank tracker reports and review fetches, and queue tracker/fetch/citation-search runs on your behalf. Removing rank tracker keywords also deletes their historical positions and insights — there is no undo. Running a tracker, review fetch, or N.A.P Finder search via DataForSEO consumes DataForSEO credits.
{% endhint %}

## Built-in Prompts

Claude Desktop shows these in the prompt picker — click the slash icon to find them:

| Prompt                      | What It Does                                                                         |
| --------------------------- | ------------------------------------------------------------------------------------ |
| **Weekly SEO Report**       | Comprehensive weekly performance report with rankings, GSC data, and recommendations |
| **Keyword Cannibalization** | Finds keywords where multiple pages compete for the same query                       |
| **Weak Pages Analysis**     | Identifies underperforming pages that need optimization                              |
| **Ranking Trends**          | Analyzes ranking changes over time with winners and losers                           |
| **Content Gap Analysis**    | Finds content opportunities from Search Console data                                 |
| **Local SEO Report**        | Google Business rank tracking performance report                                     |
| **SERP Landscape**          | Competitive analysis of SERP features and competitors                                |
| **Client Report**           | Professional, client-ready report in non-technical language                          |

## Example Prompts

Here are some prompts you can try right away. Click each category to expand.

{% hint style="info" %}
**Tip for GSC queries:** When asking about your own site's search performance, include **"in GSC"** or **"from my Search Console data"** in your prompt. This tells the AI to query your local Google Search Console data instead of fetching third-party estimates.
{% endhint %}

<details>

<summary>📊 Reporting &#x26; Charts</summary>

* "Create a dashboard to report all SEO metrics of tuikhoeconban.com" (Work with [Claude Cowork Live Artifact to create live SEO dashboard](https://www.facebook.com/groups/seoutils/posts/1360693665894236/).)
* "Pull my Google Search Console data for the last 30 days. Show me a line chart of daily clicks and impressions over time. Also show a table of the top 10 queries by clicks."
* "Get my organic rank tracker data for example.com. Create a pie chart showing the ranking distribution: how many keywords are on page 1 (positions 1-10), page 2 (11-20), page 3 (21-30), and beyond."
* "Pull my Google Business rank tracker data for My Business Name. Create a heatmap or grid visualization showing my ranking positions across different geographic points."
* "Compare my Google Search Console query performance between the last 7 days and the previous 7 days. Find the top 10 queries that gained the most clicks and the top 10 that lost the most."
* "Create a comprehensive SEO dashboard for example.com with: 1) A line chart of GSC clicks over the last 30 days, 2) Current organic rank distribution as a donut chart, 3) A table of top 10 pages by impressions."

</details>

<details>

<summary>🔍 SEO Analysis</summary>

* "Find pages on my site that rank on positions 11-20 (page 2) with more than 100 impressions. These are quick-win opportunities to push to page 1."
* "Find pages with high impressions but low CTR — the title or description probably needs work."
* "Which keywords have multiple pages competing for the same position? Show me the cannibalization issues."
* "Find queries I'm appearing for in Google but don't have a dedicated page targeting them."

</details>

<details>

<summary>📈 Tracking &#x26; Trends</summary>

* "Compare my organic ranking distribution today vs 30 days ago. How many keywords moved to page 1? How many dropped off?"
* "Show me my biggest ranking winners and losers this month."
* "List all my organic rank tracker reports and how many keywords each one tracks."

</details>

<details>

<summary>🗺️ Local SEO</summary>

* "Show me my Google Business rank tracking data. Create a summary of how many grid points I rank in top 3, top 10, and not ranking."
* "Show me the ranking trend for 'hot pot' in my GMB report #7"
* "Compare my local rankings between this week and last week. Which keywords improved?"
* "List all my GMB rank tracker reports with their keywords and latest snapshot dates"
* "Show me the demographics around my business and correlate with my local rankings — do I rank better in high-income or high-density areas?"
* "Show me the multi-location dashboard for Haidilao Hot Pot across all locations"
* "Create a report group for all my Haidilao reports so I can see combined rankings"
* "What's my visibility score for Haidilao across Bellevue and Seattle? Compare vs 30 days ago"
* "Which location has the best local rankings for 'hot pot'?"

</details>

<details>

<summary>📍 Create &#x26; Update GMB Rank Trackers</summary>

* "Create a GMB rank tracker for Haidilao Hot Pot in Bellevue, WA tracking 'hot pot bellevue', 'best chinese bellevue', and 'haidilao'. Use a 5x5 square grid with 500m radius, run weekly on Mondays 9-11am Pacific."
* "Set up a circle 7x7 GMB tracker for my dental clinic at 100 Park Ave, New York with 1 mile radius, tracking 'dentist near me', 'emergency dentist nyc', and 'tooth cleaning manhattan'. Run once now so I can see the baseline."
* "Track Pho Bac Sup Shop in Seattle for 'pho near me' and 'best pho seattle' — square 7x7, 800m radius, weekly Mondays at 8am Pacific."
* "Create a GMB tracker for Joe's Pizza in NYC simulating searches from Brooklyn instead of Manhattan, tracking 'pizza near me' and 'best slice brooklyn'."
* "I have 9 specific tracking points for my market research project — coordinates: \[{lat: 47.61, lng: -122.20}, {lat: 47.62, lng: -122.20}, ...]. Create a GMB report for Haidilao Hot Pot Bellevue using those exact points and track 'coffee shop'."
* "Update my Haidilao GMB report — bump it from 5x5 to 7x7 grid and change the schedule to twice-per-month on the 1st at 8am Pacific."
* "Disable the daily run schedule on GMB report #7 and switch it to a one-time manual tracker."
* "Rebrand the export header on GMB report #12 to 'Q1 Local SEO — Acme Dental' and set the comparison period to 30 days."
* "Run a fresh snapshot for GMB report #7 right now — I want to see today's rankings without waiting for the schedule."

</details>

<details>

<summary>🌐 Create &#x26; Update Organic Rank Trackers</summary>

* "Set up an organic rank tracker for example.com in the US English, tracking 'best seo tool', 'seo software', and 'free seo audit'. Use DataForSEO, desktop, weekly schedule."
* "Track moz.com on mobile in the UK for 'keyword research', 'local seo', and 'backlink checker' — DataForSEO, weekly, start scanning right away."
* "Create a rank tracker for mycompany.io scraping from my own IP with 5-second delays. Daily schedule. Keywords: 'widget pricing', 'widget reviews', 'best widgets 2026'. Don't start scanning yet — I want to review settings first."
* "Set up tracking for a French SaaS — saas-fr.com in France French, tracking 'logiciel de gestion', 'outil de productivité', 'crm français'. DataForSEO, weekly."
* "Make a rank tracker for laravel.com in the US that includes subdomains (so docs.laravel.com counts as laravel.com). DataForSEO, desktop, weekly. Keywords: 'php framework', 'laravel tutorial', 'best php frameworks'."
* "Set up a rank tracker for a Chicago dental clinic — chicagosmiles.com, US English, DataForSEO, daily — but only run it between 9am and 5pm Chicago time."
* "Change the schedule on rank tracker #19 from weekly to daily."
* "Make rank tracker #19 run only on Mondays and Thursdays, between 08:00 and 12:00 in America/New\_York."
* "Remove the time window and day restrictions from rank tracker #22 so it can run at any time."
* "Rename rank tracker #22 to 'Moz.com — Q1 Tracking' and turn on include subdomains."
* "Switch rank tracker #23 from own-IP scraping to DataForSEO and bump priority to 2 for faster turnaround."
* "Disable pixel tracking on report #20." *(Will error if a snapshot has already captured pixel data — pixel settings are immutable after data is collected, by design.)*

</details>

<details>

<summary>🔑 Keyword Research</summary>

* "Check keyword metrics for: seo tools, rank tracker, keyword research, backlink checker"
* "Check keyword metrics for these keywords in Vietnam: công cụ seo, phân tích backlink"
* "What's the search volume and difficulty for 'best seo tools 2026'?"

</details>

<details>

<summary>🔗 Backlink Analysis</summary>

* "Show me the backlink profile for seoutils.app"
* "How have the backlinks for example.com changed over the past year? Show me a chart."
* "Which domains link to seoutils.app? Show the top 20 by authority rank."
* "Show me only dofollow backlinks for example.com"
* "Find backlinks from blog platforms pointing to example.com"
* "What's the spam score and domain rank for example.com's backlink profile?"
* "How many referring domains does example.com have? Break it down by dofollow vs nofollow."
* "What anchor texts are used most in backlinks to seoutils.app? Is there over-optimization?"
* "Who are the backlink competitors for seoutils.app? Which sites compete for the same link sources?"

</details>

<details>

<summary>🎯 Gap Analysis</summary>

* "Find keywords that ahrefs.com and semrush.com rank for but seoutils.app doesn't"
* "What content opportunities am I missing compared to my top 3 competitors?"
* "Find domains that link to ahrefs.com but not seoutils.app"
* "Show me the backlink gap between seoutils.app and its top competitors: semrush.com, moz.com"
* "Find high-volume keywords (1000+ searches) that competitors rank for in the US but I don't"

</details>

<details>

<summary>📊 Traffic Analytics</summary>

* "Show me the traffic overview for laravel.com"
* "What are the top organic keywords for laravel.com in the US?"
* "Who are the traffic competitors for seoutils.app?"
* "What are the top pages by traffic for laravel.com?"
* "Show me only informational keywords that laravel.com ranks for"
* "What keywords does laravel.com rank for in positions 1-3 with more than 1000 monthly searches?"
* "Show me the organic traffic trend for laravel.com over the past 5 years. Draw a chart."

</details>

<details>

<summary>🏘️ Demographics (US, UK, Australia &#x26; Canada)</summary>

* "Show me the demographics around my GMB report #7 business"
* "What's the population density and median income near Haidilao Hot Pot Bellevue?"
* "Compare the demographics data with my local rankings — do I rank better in high-income or low-income areas?"
* "Show me census data within 3 miles of coordinates 47.61, -122.20"
* "Show me demographics around my business in London / Sydney / Toronto"

</details>

<details>

<summary>🔎 GSC Insights &#x26; Mentions</summary>

* "Find keyword cannibalization issues for example.com in GSC"
* "Using my GSC data, what percentage of queries are branded vs non-branded for example.com?"
* "Show me my top trending queries in GSC this month vs last month"
* "What are my optimization opportunities in GSC — queries I rank for but don't mention in page titles?"
* "Show me GSC traffic by country for my site — which countries send the most clicks?"
* "Break down my GSC queries by position range: how many rank 1-3, 4-10, 11-20, and 21+?"
* "Which queries in GSC have zero mentions in page titles but high impressions?"
* "Show me additional traffic sources beyond web search in my Search Console data"

</details>

<details>

<summary>🔗 URL Indexing</summary>

* "How many of my URLs are indexed vs not indexed? Show the breakdown by coverage state."
* "Submit this URL for Google indexing: <https://example.com/new-page>"
* "Check the indexing status of <https://example.com/page> using the URL Inspection API"
* "Show me all URLs that have been crawled but not indexed — what's causing them to be rejected?"
* "Which directories on my site have the worst indexing rate?"
* "Find orphan pages — URLs with zero internal links that aren't indexed"
* "Show me the top 10 pages by internal inlink count and their indexing status"
* "Run an inspection scan for my site to update all URL statuses"
* "Start an internal link crawl for my site"
* "Which URLs have had their coverage state change in the last 7 days?"
* "Show me pages that went from 'Submitted and indexed' to something else recently"
* "Submit <https://example.com/updated-page> to IndexNow for Bing"

</details>

<details>

<summary>📐 Content Struct (Content Brief)</summary>

* "Create a content struct for 'keto meal plan' and tell me when the analysis is done"
* "Analyze the top Google results for 'best running shoes', 'trail running shoes', and 'running shoes for flat feet' — group them as 'Running Shoes Cluster'"
* "Create a content struct for 'best pho hanoi' targeting Vietnam, using the DataForSEO SERP API"
* "Create a content struct for 'coffee grinder' but exclude amazon.com and reddit.com from the competitor pages"
* "Generate an AI content outline for my 'keto meal plan' content struct using Claude"
* "Regenerate the outline for report #191 with GPT — focus the prompt on beginner-friendly content"
* "Show me the content brief for 'keto' — report #189"
* "Write a 2000-word article using the content outline from content struct report #191"
* "Show me the AI-generated outline and suggested meta title/description for report #193"
* "Which H2 headings appear most frequently across competitor pages for 'hot pot' in report #191?"
* "Write an SEO-optimized blog post following the content brief in report #189."
* "Compare the heading structure of the top 5 competitor pages for 'keto' in report #189"

</details>

<details>

<summary>🧩 SERP Clustering</summary>

* "Cluster these keywords by SERP similarity: keto diet, keto meal plan, keto recipes, low carb diet, keto for beginners — call the report 'Keto Cluster'"
* "Create a SERP clustering report for my keyword list using the DataForSEO SERP API with a similarity of 5 and the strict algorithm"
* "Cluster these German keywords for germany: hochzeit checkliste, hochzeitsplanung, hochzeit budget — and set target domain example.de so I can see where I rank per cluster"
* "Is my 'Keto Cluster' report done yet? If it failed, tell me why"
* "Add these new keywords to SERP clustering report #22 and distribute them into the existing clusters — reuse SERP data from the last 30 days"
* "Re-run report #22 from scratch with a stricter similarity of 6"
* "Show me the clusters in report #22 — cluster name, keyword count, and total search volume, biggest first"
* "Which keywords in report #22 ended up unclustered, and which clusters does my domain not rank in at all?"

</details>

<details>

<summary>📝 Text Analysis (NLP)</summary>

* "Run an NLP analysis on <https://example.com/blog/keto-guide> with TextRazor and show me the entities it covers"
* "Analyze these three competitor pages with Google NLP and tell me which entities all of them mention: \[urls]"
* "Here's my article draft — analyze it with Dandelion and list the entities with their Wikipedia links: \[pasted text]"
* "Analyze my German landing page example.de/preise with TextRazor in German — call the report 'Preise Entities'"
* "Is my 'Preise Entities' analysis finished? If it failed, tell me why"
* "Show me all my NLP analysis reports"
* "What are the top entities found in my TextRazor analysis report #19?"
* "Which entities appear most frequently across all items in report #21?"
* "Compare the entities found by GoogleNLP vs TextRazor for the same URLs"
* "Show me all entities with confidence score above 0.8 in report #20"
* "What topics were identified in my TextRazor report? Show them sorted by score"

</details>

<details>

<summary>📊 Bulk Analysis</summary>

* "Compare organic traffic for laravel.com, symfony.com, and codeigniter.com"
* "Show me the backlink profiles for seoutils.app, ahrefs.com, and semrush.com"
* "Which of these domains has the highest domain rank: moz.com, majestic.com, semrush.com?"
* "Analyze traffic and backlinks for my top 5 competitors"
* "Compare referring domains count for example.com vs example.org"

</details>

<details>

<summary>📍 NAP Finder</summary>

* "List all my NAP Finder reports"
* "Which domains have the most NAP citations for Monsoon Seattle?"
* "Show me all NAP citations found on yelp.com for my business"
* "What search terms found the most results in NAP Finder report #5?"
* "Find all NAP citations ranking in position 1-3 for monsoon seattle"
* "Compare NAP citations between report #5 and report #6 — which domains appear in both?"
* "Run a NAP Finder for Monsoon Seattle at 615 19th Avenue East, phone (206) 325-2111, using DataForSEO"
* "Find citation pages for Joe's Pizza — look up the address and phone from Google first, exclude joespizza.com"
* "Run a NAP citation check for my business with both phone formats: (222) 333-4444 and 222-333-4444"
* "Run a NAP Finder for my Toronto business in the Canadian locale, scanning the top 50 results per query"
* "Run a NAP Finder for Monsoon using my custom search term list, then tell me when it's done and which new domains it found compared to report #7"

</details>

<details>

<summary>🔬 Keyword Explorer</summary>

* "What are the keyword suggestions for 'keto diet' in the US?"
* "Show me Bing related keywords for 'coffee shops' sorted by search volume"
* "Find keyword suggestions for 'seo tools' with search volume over 1000 and keyword difficulty under 40"
* "Get keyword suggestions for 'best laptops' — only show commercial and transactional intent keywords"
* "Fetch autocomplete keywords for 'seo tools' from Google"
* "Show me the autocomplete keywords for 'keto' from both Google and Bing"
* "What's the search volume, keyword difficulty, and CPC for 'keto diet'?"

</details>

<details>

<summary>📋 Saved Keywords</summary>

* "Show me all my saved keyword lists"
* "Create a new keyword list called 'Competitor Keywords' for the US market"
* "Add these keywords to my 'Competitor Keywords' list: seo tools, keyword research, backlink checker"
* "Create a keyword list called 'Vietnam SEO' for Vietnam in Vietnamese"
* "Rename my 'Old Keywords' list to 'Archive - Q1 2026'"
* "Delete the 'Test Keywords' list"
* "How many keywords are in each of my saved keyword lists?"

</details>

<details>

<summary>📈 Organic Rank Tracker</summary>

* "Add these keywords to my rank tracker for example.com: seo audit, technical seo, on-page seo"
* "Take the top 20 keywords from the content gap report between example.com and competitor.com and add them to my rank tracker for example.com"
* "Pull the highest-converting GSC queries from the last 90 days that I'm not yet tracking, and add them to my example.com rank tracker"
* "Add 'black friday deals, cyber monday sale' to my shop.com tracker and rerun it right now"
* "Remove these keywords from my example.com rank tracker: outdated keyword, irrelevant term, typo'd kw"
* "Find every keyword in my shop.com tracker that hasn't ranked in the last 60 days and remove them"
* "Clean up my rank tracker — remove all keywords containing the word 'test'"
* "Force-refresh my rank tracker for example.com — I want fresh SERPs for every keyword"
* "Rerun the rank tracker for laravel.com"

</details>

<details>

<summary>🌐 SERP Analysis</summary>

* "What's ranking for 'seo tools' in Google?"
* "Fetch SERP data for: rank tracker, keyword research tool, seo software"
* "Show me the top 10 Google results for 'best seo tools' in the US"
* "What pages are ranking for 'local seo' in the UK?"

</details>

<details>

<summary>🤖 LLM Rank Tracker</summary>

* "Show me all my LLM rank tracker reports"
* "Create an LLM rank tracker for my brand Ahrefs (variants: Ahrefs, ahrefs.com) tracking 'best seo tools' and 'best backlink checker' in ChatGPT and Google AI Overview, weekly"
* "Set up an LLM rank tracker for Hasiru Farms in India tracking 'organic vegetables bangalore' on Google AI Overview"
* "Create an LLM rank tracker for my brand across all four AI engines, on-demand only — don't run it yet, I want to review it first"
* "Run my Ahrefs LLM rank tracker now"
* "How is my brand mentioned across AI engines like ChatGPT and Google AI Overview?"
* "Which search terms trigger the most AI citations for my brand?"
* "Compare my LLM visibility across engines — ChatGPT vs ChatGPT Web Search vs Google AI Overview vs Google AI Mode"
* "Show me the trend of my brand mentions in AI responses over the last month"

</details>

<details>

<summary>⭐ Review Fetcher</summary>

* "Start tracking the Google reviews for Haidilao Hot Pot in Bellevue, WA — pull the 300 most recent reviews"
* "Track the reviews of this business: <https://maps.app.goo.gl/AbC123> — start with the 100 latest"
* "Add my dental clinic to the Review Fetcher but don't fetch anything yet — I'll run it manually later"
* "Set up review tracking for my restaurant in Germany with reviews translated to German"
* "Fetch the latest reviews for my Haidilao review tracker and tell me how many new ones came in"
* "Which of my reviews have no owner response yet? List the worst-rated ones first"
* "Did any of my Google reviews go missing since the last check? Show me the removed ones"
* "Summarize the themes in my 1-star and 2-star reviews from the latest snapshot"
* "Compare my star-rating breakdown between the latest snapshot and the previous one"

</details>

<details>

<summary>📄 Log Analysis</summary>

* "Show me all my log analysis reports"
* "Which pages get the most Googlebot crawls in my latest log analysis?"
* "Show me pages with 404 errors that Googlebot is trying to crawl"
* "What's the crawl frequency breakdown by HTTP status code?"

</details>

<details>

<summary>🤖 AI Log Analysis (AEO / GEO)</summary>

* "Is GPTBot violating my robots.txt in my latest log analysis report?"
* "Which AI bots are ignoring my Disallow rules — filter to violations > 0"
* "Which pages are Perplexity and ChatGPT-User fetching most this month?"
* "What questions are AI engines asking about my site? Group by extracted\_query"
* "How is AI traffic trending vs search traffic over the last 30 days?"
* "Which pages has Googlebot crawled recently but AI bots haven't visited in over a week?"
* "What's the error rate per AI bot — which bots are getting 4xx/5xx responses most?"

</details>

<details>

<summary>🧪 SEO Tests</summary>

* "Show me all my SEO tests and their current status"
* "How is my SEO test #5 performing — are clicks and impressions improving?"
* "Compare the before and after metrics for my latest completed SEO test"
* "Create a time-based SEO test on example.com starting today: hypothesis is rewriting the H1 on /blog/seo-guide will improve CTR. Change implemented date is today."
* "Create a 50/50 split test on shop.example.com comparing /products/a, /products/b (control) vs /products/c, /products/d (variant), starting next Monday"
* "Create a URL switch test on example.com alternating /pricing with /pricing-v2 every 7 days, starting today, ending in 60 days"
* "Update SEO test #7 — extend the end date to 2026-08-01 and update the hypothesis to mention the new schema markup"
* "Update test #3 to clear the end date so it runs indefinitely"

</details>

<details>

<summary>📧 Send Email</summary>

* "Send an email to <client@example.com> with subject 'Weekly SEO Report' and a summary of this week's ranking changes"
* "Email me the keyword cannibalization analysis for my site"
* "Send the content brief for 'keto diet' to my team at <team@example.com>"
* "Compose and send an email to <client@example.com> with the top 10 ranking improvements this month"

</details>

<details>

<summary>⚡ Automations</summary>

* "Show me all my automations"
* "What trigger types and action types are available for automations?"
* "Create an automation that exports a PDF report when my organic rank tracker snapshot completes"
* "Create an automation that runs when a content struct outline is generated. It should: 1) Export the outline as markdown to my Downloads folder, 2) Send an email to <client@example.com> with subject 'New Content Brief: \[keyword name]' and body showing the meta title, meta description, and number of headings, with the markdown file attached, 3) Send a GET webhook to <https://n8n.example.com/webhook/content-brief>"
* "Set up an automation to send an email with the rank tracker PDF attached when a snapshot finishes"
* "Create a webhook automation that posts rank tracker data to my n8n workflow when a snapshot completes"
* "Pause automation #1"
* "Delete the 'Test' automation"

</details>

<details>

<summary>🔬 Keyword Insights</summary>

* "Show me the keyword insight summary for my example.com rank tracker report"
* "Which keywords are trending up in my rank tracker report #20?"
* "Are any of my keywords pogo sticking or flickering? Explain what that means."
* "Show me the insight history — which keywords recently became unstable?"
* "How many of my keywords have enough data for trend analysis?"

</details>

<details>

<summary>📈 Rankings + GA4 Conversions (SEO Utils exclusive)</summary>

These prompts combine ranking data with Google Analytics 4 conversion metrics — something no standalone GA4 or rank tracker tool can do on its own. Note: this shows **correlation** (keyword ranking changes on pages that also saw conversion changes), not direct causation.

* "Show me keywords that improved in ranking on pages that also saw increased conversions. I want to see the position change alongside the page's conversion count."
* "Show me pages that generated conversions from organic search, and for each page, show me which keywords rank on that page and their current position."
* "Which pages generate the most organic revenue in GA4, and what keywords am I tracking on those pages?"
* "Are any of my pogo-sticking or flickering keywords on pages that generate conversions? These pages need stabilization first."
* "Give me a complete SEO health report for example.com: how many keywords are trending up vs down, which have unstable rankings, which pages have the most conversions, and what's my total organic revenue from GA4."

</details>

<details>

<summary>🗂️ Workspaces</summary>

* "List my workspaces"
* "Create a new workspace called Client A"
* "Create a workspace named E-commerce Projects with logo <https://example.com/logo.png>"
* "Rename workspace 3 to Personal Sites"
* "Update the Side Projects workspace — clear the logo"
* "Which workspace am I in right now? Switch me to Client A and show all the rank tracker reports in that workspace."

</details>

<details>

<summary>📝 Client &#x26; Comprehensive Reports</summary>

* "Generate a professional, client-ready SEO report for example.com for the last 30 days. Use clear, non-technical language suitable for stakeholders."
* "Create a comprehensive SEO health report for example.com. Include: GSC performance summary, top queries, optimization opportunities, cannibalization issues, and a weekly clicks trend chart."
* "Give me a complete SEO & backlink report for example.com — include traffic overview, top keywords, top pages, top competitors, backlink profile, and combined trends. Save it as an interactive HTML dashboard."

</details>

## Workspaces

If you use multiple workspaces in SEO Utils, the MCP server defaults to your currently active workspace. You can ask the AI to list, switch, create, or rename workspaces:

> "List my workspaces"

> "Switch to the Client Projects workspace"

> "Create a new workspace called Client A"

> "Rename workspace 3 to E-commerce Projects"

> "Update my Personal workspace — change the logo to <https://example.com/logo.png>"

After switching, all subsequent queries will be scoped to that workspace. New workspaces are **not** made active automatically — switch to them with `set_workspace` (or in the workspace switcher in the app). Workspace deletion is only available in the desktop app and is blocked if the workspace still contains any data.

## Data Accuracy

The MCP server is designed to return the same numbers you see in the app. Behind the scenes, it automatically handles:

* **Timezone conversion** — Google Search Console uses Pacific Time, while other tools use your server's timezone. The MCP applies the correct offsets automatically.
* **Default filters** — Filters like `search_type = 'web'` for GSC data are applied automatically. You don't need to specify them.
* **Smart table selection** — When you ask about total clicks over time, the MCP uses the aggregate table (accurate totals). When you ask about specific queries, it uses the query-level table. Same logic as the app.
* **Rank tracker specifics** — NULL positions correctly handled as "not ranking," local pack results prioritized over organic, and average rank calculations match the app exactly.

You just ask your question in plain English — the MCP handles all the complexity.

## Security

| Aspect             | Detail                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Network**        | Server binds to `127.0.0.1` only — not accessible from the internet                                                                                                                                                                                                                                                                                                                                                                                                    |
| **Authentication** | Bearer token required for all connections                                                                                                                                                                                                                                                                                                                                                                                                                              |
| **Data access**    | SQL queries are read-only. A small set of write tools can: create/update/delete saved keyword lists, add keywords to rank tracker reports, create LLM rank tracker reports and review fetches, queue tracker and review-fetch runs, run N.A.P Finder citation searches, create content structs and generate AI content outlines, create and run SERP clustering reports, run NLP text analyses, create/update workspaces, and manage automations and GMB report groups |
| **Query safety**   | Only SELECT statements allowed, auto-limited to 1,000 rows                                                                                                                                                                                                                                                                                                                                                                                                             |
| **Token storage**  | Auth token file has `0600` permissions (owner-read only)                                                                                                                                                                                                                                                                                                                                                                                                               |
| **Token rotation** | Rotate the auth token anytime from Settings — the old token stops working immediately, no restart needed                                                                                                                                                                                                                                                                                                                                                               |

{% hint style="success" %}
Your SEO data stays on your machine. The MCP server runs locally and the AI connects to it directly — no data is sent to any third-party server.
{% endhint %}

### Rotating the Auth Token

If your token was exposed — shared in a screenshot, a screen recording, or a config file — rotate it to generate a new one and lock out anyone still holding the old token.

{% stepper %}
{% step %}

#### Open the MCP Server Settings

Go to **Settings → Services** and scroll to the **MCP Server (AI Integration)** section. The **Rotate auth token** option appears while the server is running.
{% endstep %}

{% step %}

#### Click "Rotate token"

A confirmation dialog explains the impact: the current token is invalidated immediately, and every connected AI client loses access until you update it. Click **"Rotate"** to confirm.

<figure><img src="/files/Go7jvjy59Ehq4c9f6vS4" alt=""><figcaption><p>Confirmation dialog shown before rotating the MCP auth token</p></figcaption></figure>
{% endstep %}

{% step %}

#### Reconnect Your AI Clients

The new token takes effect instantly — no restart of SEO Utils needed. Update each client you use:

* **Claude Desktop (Auto Install)** — click **"Install in Claude Desktop"** again, then restart Claude Desktop
* **All other clients** — copy the fresh config (or token) from the **Manual Config** tab and replace the old value in your client's configuration
  {% endstep %}
  {% endstepper %}

{% hint style="warning" %}
Rotation cannot be undone. Any client still configured with the old token — including automations on n8n, Make.com, or a VPS — will get authentication errors until you update it with the new token.
{% endhint %}

## Frequently Asked Questions

<details>

<summary>Is this self-hosted?</summary>

Yes! The MCP server runs entirely inside the SEO Utils app on your own machine. Your data stays local — nothing is sent to any third-party server. It works on macOS, Windows, and Linux (including VPS).

</details>

<details>

<summary>What about security? Is my desktop accessible from the internet?</summary>

No. The MCP server binds to `127.0.0.1` (localhost) only — it is **not** accessible from the internet. Only applications running on your own machine can connect to it, and they need a valid Bearer token to authenticate. Your data never leaves your computer.

</details>

<details>

<summary>Can I run this on a VPS for 24/7 automations?</summary>

Yes! You can install SEO Utils on a VPS (Linux is supported) and keep it running 24/7. This is great for automations with n8n, Make, etc. — they won't fail when your local machine is turned off. If you need external access from the internet, put SEO Utils behind a reverse proxy (like Nginx) with HTTPS. The built-in Bearer token auth ensures only authorized clients can connect.

</details>

<details>

<summary>Which AI clients are supported?</summary>

Any MCP-compatible client works, including:

* **Claude Desktop / Cowork (desktop)** — via Auto Install or manual config (local connection)
* **Claude Code** — via `.mcp.json` config (local connection)
* **OpenAI Codex (App, CLI, IDE extension)** — via `config.toml` or the desktop app's Settings → Integrations & MCP (local connection, shared config)
* **Google Antigravity** — via `mcp_config.json` (local connection, requires Node.js)
* **OpenClaw** — via `openclaw.json` (local connection, requires Node.js)
* **ChatGPT Desktop** — via Developer Mode + tunnel or public URL (Plus/Pro/Enterprise)
* **Perplexity (Mac)** — via local MCP connector (macOS only, paid plan)
* **Claude Web (claude.ai) / Cowork (web)** — via custom connector (requires public URL, Pro/Max plan)
* **Perplexity (Remote)** — via remote connector (requires public URL, paid plan)
* **n8n, Make, Zapier** — via the HTTP API (requires public URL or same machine)
* **Any MCP client** — the server uses the standard MCP protocol over HTTP

</details>

<details>

<summary>Can the AI modify or delete my data?</summary>

SQL queries are strictly **read-only** — only `SELECT` statements are allowed. However, a small set of action tools can write on your behalf: Saved Keywords tools (create/rename/delete lists, add/remove keywords), Organic Rank Tracker tools (create/update reports, add or remove keywords, queue a tracker run — which consumes DataForSEO credits; removing a keyword also deletes its historical positions and insights), LLM Rank Tracker tools (create reports, queue a snapshot run — also consumes DataForSEO credits), Review Fetcher tools (create a review fetch, queue a fetch run — also consumes DataForSEO credits), Content Struct tools (create reports — consumes DataForSEO credits when scraping via the SERP API — and generate AI outlines, which spend your configured AI provider's credits), SERP Clustering tools (create reports and queue clustering runs — scraping and keyword metrics consume DataForSEO credits when it is the chosen method; adding keywords to an existing report is part of a run), Workspace tools (create or rename workspaces), GMB report groups (create/delete), and Automations (create/update/delete). Workspace deletion is intentionally *not* exposed over MCP — that operation lives in the desktop app. Everything else (GSC, backlinks, snapshots, settings) cannot be modified by the AI.

</details>

<details>

<summary>The AI uses the wrong tool for GSC queries</summary>

When asking about your own site's search performance (cannibalization, trending queries, weak pages, etc.), include **"in GSC"** or **"from my Search Console data"** in your prompt. Without this hint, the AI may fetch third-party estimated data from DataForSEO instead of querying your actual Google Search Console data stored locally.

**Example:** Instead of "Find cannibalization issues for example.com", say "Find cannibalization issues for example.com **in GSC**".

</details>

## Troubleshooting

<details>

<summary>MCP server won't start</summary>

Make sure you have a valid license key and have purchased MCP access. Check that port 19515 is not being used by another application.

</details>

<details>

<summary>Claude Desktop shows "Server disconnected" or "failed"</summary>

This usually means one of these:

1. **SEO Utils is not running** — Open the app and make sure the MCP server is enabled (status shows "Running")
2. **Node.js is not installed** — The Auto Install method requires Node.js. Download it from [nodejs.org](https://nodejs.org) (LTS version), then restart Claude Desktop
3. **Windows path issue** — If you see `'C:\Program' is not recognized` in the logs, update to the latest SEO Utils version which fixes this. Or reinstall by clicking "Install in Claude Desktop" again
4. **Didn't restart Claude Desktop** — After installing, you must fully quit and reopen Claude Desktop

If you don't want to install Node.js, use **Claude Code** instead — it connects directly without Node.js.

</details>

<details>

<summary>Claude Desktop Connector says URL must be HTTPS</summary>

The Connectors UI in Claude Desktop (Settings → Connectors) only accepts HTTPS URLs. Since the MCP server runs on `http://localhost:19515`, you can't use Connectors for local connections.

**Use the Auto Install method instead** — it uses a bridge tool that handles the local connection. If you don't have Node.js, use **Claude Code** which supports local HTTP connections directly.

</details>

<details>

<summary>Auto Install says success but nothing shows in Claude Desktop</summary>

Try these fixes in order:

**1. Fully kill Claude Desktop (most common fix on Windows)**

On Windows, closing the window doesn't quit Claude Desktop — it stays running in the background. Open **Task Manager** (Ctrl+Shift+Esc), find **Claude** in the process list, click **End Task**, then reopen Claude Desktop.

**2. Check Node.js is installed**

Open Terminal/Command Prompt and run `node -v`. If not found, download from [nodejs.org](https://nodejs.org), install it, then try clicking "Install in Claude Desktop" again.

**3. Windows: config file in wrong location**

On Windows, Claude Desktop installs as an MSIX package and reads config from a different location than expected. Update to the latest SEO Utils version (v1.45+) which automatically detects the correct path.

If you're on an older version, manually create `claude_desktop_config.json` at:

```
C:\Users\<YourUsername>\AppData\Local\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\
```

instead of `%APPDATA%\Claude\`. Copy the config from SEO Utils Settings → MCP Server → Manual Config.

</details>

<details>

<summary>SyntaxError: Unexpected token { / Cannot find module 'node:path'</summary>

Claude Desktop is using an old version of Node.js. This commonly happens when you use **nvm** (Node Version Manager) — your terminal has the correct version, but Claude Desktop doesn't load nvm's shell config and picks up an older Node.js instead.

**Fix:** Edit your Claude Desktop config file and set both the full path to npx AND the PATH environment variable:

1. Run `which npx` in your terminal to get the path (e.g., `/Users/yourname/.nvm/versions/node/v22.18.0/bin/npx`)
2. Open your Claude Desktop config:
   * **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
   * **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
3. Update the `seo-utils` entry:

```json
{
  "mcpServers": {
    "seo-utils": {
      "command": "/Users/yourname/.nvm/versions/node/v22.18.0/bin/npx",
      "args": ["-y", "mcp-remote@latest", "http://localhost:19515/mcp", "--header", "Authorization: Bearer YOUR_TOKEN_HERE", "--allow-http"],
      "env": {
        "PATH": "/Users/yourname/.nvm/versions/node/v22.18.0/bin:/usr/local/bin:/usr/bin:/bin"
      }
    }
  }
}
```

Replace `/Users/yourname/.nvm/versions/node/v22.18.0` with your actual nvm path (run `which npx` to find it). Both the `command` and `PATH` must point to the same Node.js version.

4. Restart Claude Desktop

</details>

<details>

<summary>Queries return no data</summary>

Make sure you're in the correct workspace. Use the prompt "List my workspaces" to check which one is active, then switch if needed.

</details>

<details>

<summary>Does the auth token change when I restart SEO Utils?</summary>

No. The auth token is generated once and persists across restarts. You only need to set up the connection once — it will keep working after restarting SEO Utils or your computer.

The token only changes when you rotate it yourself via **Settings → MCP Server → Rotate token** (see [Rotating the Auth Token](#rotating-the-auth-token)). After a rotation, update your AI clients with the new token.

</details>


# SMTP Credentials

### What Are SMTP Credentials?

SMTP credentials allow SEO Utils to send automated emails through your email server. This is essential for automating report delivery to clients and team members.

### Setting Up SMTP Credentials

To configure email sending capabilities, navigate to **SMTP** in the left sidebar and click **Add Credential**.

<figure><img src="/files/BcP8bkjGFNsuypmfabSH" alt=""><figcaption><p>SMTP Credentials management interface</p></figcaption></figure>

#### Configuration Fields

Fill in the following settings based on your email provider:

**Basic Settings:**

* **Credential Name**: A friendly name to identify this configuration (e.g., "Main Gmail Account")
* **Default Credential**: Toggle on to use this as the default for all email automations

**Server Settings:**

* **SMTP Host**: Your email server address (see provider settings below)
* **Port**: Usually `587` for TLS or `465` for SSL
* **Encryption**: Select TLS/STARTTLS (recommended) or SSL

**Authentication:**

* **Username**: Your email address or username
* **Password**: Your email password or app-specific password

{% hint style="warning" %}
**Gmail Users**: You must use an [App Password](https://support.google.com/accounts/answer/185833) instead of your regular password. Enable 2-factor authentication first, then generate an app password.
{% endhint %}

**Sender Information:**

* **From Email**: The email address that appears as sender
* **From Name**: Optional display name (e.g., "SEO Reports")

#### Testing Your Configuration

Before saving, always test your SMTP settings:

1. Enter a **Test Email Address** where you can receive mail
2. Click **Send Test Email**
3. Check your inbox for the test message
4. If successful, click **Create Credential**

<figure><img src="/files/oE8yrp7Oie39Htl5L7iQ" alt=""><figcaption><p>Test your SMTP configuration before saving</p></figcaption></figure>

### Common Email Provider Settings

#### Gmail

* Host: `smtp.gmail.com`
* Port: `587`
* Encryption: `TLS`
* Username: Your Gmail address
* Password: [App Password](https://myaccount.google.com/apppasswords) (not regular password)

#### Microsoft 365/Outlook

* Host: `smtp.office365.com`
* Port: `587`
* Encryption: `TLS`
* Username: Your email address
* Password: Your password

#### SendGrid

* Host: `smtp.sendgrid.net`
* Port: `587` (or `465` for SSL, `2525` as alternative)
* Encryption: `TLS`
* Username: `apikey` (literal string, not your username)
* Password: Your SendGrid API key

#### Mailgun

* Host: `smtp.mailgun.org`
* Port: `587` (or `2525` as alternative)
* Encryption: `TLS`
* Username: Your Mailgun email address
* Password: Your Mailgun API key

{% hint style="info" %}
**Tip**: Port `2525` is an alternative port offered by SendGrid and Mailgun if your ISP blocks standard ports. It works identically to port 587 with TLS encryption.
{% endhint %}

#### Custom/Business Email

Contact your IT administrator or hosting provider for:

* SMTP server address
* Port number
* Authentication requirements
* Encryption method

### Using SMTP in Automations

Once configured, your SMTP credentials are automatically available in the Automations tool. When creating an email action, simply:

1. Select **Send Email** as the action type
2. The system will use your default SMTP credential
3. Configure recipient, subject, and message content
4. Add attachments using variables like `{{pdf_export_path}}`

See the [Automations guide](/guide/automations) for detailed examples of email automation workflows.

### Troubleshooting

**Test email fails:**

* Verify your username and password are correct
* For Gmail, ensure you're using an App Password
* For SendGrid, use `apikey` as username (not your email)
* Check if your email provider requires specific security settings
* Try alternative ports (2525 for Mailgun/SendGrid if 587 is blocked)

**Emails not sending in automations:**

* Confirm the SMTP credential is marked as default
* Check automation execution logs for specific error messages
* Verify recipient email addresses are valid

**Connection timeout:**

* Your firewall or ISP may be blocking the SMTP port
* Try port 2525 as an alternative for SendGrid/Mailgun
* Try using port 465 with SSL encryption instead of 587/TLS


# Privacy Policy

Last Updated: November, 20th 2023

**1. Introduction**

* This Privacy Policy applies to all information collected through our desktop application, SEO Utils ("Service"), and any related services, sales, marketing, or events.

**2. Information We Collect**

* We may collect personal information that you voluntarily provide to us when registering to use our Service, expressing an interest in obtaining information about us or our products and services, or otherwise contacting us.
* The personal information we collect depends on the context of your interactions with us and the Service, the choices you make, and the features you use.

**3. How We Use Your Information**

* We use personal information collected via our Service for a variety of business purposes, such as:
  * To facilitate the creation and securing of your account on our Service.
  * To post testimonials with your consent.
  * To enforce our terms, conditions, and policies.
  * For other business purposes, such as data analysis, identifying usage trends, determining the effectiveness of our promotional campaigns, and to evaluate and improve our Service, products, marketing, and your experience.

**4. Sharing Your Information**

* We may share your information with our service providers, in connection with any business transfers, to comply with laws, to protect your rights, or with your consent.

**5. Cookies and Similar Technologies**

* We may use cookies and similar tracking technologies to access or store information.

**6. Data Security**

* We have implemented appropriate technical and organizational security measures designed to protect the security of any personal information we process.

**7. Data Retention**

* We will only retain your personal information for as long as necessary for the purposes set out in this Privacy Policy.

**8. Privacy Rights**

* Depending on your location, you may have rights under applicable data protection laws in relation to your personal data, such as the right to request access, correction, or deletion of your personal data.

**9. Policy Updates**

* We may update this Privacy Policy from time to time. The updated version will be indicated by an updated "Revised" date and the updated version will be effective as soon as it is accessible.

**10. Contact Us**

* If you have questions or comments about this policy, you may [email us](mailto:me@phuclh.com).


# Terms of Service

Last Updated: November, 20th 2023

**1. Acceptance of Terms**

* By downloading, accessing, or using SEO Utils, you agree to be bound by these Terms and Conditions ("Terms"). If you do not agree with these Terms, you must not use this application.

**2. Use of the Application**

* This application is intended for use in managing and improving the SEO of websites.
* Users must ensure that their use of the application complies with all applicable laws and regulations.
* The application should not be used for any unlawful purposes or in a way that violates the rights of others.

**3. Intellectual Property**

* All content, features, and functionality (including but not limited to all information, software, text, displays, images, and the design) are owned by SEO Utils or its licensors.

**4. User Obligations**

* Users must provide accurate and complete registration information and keep this information up to date.
* Users are responsible for maintaining the confidentiality of their license keys.
* Any unauthorized use of the application or breach of these Terms must be immediately reported to SEO Utils.

**5. Prohibited Activities**

* Users may not engage in activities that harm, disrupt, or otherwise negatively affect the operation of the application or the enjoyment of other users.
* Reverse engineering, decompiling, or disassembling the application is prohibited.
* Distributing, selling, or otherwise transferring your rights under these Terms to third parties is not allowed.

**6. Disclaimer of Warranties**

* SEO Utils is provided "as is" without any warranties, express or implied, including but not limited to implied warranties of merchantability or fitness for a particular purpose.

**7. Limitation of Liability**

* SEO Utils will not be liable for any indirect, incidental, special, consequential, or punitive damages arising out of or in connection with your access to or use of the application.

**8. Modifications to the Terms**

* SEO Utils reserves the right, at its sole discretion, to modify or replace these Terms at any time. If a revision is material, we will provide at least 30 days' notice prior to any new terms taking effect.

**9. Governing Law**

* These Terms shall be governed and construed in accordance with the laws of Washington, without regard to its conflict of law provisions.

**10. Contact Information**

* If you have any questions about these Terms, please contact us at [me@phuclh.com](/legal/terms-of-service).

***


