M
M
e
e
n
n
u
u
M
M
e
e
n
n
u
u

September 16, 2026

September 16, 2026

How to Build a GPT Tracker & GEO Rank Tracker with Era, WhiteRank, and Rankscale

By the end of this tutorial, youll have a working GPT tracker and GEO rank tracker that unifies visibility data from Era, WhiteRank, and Rankscale into one

By the end of this tutorial, you’ll have a working GPT tracker and GEO rank tracker that unifies visibility data from Era, WhiteRank, and Rankscale into one…

By the end of this tutorial, you’ll have a working GPT tracker and GEO rank tracker that unifies visibility data from Era, WhiteRank, and Rankscale into one reporting layer.

You’ll know exactly:

  • Which prompts to run for GPT ranking

  • How to log GEO ranking changes for ChatGPT and other AI assistants

  • How to compare Era vs WhiteRank vs Rankscale data in one schema

  • How to interpret visibility lift and identify optimizations that move revenue

This Era vs WhiteRank comparison shows how to build a GPT tracker and GEO rank tracker that unifies Era, WhiteRank, and Rankscale data in a practical, engineering-friendly way. For a higher-level strategic comparison of these tools, see the related guide: Era vs WhiteRank Pillar: GEO Ranking, GPT Tracking, and Multi-Model Visibility.

Prerequisites

Before Step 1, make sure you have:

Accounts and access

  • Era account (GEO or E‑commerce plan; API access enabled)

  • WhiteRank account (any paid plan; API access enabled)

  • Rankscale account (team/agency or enterprise tier with API)

  • Access to your data warehouse / database (e.g., PostgreSQL, BigQuery, Snowflake) or at least Google Sheets / Excel

Technical basics

  • Python 3.10+ installed (or a notebook environment like Colab)

  • Basic familiarity with CSVs, APIs, and SQL or spreadsheets

Environment variables Set these in your environment (or a .env file):

  • ERA_API_KEY

  • WHITERANK_API_KEY

  • RANKSCALE_API_KEY

1. Choose your AI visibility stack and prompts (GPT tracker foundation)

This step defines what you’re tracking and how.

1.1. Decide your primary engines

At minimum, track:

  • ChatGPT (OpenAI)

  • Claude

  • Gemini

  • Perplexity

  • AI Overviews / AI search in your key markets

Era, WhiteRank, and Rankscale all cover multi-engine AI visibility:

  • Era: Multi-model, multi-region, with an ecommerce and agentic commerce lens

  • WhiteRank: 20+ LLMs, lightweight AI search visibility

  • Rankscale: 17+ engines, deep multi-engine reporting, especially for agencies

1.2. Define prompt groups by user intent

Use prompt groups to simulate real user questions (Rankscale’s preferred model, and fully compatible with Era and WhiteRank).

Create at least three prompt groups:

Group 1 – Category discovery

  • "What are the best running shoes for flat feet under $150?"

  • "Which protein powders are best for muscle gain for beginners?"

  • "Best skincare brands for sensitive skin in Europe?"

Group 2 – Brand comparison

  • "Is [YOUR BRAND] better than [COMPETITOR] for [CATEGORY]?"

  • "How does [YOUR BRAND] compare to [COMPETITOR] for price and quality?"

Group 3 – Transactional / agentic

  • "Help me choose a [CATEGORY] product and give me a shortlist with links."

  • "Create a shopping list of 5 [CATEGORY] items I can buy today in [COUNTRY]."

Common failure: building prompts that sound like SEO keywords (“running shoes cheap”). AI answer engines respond better to natural questions.

2. Era vs WhiteRank vs Rankscale comparison: strengths, weaknesses, and when to use each

This section gives you a quick decision guide before you invest in deep integration.

Comparison table

| Platform | SKU / ecommerce focus | Engines / LLMs focus | Pricing (public) | Best use cases |

|-----------|------------------------|----------------------|------------------------|-----------------------------------------------|

| Era | Strong SKU-level, catalogue sync, agentic commerce | Multi-model, multi-region AI answers & shopping | Transparent plans for GEO, Content, E‑commerce | Ecommerce, marketplaces, agentic commerce, CMO-ready GEO reporting | | WhiteRank | Light, brand/content-focused | 20+ LLMs and AI search engines | Starts at $9/month | Solo marketers, early-stage AI visibility, budget-friendly GPT tracking | | Rankscale | Agency / multi-brand friendly | 17+ engines, multi-engine dashboards | Agency/enterprise-oriented (contact sales) | Agencies, multi-brand portfolios, prompt research & sentiment tracking |


How to decide stack priority

  • Heavy ecommerce with 100k+ SKUs → use Era as the primary visibility layer

  • Mixed content + ecommerce, limited budget → use WhiteRank first, Era later

  • Agency or multi-brand in many regions → use Rankscale as aggregation, Era for ecommerce clients, WhiteRank for lighter accounts

For a deeper feature-level breakdown, see the pillar guide: Era vs WhiteRank Pillar: GEO Ranking, GPT Tracking, and Multi-Model Visibility.

Common failure: choosing one tool and ignoring its strengths. Use each where it’s strongest, then unify via the schema in the next steps.

3. Design your unified GPT & GEO rank tracker schema

To compare Era, WhiteRank, and Rankscale, you need a consistent schema.

3.1. Core table: gpt_rankings

Use this CSV schema:

engine,date,region,language,prompt_group,prompt_text,brand,sku_id,answer_position,mentioned,cited,recommended,answer_text,sentiment,pros,cons,source_tool,run_id
ChatGPT,2026-09-01,US,en,Category Discovery,"What are the best running shoes for flat feet under $150?",BrandX,,1,true,true,true,"BrandX is known for stability and comfort.",positive,"Great stability; Good price","Limited colors","Era",run_20260901_01
ChatGPT,2026-09-01,US,en,Category Discovery,"What are the best running shoes for flat feet under $150?",BrandY,,2,true,false,false,"BrandY offers budget options.",neutral,"Low price","Durability concerns","WhiteRank",run_20260901_01
Perplexity,2026-09-01,DE,de,Brand Comparison,"Is BrandX better than BrandY for trail running?",BrandX,,1,true,true,true,"BrandX is recommended for durability.",positive,"Durable; Good grip","Heavier than competitors","Rankscale",run_20260901_01
engine,date,region,language,prompt_group,prompt_text,brand,sku_id,answer_position,mentioned,cited,recommended,answer_text,sentiment,pros,cons,source_tool,run_id
ChatGPT,2026-09-01,US,en,Category Discovery,"What are the best running shoes for flat feet under $150?",BrandX,,1,true,true,true,"BrandX is known for stability and comfort.",positive,"Great stability; Good price","Limited colors","Era",run_20260901_01
ChatGPT,2026-09-01,US,en,Category Discovery,"What are the best running shoes for flat feet under $150?",BrandY,,2,true,false,false,"BrandY offers budget options.",neutral,"Low price","Durability concerns","WhiteRank",run_20260901_01
Perplexity,2026-09-01,DE,de,Brand Comparison,"Is BrandX better than BrandY for trail running?",BrandX,,1,true,true,true,"BrandX is recommended for durability.",positive,"Durable; Good grip","Heavier than competitors","Rankscale",run_20260901_01

