{"id":48911,"date":"2026-03-15T11:20:28","date_gmt":"2026-03-15T03:20:28","guid":{"rendered":"https:\/\/www.geobok.com\/geo-toolkit\/competitor-ai-citation-comparison\/"},"modified":"2026-04-03T11:06:25","modified_gmt":"2026-04-03T03:06:25","slug":"competitor-ai-citation-comparison","status":"publish","type":"page","link":"https:\/\/www.geobok.com\/en\/geo-toolkit\/competitor-ai-citation-comparison\/","title":{"rendered":"Competitor AI Citation Comparison"},"content":{"rendered":"\n<style>\n\/* ===== D1 \u7279\u6709\u6837\u5f0f ===== *\/\n.cc-ranking { margin-bottom: 24px; }\n.cc-rank-item { display: flex; align-items: center; gap: 16px; padding: 16px 20px; border-radius: var(--geo-radius-md); border: 1px solid var(--geo-border); margin-bottom: 8px; background: #fff; transition: transform 0.15s; }\n.cc-rank-item:hover { transform: translateX(4px); }\n.cc-rank-item--mine { border-color: var(--geo-primary); background: var(--geo-primary-light); border-width: 2px; }\n.cc-rank-num { width: 36px; height: 36px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 16px; font-weight: 800; flex-shrink: 0; }\n.cc-rank-num--1 { background: #fef3c7; color: #92400e; }\n.cc-rank-num--2 { background: #f1f5f9; color: #475569; }\n.cc-rank-num--3 { background: #fff7ed; color: #c2410c; }\n.cc-rank-num--other { background: var(--geo-bg-page); color: var(--geo-text-muted); }\n.cc-rank-brand { flex: 1; font-size: 15px; font-weight: 700; color: var(--geo-text-primary); }\n.cc-rank-mine-tag { font-size: 11px; background: var(--geo-primary); color: #fff; padding: 2px 8px; border-radius: var(--geo-radius-pill); margin-left: 8px; font-weight: 600; }\n.cc-rank-acc { font-size: 22px; font-weight: 800; min-width: 70px; text-align: right; }\n.cc-rank-sub { font-size: 12px; color: var(--geo-text-faint); text-align: right; }\n.cc-rank-grades { display: flex; gap: 4px; }\n.cc-rank-grades span { font-size: 11px; padding: 2px 6px; border-radius: 3px; font-weight: 700; }\n\n\/* \u5e73\u53f0\u5bf9\u6bd4\u8868\u683c\u989c\u8272 *\/\n.cc-acc-high { color: var(--geo-success); font-weight: 700; }\n.cc-acc-mid { color: var(--geo-primary); font-weight: 700; }\n.cc-acc-low { color: var(--geo-danger); font-weight: 700; }\n\n\/* \u7ade\u54c1\u8f93\u5165\u884c *\/\n.cc-comp-list { display: flex; flex-direction: column; gap: 8px; }\n.cc-comp-row { display: flex; gap: 8px; align-items: center; }\n.cc-comp-row .geo-input { flex: 1; }\n.cc-remove-btn { width: 36px; height: 36px; border-radius: 50%; border: 1px solid var(--geo-border); background: #fff; color: var(--geo-danger); cursor: pointer; display: flex; align-items: center; justify-content: center; font-size: 18px; transition: 0.15s; flex-shrink: 0; }\n.cc-remove-btn:hover { background: var(--geo-danger-bg); border-color: var(--geo-danger); }\n\n@media (max-width: 768px) {\n    .cc-rank-item { flex-wrap: wrap; gap: 10px; }\n    .cc-rank-grades { width: 100%; }\n}\n<\/style>\n\n<div class=\"geo-card\">\n    <div class=\"geo-hero\">\n        <h2 class=\"geo-hero__title\">\ud83c\udfc6 Competitor AI Citation Comparison<\/h2>\n        <p class=\"geo-hero__desc\">Enter your brand and competitors, test with the same questions across AI platforms to generate a citation share ranking.<\/p>\n    \n<div class=\"geo-about\">\n    <details class=\"geo-about__section\">\n        <summary>\ud83d\udcd6 What can this tool do?<\/summary>\n        <div class=\"geo-about__body\">\n            <p>Same questions, same platforms \u2014 who does AI cite more? This tool runs identical queries against your brand and competitors, producing a citation-share leaderboard. Spot the gaps your competitors haven't filled.<\/p>\n            <p class=\"geo-about__ref\">See <em>Make AI Speak for You: The Definitive Guide to GEO<\/em>, Ch. 8<\/p>\n        <\/div>\n    <\/details>\n    <details class=\"geo-about__section\">\n        <summary>\u2753 FAQ: GEO Impact<\/summary>\n        <div class=\"geo-about__body\">\n            <div class=\"geo-faq-item\"><h4>What can competitor analysis tell me?<\/h4><p>Three things: Where competitors get cited and you don't (opportunities). Where you get cited and they don't (moats). Where nobody gets cited (white space).<\/p><\/div>\n            <div class=\"geo-faq-item\"><h4>How many competitors?<\/h4><p>Two or three direct competitors is the sweet spot. More inflates test time without proportional insight.<\/p><\/div>\n            <div class=\"geo-faq-item\"><h4>My citation rate is lower \u2014 what do I fix?<\/h4><p>Work backwards: technical foundation (Ch. 4) \u2192 answer-block quality (Ch. 5) \u2192 content authority (Ch. 6).<\/p><\/div>\n        <\/div>\n    <\/details>\n<\/div>\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What can competitor analysis tell me?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Three things: Where competitors get cited and you don't (opportunities). Where you get cited and they don't (moats). Where nobody gets cited (white space).\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How many competitors?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Two or three direct competitors is the sweet spot. More inflates test time without proportional insight.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"My citation rate is lower \u2014 what do I fix?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Work backwards: technical foundation (Ch. 4) \u2192 answer-block quality (Ch. 5) \u2192 content authority (Ch. 6).\"\n      }\n    }\n  ]\n}\n<\/script>\n\n<\/div>\n\n    <div class=\"geo-action\">\n        <div class=\"geo-form-grid\">\n            <div class=\"geo-form-row geo-form-row--2col\">\n                <div class=\"geo-field\">\n                    <label class=\"geo-label\">\u6211\u7684\u54c1\u724c<\/label>\n                    <input type=\"text\" id=\"cc-mybrand\" class=\"geo-input\" placeholder=\"e.g. Nike\">\n                <\/div>\n                <div class=\"geo-field\">\n                    <label class=\"geo-label\">\u9009\u62e9 AI \u5e73\u53f0<\/label>\n                    <div class=\"geo-check-group\" id=\"cc-providers\">\n                        <label class=\"geo-check-item geo-check-item--active\" data-val=\"openai\"><input type=\"checkbox\" checked> OpenAI<\/label>                        <label class=\"geo-check-item geo-check-item--active\" data-val=\"claude\"><input type=\"checkbox\" checked> Claude<\/label>                        <label class=\"geo-check-item\" data-val=\"gemini\"><input type=\"checkbox\"> Gemini<\/label>                    <\/div>\n                <\/div>\n            <\/div>\n            <div class=\"geo-field\">\n                <label class=\"geo-label\">\u7ade\u54c1\u54c1\u724c <span class=\"geo-label--hint\">\uff08\u6700\u591a 5 \u4e2a\uff09<\/span><\/label>\n                <div class=\"cc-comp-list\" id=\"cc-comp-list\">\n                    <div class=\"cc-comp-row\"><input type=\"text\" class=\"geo-input cc-comp-input\" placeholder=\"\u7ade\u54c1\u54c1\u724c 1\"><button type=\"button\" class=\"cc-remove-btn\" onclick=\"this.closest('.cc-comp-row').remove()\">\u00d7<\/button><\/div>\n                    <div class=\"cc-comp-row\"><input type=\"text\" class=\"geo-input cc-comp-input\" placeholder=\"\u7ade\u54c1\u54c1\u724c 2\"><button type=\"button\" class=\"cc-remove-btn\" onclick=\"this.closest('.cc-comp-row').remove()\">\u00d7<\/button><\/div>\n                <\/div>\n                <button type=\"button\" class=\"geo-btn geo-btn--ghost geo-btn--sm\" style=\"margin-top:8px;\" id=\"cc-add-comp\">+ \u6dfb\u52a0\u7ade\u54c1<\/button>\n            <\/div>\n            <div class=\"geo-field\">\n                <label class=\"geo-label\">\u95ee\u9898\u5e93 <span class=\"geo-label--hint\">\u6bcf\u884c\u4e00\u4e2a\uff0c\u6700\u591a 30 \u4e2a<\/span><\/label>\n                <textarea id=\"cc-questions\" class=\"geo-input\" style=\"min-height:140px;\" placeholder=\"\u5bb6\u7528\u6295\u5f71\u4eea\u600e\u4e48\u9009&#10;\u6295\u5f71\u4eea\u548c\u7535\u89c6\u54ea\u4e2a\u597d&#10;\u6295\u5f71\u4eea\u4ec0\u4e48\u724c\u5b50\u597d\"><\/textarea>\n            <\/div>\n            <button id=\"cc-btn\" class=\"geo-btn geo-btn--block\">Start comparison<\/button>\n        <\/div>\n    <\/div>\n\n    <div class=\"geo-progress\" id=\"cc-progress\">\n        <div class=\"geo-progress__track\"><div id=\"cc-pbar\" class=\"geo-progress__bar\"><\/div><\/div>\n        <div id=\"cc-ptext\" class=\"geo-progress__text\"><\/div>\n    <\/div>\n\n    <div id=\"cc2-apikey-area\"><\/div>\n<script>document.addEventListener('DOMContentLoaded',function(){var el=document.getElementById('cc2-apikey-area');if(el)el.innerHTML=GeoAPI.renderApiKeyInput();});<\/script>\n    <div id=\"cc-result\" class=\"geo-result\" style=\"padding: 0 var(--geo-space-xl) var(--geo-space-xl);\"><\/div>\n<\/div>\n\n<script>\ndocument.addEventListener('DOMContentLoaded', function(){\n    \/* \u591a\u9009\u4ea4\u4e92 *\/\n    document.querySelectorAll('#cc-providers .geo-check-item').forEach(function(item){\n        item.addEventListener('click', function(){ var cb=this.querySelector('input'); cb.checked=!cb.checked; this.classList.toggle('geo-check-item--active',cb.checked); });\n    });\n\n    \/* \u6dfb\u52a0\u7ade\u54c1\u884c *\/\n    document.getElementById('cc-add-comp').addEventListener('click', function(){\n        var list = document.getElementById('cc-comp-list');\n        if(list.children.length >= 5) return;\n        var n = list.children.length + 1;\n        var row = document.createElement('div'); row.className = 'cc-comp-row';\n        row.innerHTML = '<input type=\"text\" class=\"geo-input cc-comp-input\" placeholder=\"\u7ade\u54c1\u54c1\u724c '+n+'\"><button type=\"button\" class=\"cc-remove-btn\" onclick=\"this.closest(\\'.cc-comp-row\\').remove()\">\u00d7<\/button>';\n        list.appendChild(row);\n    });\n\n    var btn = document.getElementById('cc-btn');\n    var result = document.getElementById('cc-result');\n    var progress = GeoAPI.initProgress(document.getElementById('cc-pbar'), document.getElementById('cc-ptext'));\n    var PROV_NAMES = {}; GeoAPI.getProviders().forEach(function(p){PROV_NAMES[p.value]=p.label;});\n\n    btn.addEventListener('click', async function(){\n        var myBrand = document.getElementById('cc-mybrand').value.trim();\n        if(!myBrand){ GeoAPI.showError(result,'\u8bf7\u8f93\u5165\u81ea\u5df1\u7684\u54c1\u724c\u540d'); return; }\n\n        var competitors = Array.from(document.querySelectorAll('.cc-comp-input')).map(function(i){return i.value.trim();}).filter(function(v){return v.length>0;});\n        if(competitors.length===0){ GeoAPI.showError(result,'\u8bf7\u81f3\u5c11\u8f93\u5165\u4e00\u4e2a\u7ade\u54c1\u54c1\u724c'); return; }\n\n        var questions = document.getElementById('cc-questions').value.split('\\n').map(function(q){return q.trim();}).filter(function(q){return q.length>0;});\n        if(questions.length===0){ GeoAPI.showError(result,'\u8bf7\u8f93\u5165\u81f3\u5c11\u4e00\u4e2a\u95ee\u9898'); return; }\n\n        var providers = [];\n        document.querySelectorAll('#cc-providers input:checked').forEach(function(cb){ providers.push(cb.closest('.geo-check-item').getAttribute('data-val')); });\n        if(providers.length===0){ GeoAPI.showError(result,'\u8bf7\u9009\u62e9\u81f3\u5c11\u4e00\u4e2a AI \u5e73\u53f0'); return; }\n\n        var totalBrands = 1 + competitors.length;\n        var totalCalls = questions.length * providers.length * totalBrands;\n        var estMin = Math.ceil(totalCalls * 2 \/ 60);\n\n        GeoAPI.disableBtn(btn, GeoAPI.t('btn.analyzing'));\n        result.style.display='none'; result.classList.remove('geo-result--visible');\n        progress.show(); progress.update(5, GeoAPI.LANG==='en' ? 'Submitting '+totalCalls+' citation checks (~'+estMin+' min)...' : '\u6b63\u5728\u5411 AI \u5927\u6a21\u578b\u63d0\u4ea4 '+totalCalls+' \u6b21\u54c1\u724c\u5f15\u7528\u68c0\u6d4b\uff08\u7ea6'+estMin+'\u5206\u949f\uff09...');\n\n        var pct=5;\n        var timer = setInterval(function(){ pct=Math.min(pct+0.2,92); progress.update(pct, GeoAPI.LANG==='en' ? 'Testing '+totalBrands+' brands across AI models...' : '\u6b63\u5728\u6d4b\u8bd5 '+totalBrands+' \u4e2a\u54c1\u724c\u5728 AI \u5927\u6a21\u578b\u4e2d\u7684\u5f15\u7528\u4efd\u989d...'); },1000);\n\n        try {\n            var data = await GeoAPI.post('\/geo\/competitor-compare',{\n                my_brand: myBrand, api_keys: (function(){ var keys={}; providers.forEach(function(p){ var k=GeoAPI.getApiKey(p); if(k) keys[p]=k; }); return keys; })(), lang: GeoAPI.LANG, competitors: competitors, questions: questions, providers: providers\n            },{ timeout: 900000 });\n\n            clearInterval(timer); progress.update(100,'\u5206\u6790\u5b8c\u6210'); setTimeout(function(){ progress.hide(); },400);\n            renderResult(data, providers);\n        } catch(e){\n            clearInterval(timer); progress.hide();\n            if(!e._geoAuthHandled) GeoAPI.showError(result,'\u5bf9\u6bd4\u5931\u8d25: '+e.message);\n        } finally { GeoAPI.enableBtn(btn); }\n    });\n\n    function accClass(v){ return v>=50?'cc-acc-high':v>=20?'cc-acc-mid':'cc-acc-low'; }\n\n    function renderResult(data, providers){\n        var html = '';\n        var ranking = data.ranking || [];\n\n        \/* ---- 1. \u6392\u884c\u699c ---- *\/\n        html += '<div class=\"geo-section\"><h3 class=\"geo-section__title\">\ud83c\udfc6 AI \u5f15\u7528\u7387\u6392\u884c\u699c<\/h3>'\n              + '<span class=\"geo-section__desc\">'+data.question_count+' \u4e2a\u95ee\u9898 \u00d7 '+providers.length+' \u4e2a\u5e73\u53f0 \u00b7 \u6211\u7684\u54c1\u724c\u6392\u540d\u7b2c '+data.my_rank+'<\/span><\/div>';\n\n        html += '<div class=\"cc-ranking\">';\n        ranking.forEach(function(r){\n            var numCls = r.rank<=3 ? 'cc-rank-num--'+r.rank : 'cc-rank-num--other';\n            var rowCls = r.is_mine ? 'cc-rank-item--mine' : '';\n            var gd = r.grade_distribution || {};\n\n            html += '<div class=\"cc-rank-item '+rowCls+'\">'\n                  + '<div class=\"cc-rank-num '+numCls+'\">'+r.rank+'<\/div>'\n                  + '<div class=\"cc-rank-brand\">'+GeoAPI.escapeHtml(r.brand)+(r.is_mine?'<span class=\"cc-rank-mine-tag\">\u6211\u7684\u54c1\u724c<\/span>':'')+'<\/div>'\n                  + '<div class=\"cc-rank-grades\">'\n                  + '<span style=\"background:var(--geo-success-bg);color:#166534;\">A:'+( gd.A||0)+'<\/span>'\n                  + '<span style=\"background:#ccfbf1;color:#1e40af;\">B:'+(gd.B||0)+'<\/span>'\n                  + '<span style=\"background:var(--geo-warn-bg);color:#92400e;\">C:'+(gd.C||0)+'<\/span>'\n                  + '<span style=\"background:var(--geo-danger-bg);color:#991b1b;\">D:'+(gd.D||0)+'<\/span>'\n                  + '<\/div>'\n                  + '<div><div class=\"cc-rank-acc\" style=\"color:'+( r.acc>=50?'var(--geo-success)':r.acc>=20?'var(--geo-primary)':'var(--geo-danger)')+'\">'+r.acc+'%<\/div>'\n                  + '<div class=\"cc-rank-sub\">'+r.cited+'\/'+r.total+' \u6b21\u5f15\u7528<\/div><\/div>'\n                  + '<\/div>';\n        });\n        html += '<\/div>';\n\n        \/* ---- 2. \u5206\u5e73\u53f0\u5bf9\u6bd4\u8868\u683c ---- *\/\n        html += '<div class=\"geo-section\"><h3 class=\"geo-section__title\">\ud83d\udcca \u5206\u5e73\u53f0\u5f15\u7528\u7387\u5bf9\u6bd4<\/h3><\/div>';\n        html += '<div class=\"geo-table-wrap\"><table class=\"geo-table\"><thead><tr><th>\u54c1\u724c<\/th>';\n        providers.forEach(function(p){ html += '<th>'+GeoAPI.escapeHtml(PROV_NAMES[p]||p)+'<\/th>'; });\n        html += '<th>\u7efc\u5408<\/th><\/tr><\/thead><tbody>';\n\n        ranking.forEach(function(r){\n            var bd = data.brands_data[r.brand] || {};\n            var bp = bd.by_provider || {};\n            html += '<tr><td style=\"font-weight:'+(r.is_mine?'800':'600')+';\">'+(r.is_mine?'\u2b50 ':'')+GeoAPI.escapeHtml(r.brand)+'<\/td>';\n            providers.forEach(function(p){\n                var pa = bp[p] ? bp[p].acc : 0;\n                html += '<td class=\"'+accClass(pa)+'\">'+pa+'%<\/td>';\n            });\n            html += '<td class=\"'+accClass(r.acc)+'\" style=\"font-size:16px;\">'+r.acc+'%<\/td><\/tr>';\n        });\n        html += '<\/tbody><\/table><\/div>';\n\n        GeoAPI.showResult(result, html);\n    }\n});\n<\/script>\n\n        \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":48884,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-48911","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/pages\/48911","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/comments?post=48911"}],"version-history":[{"count":0,"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/pages\/48911\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/pages\/48884"}],"wp:attachment":[{"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/media?parent=48911"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}