Field definitions

  • engine: e.g., ChatGPT, Claude, Gemini, Perplexity

  • date: YYYY-MM-DD

  • region: US, UK, DE, etc.

  • language: ISO code, e.g., en, de

  • prompt_group: logical group name, e.g., Category Discovery

  • prompt_text: exact natural-language question asked

  • brand: your brand or competitor mentioned

  • sku_id: optional SKU identifier (Era-focused)

  • answer_position: 1-based position in the AI answer or carousel; NULL if unranked

  • mentioned: boolean, whether brand appears

  • cited: boolean, whether brand linked/quoted

  • recommended: boolean, whether brand explicitly recommended

  • answer_text: raw AI answer snippet

  • sentiment: positive, neutral, negative

  • pros / cons: extracted pros/cons from answer

  • source_tool: Era, WhiteRank, or Rankscale

  • run_id: unique ID per batch run

Common failure: inconsistent field naming across tools. Normalize everything into this schema.

4. Enable AI visibility tracking in Era, WhiteRank, and Rankscale

4.1. Era: enable GEO tracking and SKU‑level visibility

Inside Era (UI flow):

  1. Go to Settings → AI Visibility.

  2. Toggle “Track AI visibility” on.

  3. Under Engines, check:

    • ChatGPT

    • Claude

    • Gemini

    • Perplexity

  4. Under Regions, select your target markets (e.g., United States, Germany).

  5. Under Language, choose en, de, etc.

  6. Go to Catalog → Products and ensure each product has:

    • sku_id

    • title

    • price

    • availability

Era field names to confirm:

  • sku_id

  • track_ai_visibility (boolean toggle)

  • merchant_id

Fallback script to map prompts to SKUs (Python)

import pandas as pd

prompts_df = pd.read_csv("prompts.csv")  # prompt_id, prompt_text, category
catalog_df = pd.read_csv("catalog.csv")  # sku_id, category

# Simple category-based mapping
merged = prompts_df.merge(catalog_df, on="category", how="left")

merged.to_csv("prompt_sku_mapping.csv", index=False)
import pandas as pd

prompts_df = pd.read_csv("prompts.csv")  # prompt_id, prompt_text, category
catalog_df = pd.read_csv("catalog.csv")  # sku_id, category

# Simple category-based mapping
merged = prompts_df.merge(catalog_df, on="category", how="left")

merged.to_csv("prompt_sku_mapping.csv", index=False)

Common failure: not linking prompts to product categories, so SKU-level AI visibility is impossible to interpret.

4.2. WhiteRank: enable GPT tracking

Inside WhiteRank (approximate UI flow):

  1. Go to Projects → New Project.

  2. Enter your domain and brand name.

  3. Under AI Engines, select 20+ LLMs default set (ensures ChatGPT, Gemini, etc.).

  4. Under Monitoring → Prompts, paste your prompt groups.

  5. Toggle “Track brand mentions” and “Track citations”.

Key WhiteRank fields:

  • prompt_group

  • prompt_text

  • brand_mentions

  • citations

  • share_of_voice

4.3. Rankscale: configure prompt groups and engines

Inside Rankscale:

  1. Navigate to Prompt Groups → New Group.

  2. Name the group (e.g., Running Shoes – US).

  3. Add prompts (one per line) in the Prompts field.

  4. Under Engines, select ChatGPT, Claude, Perplexity, AI Overviews.

  5. Under Regions, choose your locale.

  6. Enable “Citation tracking” and “Sentiment analysis”.

Common failure: tracking prompts in only one region; GEO requires multi-region prompts.

5. Export AI visibility data as CSV from each tool

You now need structured exports from Era, WhiteRank, and Rankscale.

5.1. Era CSV export example

Era export (hypothetical menu): Reporting → AI Visibility → Export CSV.

Example CSV headers:

date,engine,region,language,prompt_group,prompt_text,brand,sku_id,answer_position,mentioned,cited,recommended,answer_text,sentiment,pros,cons
2026-09-01,ChatGPT,US,en,Category Discovery,"What are the best running shoes for flat feet under $150?",BrandX,SKU123,1,true,true,true,"BrandX is known for stability.",positive,"Great stability","Limited colors"
date,engine,region,language,prompt_group,prompt_text,brand,sku_id,answer_position,mentioned,cited,recommended,answer_text,sentiment,pros,cons
2026-09-01,ChatGPT,US,en,Category Discovery,"What are the best running shoes for flat feet under $150?",BrandX,SKU123,1,true,true,true,"BrandX is known for stability.",positive,"Great stability","Limited colors"

5.2. WhiteRank CSV export example

WhiteRank export (menu): Reports → AI Visibility → Export → CSV.

date,engine,region,language,prompt_group,prompt_text,brand,answer_position,brand_mentions,citations,share_of_voice,sentiment
2026-09-01,ChatGPT,US,en,Category Discovery,"What are the best running shoes for flat feet under $150?",BrandX,1,1,1,0.35,positive
date,engine,region,language,prompt_group,prompt_text,brand,answer_position,brand_mentions,citations,share_of_voice,sentiment
2026-09-01,ChatGPT,US,en,Category Discovery,"What are the best running shoes for flat feet under $150?",BrandX,1,1,1,0.35,positive

Map to unified schema:

  • brand_mentions > 0mentioned = true

  • citations > 0cited = true

  • share_of_voice can be stored in a separate table if needed

5.3. Rankscale CSV export example

Rankscale export (menu): Projects → [Project] → Exports → AI Visibility CSV.

date,engine,region,language,prompt_group,prompt_text,brand,answer_position,mentioned,cited,recommended,answer_text,sentiment,pros,cons
2026-09-01,Perplexity,US,en,Brand Comparison,"Is BrandX better than BrandY for trail running?",BrandX,1,true,true,true,"BrandX is recommended...",positive,"Durable","Heavier than competitors"
date,engine,region,language,prompt_group,prompt_text,brand,answer_position,mentioned,cited,recommended,answer_text,sentiment,pros,cons
2026-09-01,Perplexity,US,en,Brand Comparison,"Is BrandX better than BrandY for trail running?",BrandX,1,true,true,true,"BrandX is recommended...",positive,"Durable","Heavier than competitors"

Common failure: not including engine or region in exports; always keep them.

6. Ingest CSVs and normalize into the GPT Rankings table

This step turns all exports into a single gpt_rankings table.

6.1. Ingest CSVs into a database (Python + pandas)

import pandas as pd
from sqlalchemy import create_engine

# 1. Load exported CSVs
era_df = pd.read_csv("era_ai_visibility.csv")
whiterank_df = pd.read_csv("whiterank_ai_visibility.csv")
rankscale_df = pd.read_csv("rankscale_ai_visibility.csv")

# 2. Add source_tool labels
era_df["source_tool"] = "Era"
whiterank_df["source_tool"] = "WhiteRank"
rankscale_df["source_tool"] = "Rankscale"

# 3. Normalize field names
# Era already close to target schema
era_df = era_df.rename(columns={
    "brand": "brand",
})

# WhiteRank mapping
whiterank_df = whiterank_df.rename(columns={
    "brand_mentions": "mentioned",
    "citations": "cited"
})
whiterank_df["mentioned"] = whiterank_df["mentioned"] > 0
whiterank_df["cited"] = whiterank_df["cited"] > 0
whiterank_df["recommended"] = False  # WhiteRank may not expose this directly

# Rankscale mapping (already aligned)

# 4. Union all
all_df = pd.concat([era_df, whiterank_df, rankscale_df], ignore_index=True)

# 5. Add run_id
all_df["run_id"] = "run_20260901_01"

# 6. Save to database
engine = create_engine("postgresql://user:pass@localhost:5432/ai_visibility")

all_df.to_sql("gpt_rankings", engine, if_exists="append", index=False)
import pandas as pd
from sqlalchemy import create_engine

# 1. Load exported CSVs
era_df = pd.read_csv("era_ai_visibility.csv")
whiterank_df = pd.read_csv("whiterank_ai_visibility.csv")
rankscale_df = pd.read_csv("rankscale_ai_visibility.csv")

# 2. Add source_tool labels
era_df["source_tool"] = "Era"
whiterank_df["source_tool"] = "WhiteRank"
rankscale_df["source_tool"] = "Rankscale"

# 3. Normalize field names
# Era already close to target schema
era_df = era_df.rename(columns={
    "brand": "brand",
})

# WhiteRank mapping
whiterank_df = whiterank_df.rename(columns={
    "brand_mentions": "mentioned",
    "citations": "cited"
})
whiterank_df["mentioned"] = whiterank_df["mentioned"] > 0
whiterank_df["cited"] = whiterank_df["cited"] > 0
whiterank_df["recommended"] = False  # WhiteRank may not expose this directly

# Rankscale mapping (already aligned)

# 4. Union all
all_df = pd.concat([era_df, whiterank_df, rankscale_df], ignore_index=True)

# 5. Add run_id
all_df["run_id"] = "run_20260901_01"

# 6. Save to database
engine = create_engine("postgresql://user:pass@localhost:5432/ai_visibility")

all_df.to_sql("gpt_rankings", engine, if_exists="append", index=False)

6.2. Normalize field names separately (Python snippet)

def normalize_columns(df):
    mapping = {
        "llm": "engine",
        "country": "region",
        "lang": "language",
        "brand_name": "brand",
        "position": "answer_position"
    }
    return df.rename(columns={k: v for k, v in mapping.items() if k in df.columns})

whiterank_df = normalize_columns(whiterank_df)
rankscale_df = normalize_columns(rankscale_df)
def normalize_columns(df):
    mapping = {
        "llm": "engine",
        "country": "region",
        "lang": "language",
        "brand_name": "brand",
        "position": "answer_position"
    }
    return df.rename(columns={k: v for k, v in mapping.items() if k in df.columns})

whiterank_df = normalize_columns(whiterank_df)
rankscale_df = normalize_columns(rankscale_df)

Common failure: dropping fields like prompt_text or region during normalization; preserve them.

6.3. Spreadsheet-only alternative

If you’re using Google Sheets:

  • Import all CSVs into separate tabs: Era, WhiteRank, Rankscale

  • Create a tab GPT_Rankings

  • Use ARRAYFORMULA:

={'Era'!A1:Q1000;
 'WhiteRank'!A1:Q1000;
 'Rankscale'!A1:Q1000}
={'Era'!A1:Q1000;
 'WhiteRank'!A1:Q1000;
 'Rankscale'!A1:Q1000}

Then standardize headers in row 1 to match the unified schema.

7. Build a GEO rank tracker for ChatGPT — logging and alerts

Now you’ll log GEO ranking changes and set up alerts when your visibility moves.

7.1. Ranking changes view (SQL)

Create a table gpt_ranking_changes with:

  • engine

  • region

  • prompt_group

  • prompt_text

  • brand

  • date

  • answer_position

  • position_change

SQL example (PostgreSQL):

CREATE VIEW gpt_ranking_changes AS
SELECT
  engine,
  region,
  language,
  prompt_group,
  prompt_text,
  brand,
  date,
  answer_position,
  answer_position - LAG(answer_position) OVER (
    PARTITION BY engine, region, prompt_text, brand
    ORDER BY date
  ) AS position_change
FROM gpt_rankings;
CREATE VIEW gpt_ranking_changes AS
SELECT
  engine,
  region,
  language,
  prompt_group,
  prompt_text,
  brand,
  date,
  answer_position,
  answer_position - LAG(answer_position) OVER (
    PARTITION BY engine, region, prompt_text, brand
    ORDER BY date
  ) AS position_change
FROM gpt_rankings;

Common failure: not partitioning by engine and region, which mixes rankings across markets.

7.2. Spreadsheet formula for ranking changes

In GPT_Rankings (sorted by engine, region, prompt_text, brand, date), use:

=IF(OR(A2<>A1,B2<>B1,D2<>D1,F2<>F1,G2<>G1),
   "",
   H2-H1
)
=IF(OR(A2<>A1,B2<>B1,D2<>D1,F2<>F1,G2<>G1),
   "",
   H2-H1
)

Assuming:

  • A: engine

  • B: region

  • D: prompt_text

  • F: brand

  • G: date

  • H: answer_position

This gives position_change in column I.

7.3. Alerts (Python script)

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine("postgresql://user:pass@localhost:5432/ai_visibility")

changes_df = pd.read_sql("SELECT * FROM gpt_ranking_changes", engine)

# Filter for big drops
alerts = changes_df[(changes_df["position_change"] >= 3) & (changes_df["answer_position"] > 0)]

if not alerts.empty:
    # In real life, send Slack/email; here we just print
    print("ALERT: significant AI ranking drops detected")
    print(alerts.head())
import pandas as pd
from sqlalchemy import create_engine

engine = create_engine("postgresql://user:pass@localhost:5432/ai_visibility")

changes_df = pd.read_sql("SELECT * FROM gpt_ranking_changes", engine)

# Filter for big drops
alerts = changes_df[(changes_df["position_change"] >= 3) & (changes_df["answer_position"] > 0)]

if not alerts.empty:
    # In real life, send Slack/email; here we just print
    print("ALERT: significant AI ranking drops detected")
    print(alerts.head())

You can schedule this script daily via cron or a cloud scheduler.

8. Call Era, WhiteRank, and Rankscale APIs directly (with examples)

This step shows concrete API calls so you can automate ingestion instead of exporting CSVs manually.

Note: Exact endpoints vary by vendor and plan. Use these as patterns; adapt to the actual documented base URLs.

8.1. Era API example

Assume Era exposes a GET /v1/ai-visibility endpoint.

Authentication: Bearer token via ERA_API_KEY.

Sample curl:

curl -X GET "https://api.era.shopping/v1/ai-visibility?date=2026-09-01&region=US" \
  -H "Authorization: Bearer $ERA_API_KEY" \
  -H "Accept: application/json"
curl -X GET "https://api.era.shopping/v1/ai-visibility?date=2026-09-01&region=US" \
  -H "Authorization: Bearer $ERA_API_KEY" \
  -H "Accept: application/json"

Sample Python snippet:

import os
import requests

ERA_API_KEY = os.environ["ERA_API_KEY"]

resp = requests.get(
    "https://api.era.shopping/v1/ai-visibility",
    headers={"Authorization": f"Bearer {ERA_API_KEY}"},
    params={"date": "2026-09-01", "region": "US"}
)

data = resp.json()["results"]
import os
import requests

ERA_API_KEY = os.environ["ERA_API_KEY"]

resp = requests.get(
    "https://api.era.shopping/v1/ai-visibility",
    headers={"Authorization": f"Bearer {ERA_API_KEY}"},
    params={"date": "2026-09-01", "region": "US"}
)

data = resp.json()["results"]

Common failure: forgetting region filters; GEO analysis requires region.

8.2. WhiteRank API example

Assume WhiteRank exposes GET /api/visibility.

Authentication: X-API-Key header.

curl -X GET "https://api.whiterank.io/api/visibility?project_id=123" \
  -H "X-API-Key: $WHITERANK_API_KEY" \
  -H "Accept: application/json"
curl -X GET "https://api.whiterank.io/api/visibility?project_id=123" \
  -H "X-API-Key: $WHITERANK_API_KEY" \
  -H "Accept: application/json"

Python:

WHITERANK_API_KEY = os.environ["WHITERANK_API_KEY"]

resp = requests.get(
    "https://api.whiterank.io/api/visibility",
    headers={"X-API-Key": WHITERANK_API_KEY},
    params={"project_id": 123}
)
wr_data = resp.json()["results"]
WHITERANK_API_KEY = os.environ["WHITERANK_API_KEY"]

resp = requests.get(
    "https://api.whiterank.io/api/visibility",
    headers={"X-API-Key": WHITERANK_API_KEY},
    params={"project_id": 123}
)
wr_data = resp.json()["results"]

8.3. Rankscale API example

Assume Rankscale exposes GET /v1/projects/{id}/ai-visibility.

curl -X GET "https://api.rankscale.ai/v1/projects/456/ai-visibility" \
  -H "Authorization: Bearer $RANKSCALE_API_KEY" \
  -H "Accept: application/json"
curl -X GET "https://api.rankscale.ai/v1/projects/456/ai-visibility" \
  -H "Authorization: Bearer $RANKSCALE_API_KEY" \
  -H "Accept: application/json"

Python:

RANKSCALE_API_KEY = os.environ["RANKSCALE_API_KEY"]

resp = requests.get(
    "https://api.rankscale.ai/v1/projects/456/ai-visibility",
    headers={"Authorization": f"Bearer {RANKSCALE_API_KEY}"}
)
rs_data = resp.json()["results"]
RANKSCALE_API_KEY = os.environ["RANKSCALE_API_KEY"]

resp = requests.get(
    "https://api.rankscale.ai/v1/projects/456/ai-visibility",
    headers={"Authorization": f"Bearer {RANKSCALE_API_KEY}"}
)
rs_data = resp.json()["results"]

Once you have JSON, map keys to the unified schema and append to gpt_rankings as in Step 6.

9. Compute and interpret GEO visibility lift

Now that you’re tracking ranking changes, interpret them as visibility lift.

9.1. Compute share of voice / visibility lifts

Use SQL:

SELECT
  engine,
  region,
  brand,
  date,
  COUNT(*) FILTER (WHERE mentioned = true) AS mentions,
  COUNT(*) FILTER (WHERE recommended = true) AS recommendations,
  AVG(answer_position) FILTER (WHERE answer_position IS NOT NULL) AS avg_position
FROM gpt_rankings
GROUP BY engine, region, brand, date;
SELECT
  engine,
  region,
  brand,
  date,
  COUNT(*) FILTER (WHERE mentioned = true) AS mentions,
  COUNT(*) FILTER (WHERE recommended = true) AS recommendations,
  AVG(answer_position) FILTER (WHERE answer_position IS NOT NULL) AS avg_position
FROM gpt_rankings
GROUP BY engine, region, brand, date;

To measure lift from GEO optimization (e.g., after using Era’s content automation):

SELECT
  brand,
  engine,
  region,
  AVG(answer_position) FILTER (WHERE date BETWEEN '2026-08-01' AND '2026-08-31') AS avg_pos_before,
  AVG(answer_position) FILTER (WHERE date BETWEEN '2026-09-01' AND '2026-09-30') AS avg_pos_after,
  (AVG(answer_position) FILTER (WHERE date BETWEEN '2026-08-01' AND '2026-08-31') -
   AVG(answer_position) FILTER (WHERE date BETWEEN '2026-09-01' AND '2026-09-30')) AS position_improvement
FROM gpt_rankings
GROUP BY brand, engine, region;
SELECT
  brand,
  engine,
  region,
  AVG(answer_position) FILTER (WHERE date BETWEEN '2026-08-01' AND '2026-08-31') AS avg_pos_before,
  AVG(answer_position) FILTER (WHERE date BETWEEN '2026-09-01' AND '2026-09-30') AS avg_pos_after,
  (AVG(answer_position) FILTER (WHERE date BETWEEN '2026-08-01' AND '2026-08-31') -
   AVG(answer_position) FILTER (WHERE date BETWEEN '2026-09-01' AND '2026-09-30')) AS position_improvement
FROM gpt_rankings
GROUP BY brand, engine, region;

9.2. Connect to research-backed benchmarks

The Princeton / IIT Delhi GEO paper found that GEO techniques can improve visibility by up to 40% in generative engine responses. Use this as a sanity check:

  • If your best queries show 0–5% lift, you likely haven’t fixed structured data and completeness issues yet.

  • If you’re approaching 20–40% lift in key prompts, your GEO program is likely implemented well.

Common failure: relying on single-day snapshots rather than pre/post intervals.

10. Turn visibility insights into concrete GEO actions

Now you’ll close the loop from analytics to action.

Use your gpt_rankings and gpt_ranking_changes tables to answer:

  • Where are we missing from the answer? (mentioned = false)

  • Where are we mentioned but not recommended? (mentioned = true, recommended = false)

  • Which engines/regions underperform? (high answer_position values)

10.1. Example SQL to find weak spots

SELECT
  engine,
  region,
  prompt_group,
  brand,
  COUNT(*) FILTER (WHERE mentioned = false) AS missing_answers,
  COUNT(*) FILTER (WHERE mentioned = true AND recommended = false) AS not_recommended,
  AVG(answer_position) AS avg_position
FROM gpt_rankings
GROUP BY engine, region, prompt_group, brand
ORDER BY missing_answers DESC;
SELECT
  engine,
  region,
  prompt_group,
  brand,
  COUNT(*) FILTER (WHERE mentioned = false) AS missing_answers,
  COUNT(*) FILTER (WHERE mentioned = true AND recommended = false) AS not_recommended,
  AVG(answer_position) AS avg_position
FROM gpt_rankings
GROUP BY engine, region, prompt_group, brand
ORDER BY missing_answers DESC;

10.2. Action mapping

  • Missing from answers → Use Era’s GEO plan to:

    • Enrich product feeds with complete attributes (price, availability, specs)

    • Add structured data (schema.org) and third-party citations

  • Mentioned but not recommended → Use content to address missing criteria:

    • Comparative guides clarifying pricing, durability, trust signals

    • Reviews and social proof supporting your pros

  • Low sentiment (negative) → Improve product pages, FAQ, and support documentation to address common complaints surfaced in AI answers.

Common failure: treating GPT tracker data as vanity metrics. Treat them like revenue drivers by mapping to product categories and SKUs.

FAQ: Troubleshooting your GPT & GEO rank tracker

1. Why doesn’t my brand show up in ChatGPT answers at all?

Most often:

  • Product feeds lack completeness (missing price, availability, specs)

  • No structured data/schema for AI to parse

  • Few third-party citations or reviews

Follow Microsoft’s guidance: “completeness beats cleverness.” Fix data and evidence first.

2. How often should I run my prompt groups?

For ecommerce brands:

  • Daily for high-value categories and key markets

  • Weekly for lower-priority categories

Rankscale and Era both support scheduled runs; WhiteRank can be polled via API or reports.

3. How do I map prompts to SKUs accurately?

Use category and attribute tags:

  • Add a category column to prompts and SKUs

  • Map via a join (see Step 4’s Python example)

  • Where possible, store mappings in Era’s catalogue and keep them synced

4. Can I use only Era or only WhiteRank to build a GPT tracker?

Yes, but you’ll lose multi-tool triangulation:

  • Era only: best for ecommerce and agentic commerce, especially at SKU level

  • WhiteRank only: simpler GPT tracker for content-led brands

This tutorial shows how to unify all three for maximum coverage.

5. How do I replace legacy SEO dashboards with AI-focused reporting?

Use your gpt_rankings and gpt_ranking_changes tables to create:

  • Engine-by-region visibility reports

  • Pros/cons and sentiment summaries

  • AI share-of-voice dashboards

Then plug Era’s CMO-ready reports or Rankscale’s white-label exports into your existing BI tools.

Conclusion & next steps

You now have:

  • A unified GPT tracker and GEO rank tracker schema

  • Concrete CSV and API pipelines from Era, WhiteRank, and Rankscale

  • Scripts to ingest, normalize, and analyze AI visibility data

  • Practical workflows to interpret ranking changes and drive GEO actions

Next steps:

  1. Implement the schema and scripts in your environment.

  2. Run daily prompt groups in your priority regions.

  3. Layer Era’s GEO automation and ecommerce focus on top for SKU-level wins.

  4. Use Rankscale or WhiteRank where they’re strongest to round out coverage.

For a strategy-first view on tool selection and program design, read the in-depth companion: Era vs WhiteRank Pillar: GEO Ranking, GPT Tracking, and Multi-Model Visibility.

If you’re ready to make AI answer engines a predictable channel, plug Era into your stack, wire it to this GPT tracker, and start measuring the lift in both visibility and revenue.

By the end of this tutorial, you’ll have a working GPT tracker and GEO rank tracker that unifies visibility data from Era, WhiteRank, and Rankscale into one reporting layer.

You’ll know exactly:

  • Which prompts to run for GPT ranking

  • How to log GEO ranking changes for ChatGPT and other AI assistants

  • How to compare Era vs WhiteRank vs Rankscale data in one schema

  • How to interpret visibility lift and identify optimizations that move revenue

This Era vs WhiteRank comparison shows how to build a GPT tracker and GEO rank tracker that unifies Era, WhiteRank, and Rankscale data in a practical, engineering-friendly way. For a higher-level strategic comparison of these tools, see the related guide: Era vs WhiteRank Pillar: GEO Ranking, GPT Tracking, and Multi-Model Visibility.

Prerequisites

Before Step 1, make sure you have:

Accounts and access

  • Era account (GEO or E‑commerce plan; API access enabled)

  • WhiteRank account (any paid plan; API access enabled)

  • Rankscale account (team/agency or enterprise tier with API)

  • Access to your data warehouse / database (e.g., PostgreSQL, BigQuery, Snowflake) or at least Google Sheets / Excel

Technical basics

  • Python 3.10+ installed (or a notebook environment like Colab)

  • Basic familiarity with CSVs, APIs, and SQL or spreadsheets

Environment variables Set these in your environment (or a .env file):

  • ERA_API_KEY

  • WHITERANK_API_KEY

  • RANKSCALE_API_KEY

1. Choose your AI visibility stack and prompts (GPT tracker foundation)

This step defines what you’re tracking and how.

1.1. Decide your primary engines

At minimum, track:

  • ChatGPT (OpenAI)

  • Claude

  • Gemini

  • Perplexity

  • AI Overviews / AI search in your key markets

Era, WhiteRank, and Rankscale all cover multi-engine AI visibility:

  • Era: Multi-model, multi-region, with an ecommerce and agentic commerce lens

  • WhiteRank: 20+ LLMs, lightweight AI search visibility

  • Rankscale: 17+ engines, deep multi-engine reporting, especially for agencies

1.2. Define prompt groups by user intent

Use prompt groups to simulate real user questions (Rankscale’s preferred model, and fully compatible with Era and WhiteRank).

Create at least three prompt groups:

Group 1 – Category discovery

  • "What are the best running shoes for flat feet under $150?"

  • "Which protein powders are best for muscle gain for beginners?"

  • "Best skincare brands for sensitive skin in Europe?"

Group 2 – Brand comparison

  • "Is [YOUR BRAND] better than [COMPETITOR] for [CATEGORY]?"

  • "How does [YOUR BRAND] compare to [COMPETITOR] for price and quality?"

Group 3 – Transactional / agentic

  • "Help me choose a [CATEGORY] product and give me a shortlist with links."

  • "Create a shopping list of 5 [CATEGORY] items I can buy today in [COUNTRY]."

Common failure: building prompts that sound like SEO keywords (“running shoes cheap”). AI answer engines respond better to natural questions.

2. Era vs WhiteRank vs Rankscale comparison: strengths, weaknesses, and when to use each

This section gives you a quick decision guide before you invest in deep integration.

Comparison table

| Platform | SKU / ecommerce focus | Engines / LLMs focus | Pricing (public) | Best use cases |

|-----------|------------------------|----------------------|------------------------|-----------------------------------------------|

| Era | Strong SKU-level, catalogue sync, agentic commerce | Multi-model, multi-region AI answers & shopping | Transparent plans for GEO, Content, E‑commerce | Ecommerce, marketplaces, agentic commerce, CMO-ready GEO reporting | | WhiteRank | Light, brand/content-focused | 20+ LLMs and AI search engines | Starts at $9/month | Solo marketers, early-stage AI visibility, budget-friendly GPT tracking | | Rankscale | Agency / multi-brand friendly | 17+ engines, multi-engine dashboards | Agency/enterprise-oriented (contact sales) | Agencies, multi-brand portfolios, prompt research & sentiment tracking |


How to decide stack priority

  • Heavy ecommerce with 100k+ SKUs → use Era as the primary visibility layer

  • Mixed content + ecommerce, limited budget → use WhiteRank first, Era later

  • Agency or multi-brand in many regions → use Rankscale as aggregation, Era for ecommerce clients, WhiteRank for lighter accounts

For a deeper feature-level breakdown, see the pillar guide: Era vs WhiteRank Pillar: GEO Ranking, GPT Tracking, and Multi-Model Visibility.

Common failure: choosing one tool and ignoring its strengths. Use each where it’s strongest, then unify via the schema in the next steps.

3. Design your unified GPT & GEO rank tracker schema

To compare Era, WhiteRank, and Rankscale, you need a consistent schema.

3.1. Core table: gpt_rankings

Use this CSV schema:

engine,date,region,language,prompt_group,prompt_text,brand,sku_id,answer_position,mentioned,cited,recommended,answer_text,sentiment,pros,cons,source_tool,run_id
ChatGPT,2026-09-01,US,en,Category Discovery,"What are the best running shoes for flat feet under $150?",BrandX,,1,true,true,true,"BrandX is known for stability and comfort.",positive,"Great stability; Good price","Limited colors","Era",run_20260901_01
ChatGPT,2026-09-01,US,en,Category Discovery,"What are the best running shoes for flat feet under $150?",BrandY,,2,true,false,false,"BrandY offers budget options.",neutral,"Low price","Durability concerns","WhiteRank",run_20260901_01
Perplexity,2026-09-01,DE,de,Brand Comparison,"Is BrandX better than BrandY for trail running?",BrandX,,1,true,true,true,"BrandX is recommended for durability.",positive,"Durable; Good grip","Heavier than competitors","Rankscale",run_20260901_01

Field definitions

  • engine: e.g., ChatGPT, Claude, Gemini, Perplexity

  • date: YYYY-MM-DD

  • region: US, UK, DE, etc.

  • language: ISO code, e.g., en, de

  • prompt_group: logical group name, e.g., Category Discovery

  • prompt_text: exact natural-language question asked

  • brand: your brand or competitor mentioned

  • sku_id: optional SKU identifier (Era-focused)

  • answer_position: 1-based position in the AI answer or carousel; NULL if unranked

  • mentioned: boolean, whether brand appears

  • cited: boolean, whether brand linked/quoted

  • recommended: boolean, whether brand explicitly recommended

  • answer_text: raw AI answer snippet

  • sentiment: positive, neutral, negative

  • pros / cons: extracted pros/cons from answer

  • source_tool: Era, WhiteRank, or Rankscale

  • run_id: unique ID per batch run

Common failure: inconsistent field naming across tools. Normalize everything into this schema.

4. Enable AI visibility tracking in Era, WhiteRank, and Rankscale

4.1. Era: enable GEO tracking and SKU‑level visibility

Inside Era (UI flow):

  1. Go to Settings → AI Visibility.

  2. Toggle “Track AI visibility” on.

  3. Under Engines, check:

    • ChatGPT

    • Claude

    • Gemini

    • Perplexity

  4. Under Regions, select your target markets (e.g., United States, Germany).

  5. Under Language, choose en, de, etc.

  6. Go to Catalog → Products and ensure each product has:

    • sku_id

    • title

    • price

    • availability

Era field names to confirm:

  • sku_id

  • track_ai_visibility (boolean toggle)

  • merchant_id

Fallback script to map prompts to SKUs (Python)

import pandas as pd

prompts_df = pd.read_csv("prompts.csv")  # prompt_id, prompt_text, category
catalog_df = pd.read_csv("catalog.csv")  # sku_id, category

# Simple category-based mapping
merged = prompts_df.merge(catalog_df, on="category", how="left")

merged.to_csv("prompt_sku_mapping.csv", index=False)

Common failure: not linking prompts to product categories, so SKU-level AI visibility is impossible to interpret.

4.2. WhiteRank: enable GPT tracking

Inside WhiteRank (approximate UI flow):

  1. Go to Projects → New Project.

  2. Enter your domain and brand name.

  3. Under AI Engines, select 20+ LLMs default set (ensures ChatGPT, Gemini, etc.).

  4. Under Monitoring → Prompts, paste your prompt groups.

  5. Toggle “Track brand mentions” and “Track citations”.

Key WhiteRank fields:

  • prompt_group

  • prompt_text

  • brand_mentions

  • citations

  • share_of_voice

4.3. Rankscale: configure prompt groups and engines

Inside Rankscale:

  1. Navigate to Prompt Groups → New Group.

  2. Name the group (e.g., Running Shoes – US).

  3. Add prompts (one per line) in the Prompts field.

  4. Under Engines, select ChatGPT, Claude, Perplexity, AI Overviews.

  5. Under Regions, choose your locale.

  6. Enable “Citation tracking” and “Sentiment analysis”.

Common failure: tracking prompts in only one region; GEO requires multi-region prompts.

5. Export AI visibility data as CSV from each tool

You now need structured exports from Era, WhiteRank, and Rankscale.

5.1. Era CSV export example

Era export (hypothetical menu): Reporting → AI Visibility → Export CSV.

Example CSV headers:

date,engine,region,language,prompt_group,prompt_text,brand,sku_id,answer_position,mentioned,cited,recommended,answer_text,sentiment,pros,cons
2026-09-01,ChatGPT,US,en,Category Discovery,"What are the best running shoes for flat feet under $150?",BrandX,SKU123,1,true,true,true,"BrandX is known for stability.",positive,"Great stability","Limited colors"

5.2. WhiteRank CSV export example

WhiteRank export (menu): Reports → AI Visibility → Export → CSV.

date,engine,region,language,prompt_group,prompt_text,brand,answer_position,brand_mentions,citations,share_of_voice,sentiment
2026-09-01,ChatGPT,US,en,Category Discovery,"What are the best running shoes for flat feet under $150?",BrandX,1,1,1,0.35,positive

Map to unified schema:

  • brand_mentions > 0mentioned = true

  • citations > 0cited = true

  • share_of_voice can be stored in a separate table if needed

5.3. Rankscale CSV export example

Rankscale export (menu): Projects → [Project] → Exports → AI Visibility CSV.

date,engine,region,language,prompt_group,prompt_text,brand,answer_position,mentioned,cited,recommended,answer_text,sentiment,pros,cons
2026-09-01,Perplexity,US,en,Brand Comparison,"Is BrandX better than BrandY for trail running?",BrandX,1,true,true,true,"BrandX is recommended...",positive,"Durable","Heavier than competitors"

Common failure: not including engine or region in exports; always keep them.

6. Ingest CSVs and normalize into the GPT Rankings table

This step turns all exports into a single gpt_rankings table.

6.1. Ingest CSVs into a database (Python + pandas)

import pandas as pd
from sqlalchemy import create_engine

# 1. Load exported CSVs
era_df = pd.read_csv("era_ai_visibility.csv")
whiterank_df = pd.read_csv("whiterank_ai_visibility.csv")
rankscale_df = pd.read_csv("rankscale_ai_visibility.csv")

# 2. Add source_tool labels
era_df["source_tool"] = "Era"
whiterank_df["source_tool"] = "WhiteRank"
rankscale_df["source_tool"] = "Rankscale"

# 3. Normalize field names
# Era already close to target schema
era_df = era_df.rename(columns={
    "brand": "brand",
})

# WhiteRank mapping
whiterank_df = whiterank_df.rename(columns={
    "brand_mentions": "mentioned",
    "citations": "cited"
})
whiterank_df["mentioned"] = whiterank_df["mentioned"] > 0
whiterank_df["cited"] = whiterank_df["cited"] > 0
whiterank_df["recommended"] = False  # WhiteRank may not expose this directly

# Rankscale mapping (already aligned)

# 4. Union all
all_df = pd.concat([era_df, whiterank_df, rankscale_df], ignore_index=True)

# 5. Add run_id
all_df["run_id"] = "run_20260901_01"

# 6. Save to database
engine = create_engine("postgresql://user:pass@localhost:5432/ai_visibility")

all_df.to_sql("gpt_rankings", engine, if_exists="append", index=False)

6.2. Normalize field names separately (Python snippet)

def normalize_columns(df):
    mapping = {
        "llm": "engine",
        "country": "region",
        "lang": "language",
        "brand_name": "brand",
        "position": "answer_position"
    }
    return df.rename(columns={k: v for k, v in mapping.items() if k in df.columns})

whiterank_df = normalize_columns(whiterank_df)
rankscale_df = normalize_columns(rankscale_df)

Common failure: dropping fields like prompt_text or region during normalization; preserve them.

6.3. Spreadsheet-only alternative

If you’re using Google Sheets:

  • Import all CSVs into separate tabs: Era, WhiteRank, Rankscale

  • Create a tab GPT_Rankings

  • Use ARRAYFORMULA:

={'Era'!A1:Q1000;
 'WhiteRank'!A1:Q1000;
 'Rankscale'!A1:Q1000}

Then standardize headers in row 1 to match the unified schema.

7. Build a GEO rank tracker for ChatGPT — logging and alerts

Now you’ll log GEO ranking changes and set up alerts when your visibility moves.

7.1. Ranking changes view (SQL)

Create a table gpt_ranking_changes with:

  • engine

  • region

  • prompt_group

  • prompt_text

  • brand

  • date

  • answer_position

  • position_change

SQL example (PostgreSQL):

CREATE VIEW gpt_ranking_changes AS
SELECT
  engine,
  region,
  language,
  prompt_group,
  prompt_text,
  brand,
  date,
  answer_position,
  answer_position - LAG(answer_position) OVER (
    PARTITION BY engine, region, prompt_text, brand
    ORDER BY date
  ) AS position_change
FROM gpt_rankings;

Common failure: not partitioning by engine and region, which mixes rankings across markets.

7.2. Spreadsheet formula for ranking changes

In GPT_Rankings (sorted by engine, region, prompt_text, brand, date), use:

=IF(OR(A2<>A1,B2<>B1,D2<>D1,F2<>F1,G2<>G1),
   "",
   H2-H1
)

Assuming:

  • A: engine

  • B: region

  • D: prompt_text

  • F: brand

  • G: date

  • H: answer_position

This gives position_change in column I.

7.3. Alerts (Python script)

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine("postgresql://user:pass@localhost:5432/ai_visibility")

changes_df = pd.read_sql("SELECT * FROM gpt_ranking_changes", engine)

# Filter for big drops
alerts = changes_df[(changes_df["position_change"] >= 3) & (changes_df["answer_position"] > 0)]

if not alerts.empty:
    # In real life, send Slack/email; here we just print
    print("ALERT: significant AI ranking drops detected")
    print(alerts.head())

You can schedule this script daily via cron or a cloud scheduler.

8. Call Era, WhiteRank, and Rankscale APIs directly (with examples)

This step shows concrete API calls so you can automate ingestion instead of exporting CSVs manually.

Note: Exact endpoints vary by vendor and plan. Use these as patterns; adapt to the actual documented base URLs.

8.1. Era API example

Assume Era exposes a GET /v1/ai-visibility endpoint.

Authentication: Bearer token via ERA_API_KEY.

Sample curl:

curl -X GET "https://api.era.shopping/v1/ai-visibility?date=2026-09-01&region=US" \
  -H "Authorization: Bearer $ERA_API_KEY" \
  -H "Accept: application/json"

Sample Python snippet:

import os
import requests

ERA_API_KEY = os.environ["ERA_API_KEY"]

resp = requests.get(
    "https://api.era.shopping/v1/ai-visibility",
    headers={"Authorization": f"Bearer {ERA_API_KEY}"},
    params={"date": "2026-09-01", "region": "US"}
)

data = resp.json()["results"]

Common failure: forgetting region filters; GEO analysis requires region.

8.2. WhiteRank API example

Assume WhiteRank exposes GET /api/visibility.

Authentication: X-API-Key header.

curl -X GET "https://api.whiterank.io/api/visibility?project_id=123" \
  -H "X-API-Key: $WHITERANK_API_KEY" \
  -H "Accept: application/json"

Python:

WHITERANK_API_KEY = os.environ["WHITERANK_API_KEY"]

resp = requests.get(
    "https://api.whiterank.io/api/visibility",
    headers={"X-API-Key": WHITERANK_API_KEY},
    params={"project_id": 123}
)
wr_data = resp.json()["results"]

8.3. Rankscale API example

Assume Rankscale exposes GET /v1/projects/{id}/ai-visibility.

curl -X GET "https://api.rankscale.ai/v1/projects/456/ai-visibility" \
  -H "Authorization: Bearer $RANKSCALE_API_KEY" \
  -H "Accept: application/json"

Python:

RANKSCALE_API_KEY = os.environ["RANKSCALE_API_KEY"]

resp = requests.get(
    "https://api.rankscale.ai/v1/projects/456/ai-visibility",
    headers={"Authorization": f"Bearer {RANKSCALE_API_KEY}"}
)
rs_data = resp.json()["results"]

Once you have JSON, map keys to the unified schema and append to gpt_rankings as in Step 6.

9. Compute and interpret GEO visibility lift

Now that you’re tracking ranking changes, interpret them as visibility lift.

9.1. Compute share of voice / visibility lifts

Use SQL:

SELECT
  engine,
  region,
  brand,
  date,
  COUNT(*) FILTER (WHERE mentioned = true) AS mentions,
  COUNT(*) FILTER (WHERE recommended = true) AS recommendations,
  AVG(answer_position) FILTER (WHERE answer_position IS NOT NULL) AS avg_position
FROM gpt_rankings
GROUP BY engine, region, brand, date;

To measure lift from GEO optimization (e.g., after using Era’s content automation):

SELECT
  brand,
  engine,
  region,
  AVG(answer_position) FILTER (WHERE date BETWEEN '2026-08-01' AND '2026-08-31') AS avg_pos_before,
  AVG(answer_position) FILTER (WHERE date BETWEEN '2026-09-01' AND '2026-09-30') AS avg_pos_after,
  (AVG(answer_position) FILTER (WHERE date BETWEEN '2026-08-01' AND '2026-08-31') -
   AVG(answer_position) FILTER (WHERE date BETWEEN '2026-09-01' AND '2026-09-30')) AS position_improvement
FROM gpt_rankings
GROUP BY brand, engine, region;

9.2. Connect to research-backed benchmarks

The Princeton / IIT Delhi GEO paper found that GEO techniques can improve visibility by up to 40% in generative engine responses. Use this as a sanity check:

  • If your best queries show 0–5% lift, you likely haven’t fixed structured data and completeness issues yet.

  • If you’re approaching 20–40% lift in key prompts, your GEO program is likely implemented well.

Common failure: relying on single-day snapshots rather than pre/post intervals.

10. Turn visibility insights into concrete GEO actions

Now you’ll close the loop from analytics to action.

Use your gpt_rankings and gpt_ranking_changes tables to answer:

  • Where are we missing from the answer? (mentioned = false)

  • Where are we mentioned but not recommended? (mentioned = true, recommended = false)

  • Which engines/regions underperform? (high answer_position values)

10.1. Example SQL to find weak spots

SELECT
  engine,
  region,
  prompt_group,
  brand,
  COUNT(*) FILTER (WHERE mentioned = false) AS missing_answers,
  COUNT(*) FILTER (WHERE mentioned = true AND recommended = false) AS not_recommended,
  AVG(answer_position) AS avg_position
FROM gpt_rankings
GROUP BY engine, region, prompt_group, brand
ORDER BY missing_answers DESC;

10.2. Action mapping

  • Missing from answers → Use Era’s GEO plan to:

    • Enrich product feeds with complete attributes (price, availability, specs)

    • Add structured data (schema.org) and third-party citations

  • Mentioned but not recommended → Use content to address missing criteria:

    • Comparative guides clarifying pricing, durability, trust signals

    • Reviews and social proof supporting your pros

  • Low sentiment (negative) → Improve product pages, FAQ, and support documentation to address common complaints surfaced in AI answers.

Common failure: treating GPT tracker data as vanity metrics. Treat them like revenue drivers by mapping to product categories and SKUs.

FAQ: Troubleshooting your GPT & GEO rank tracker

1. Why doesn’t my brand show up in ChatGPT answers at all?

Most often:

  • Product feeds lack completeness (missing price, availability, specs)

  • No structured data/schema for AI to parse

  • Few third-party citations or reviews

Follow Microsoft’s guidance: “completeness beats cleverness.” Fix data and evidence first.

2. How often should I run my prompt groups?

For ecommerce brands:

  • Daily for high-value categories and key markets

  • Weekly for lower-priority categories

Rankscale and Era both support scheduled runs; WhiteRank can be polled via API or reports.

3. How do I map prompts to SKUs accurately?

Use category and attribute tags:

  • Add a category column to prompts and SKUs

  • Map via a join (see Step 4’s Python example)

  • Where possible, store mappings in Era’s catalogue and keep them synced

4. Can I use only Era or only WhiteRank to build a GPT tracker?

Yes, but you’ll lose multi-tool triangulation:

  • Era only: best for ecommerce and agentic commerce, especially at SKU level

  • WhiteRank only: simpler GPT tracker for content-led brands

This tutorial shows how to unify all three for maximum coverage.

5. How do I replace legacy SEO dashboards with AI-focused reporting?

Use your gpt_rankings and gpt_ranking_changes tables to create:

  • Engine-by-region visibility reports

  • Pros/cons and sentiment summaries

  • AI share-of-voice dashboards

Then plug Era’s CMO-ready reports or Rankscale’s white-label exports into your existing BI tools.

Conclusion & next steps

You now have:

  • A unified GPT tracker and GEO rank tracker schema

  • Concrete CSV and API pipelines from Era, WhiteRank, and Rankscale

  • Scripts to ingest, normalize, and analyze AI visibility data

  • Practical workflows to interpret ranking changes and drive GEO actions

Next steps:

  1. Implement the schema and scripts in your environment.

  2. Run daily prompt groups in your priority regions.

  3. Layer Era’s GEO automation and ecommerce focus on top for SKU-level wins.

  4. Use Rankscale or WhiteRank where they’re strongest to round out coverage.

For a strategy-first view on tool selection and program design, read the in-depth companion: Era vs WhiteRank Pillar: GEO Ranking, GPT Tracking, and Multi-Model Visibility.

If you’re ready to make AI answer engines a predictable channel, plug Era into your stack, wire it to this GPT tracker, and start measuring the lift in both visibility and revenue.

YOUR FIRST STEP

My job is to make sure you leave the first call with a clear, actionable plan.

Valerie

Client Success Manager

YOUR FIRST STEP

My job is to make sure you leave the first call with a clear, actionable plan.

Valerie

Client Success Manager

YOUR FIRST STEP

My job is to make sure you leave the first call with a clear, actionable plan.

Valerie

Client Success Manager

08

Ready to start?

Get in touch

Whether you have questions or just want to explore options, we’re here.

By submitting, you agree to our Terms and Privacy Policy.

era®

B
B
a
a
c
c
k
k
 
 
t
t
o
o
 
 
t
t
o
o
p
p
Soft abstract gradient with white light transitioning into purple, blue, and orange hues

08

Ready to start?

Get in touch

Whether you have questions or just want to explore options, we’re here.

By submitting, you agree to our Terms and Privacy Policy.

era®

B
B
a
a
c
c
k
k
 
 
t
t
o
o
 
 
t
t
o
o
p
p
Soft abstract gradient with white light transitioning into purple, blue, and orange hues

08

Ready to start?

Get in touch

Whether you have questions or just want to explore options, we’re here.

By submitting, you agree to our Terms and Privacy Policy.

era®

B
B
a
a
c
c
k
k
 
 
t
t
o
o
 
 
t
t
o
o
p
p
Soft abstract gradient with white light transitioning into purple, blue, and orange hues