Biến Claude Code thành trung tâm điều khiển SEO của bạn

Nghe bài viết:

seo ai-260314005503

Phần lớn công việc SEO phải chuyển qua lại giữa GSC, GA4, Ads và các công cụ AI. Điều gì sẽ xảy ra nếu một thiết lập có thể đối chiếu tất cả chúng cùng lúc?

Gần đây, tôi dành phần lớn thời gian trong ngày ở Cursor để chạy Claude Code. Tôi không phải là developer. Tôi điều hành một agency marketing kỹ thuật số. Nhưng Claude Code trong Cursor đã trở thành cách nhanh nhất để tôi xử lý nhiều công việc, bao gồm kéo và phân tích dữ liệu từ Google Search Console, GA4 và Google Ads.

Thiết lập này mất khoảng một giờ. Sau đó bạn có thể hỏi những câu như “những keyword nào tôi đang trả tiền quảng cáo nhưng đã có thứ hạng organic?” và nhận câu trả lời trong vài giây thay vì phải dành cả buổi chiều làm việc với spreadsheet.

Dưới đây là quy trình từng bước tôi đã xây dựng khi phân tích dữ liệu cho khách hàng của agency. Nếu thấy quá kỹ thuật, bạn chỉ cần dán URL của bài viết này vào Claude và yêu cầu nó hướng dẫn từng bước.

Những gì bạn đang xây dựng

Kết quả cuối cùng là một thư mục project nơi Claude Code có quyền truy cập các script Python để lấy dữ liệu trực tiếp từ Google API. Bạn fetch dữ liệu, nó được lưu vào các file JSON, sau đó bạn chỉ cần trò chuyện với nó.

Không cần xây dashboard. Không cần duy trì template Looker Studio. Về cơ bản bạn đang cung cấp cho Claude Code cùng dữ liệu mà team của bạn thường xem và để nó tự đối chiếu.

seo-project/
├── config.json              # thông tin khách hàng + ID property API
├── fetchers/
│   ├── fetch_gsc.py         # Google Search Console
│   ├── fetch_ga4.py         # Google Analytics 4
│   ├── fetch_ads.py         # Google Ads search terms
│   └── fetch_ai_visibility.py  # dữ liệu tìm kiếm AI
├── data/
│   ├── gsc/                 # hiệu suất query + page
│   ├── ga4/                 # traffic theo channel, top pages
│   ├── ads/                 # search terms, chi phí, chuyển đổi
│   └── ai-visibility/       # dữ liệu trích dẫn AI
└── reports/                 # phân tích được tạo ra

Bước 1: Thiết lập xác thực Google API

Mọi thứ chạy thông qua service account của Google Cloud. Một service account có thể dùng cho cả GSC và GA4. Google Ads cần thiết lập OAuth riêng.

set-up-google-api-authentication-260314003115

Service account (cho GSC + GA4)

  • Tạo project trong Google Cloud Console.
  • Bật Search Console API và Google Analytics Data API.
  • Tạo service account trong IAM & Admin > Service Accounts.
  • Tải file JSON key.
  • Thêm email service account làm user trong property GSC (quyền read là đủ).
  • Thêm nó làm Viewer trong property GA4.

Email service account có dạng your-project@your-project-id.iam.gserviceaccount.com. Bạn sẽ thêm email này vào từng property GSC và GA4 của khách hàng giống như thêm thành viên trong team.

Đối với agency: một service account có thể dùng cho tất cả khách hàng. Chỉ cần thêm nó vào từng property, cập nhật ID property trong file config là xong.

Xác thực Google Ads

Google Ads khác một chút. Bạn cần:

  • Developer token từ Google Ads API Center.
  • OAuth 2.0 credentials từ Google Cloud.
  • Một lần xác thực trình duyệt để tạo refresh token.

Developer token cần gửi đơn đăng ký. Với agency, bạn chỉ cần mô tả là “automated reporting for marketing clients”. Thường mất 24–48 giờ để được duyệt.

Nếu bạn dùng Manager Account (MCC), một developer token và refresh token có thể dùng cho toàn bộ sub-account. Bạn chỉ cần thay customer ID cho từng khách hàng.

Nếu chưa có API access hoặc MCC, bạn có thể bỏ qua API. Chỉ cần tải dữ liệu keyword và search terms 90 ngày dưới dạng CSV từ giao diện Google Ads, đặt vào thư mục data, Claude Code vẫn có thể phân tích bình thường.

Cài đặt dependency Python

Các ví dụ dưới đây giả định bạn đang dùng terminal trên Mac hoặc Linux. Nếu dùng Windows, cách dễ nhất là Windows Subsystem for Linux (WSL).

pip install google-api-python-client google-auth google-analytics-data google-ads

Bước 2: Tạo các script fetch dữ liệu

Mỗi fetcher là một script Python ngắn để xác thực, lấy dữ liệu và lưu JSON. Tôi không viết chúng từ đầu. Tôi chỉ mô tả yêu cầu cho Claude Code và nó tự viết.

Một điều khiến tôi khá bất ngờ: tôi chưa từng phải đọc tài liệu API. Không phải cho GSC, GA4 hay Google Ads.

Tôi chỉ cần nói “lấy 1.000 query hàng đầu từ Search Console trong 90 ngày qua”, Claude Code tự xử lý xác thực, endpoint và tham số truy vấn. Nó đã biết sẵn các API này.

Fetcher Google Search Console

from google.oauth2 import service_account
from googleapiclient.discovery import build

SCOPES = ['https://www.googleapis.com/auth/webmasters.readonly']

def get_gsc_service():
    credentials = service_account.Credentials.from_service_account_file(
        'service-account-key.json', scopes=SCOPES
    )
    return build('searchconsole', 'v1', credentials=credentials)

def fetch_queries(service, site_url, start_date, end_date):
    response = service.searchanalytics().query(
        siteUrl=site_url,
        body={
            'startDate': start_date,
            'endDate': end_date,
            'dimensions': ['query'],
            'rowLimit': 1000
        }
    ).execute()
    return response.get('rows', [])

Kết quả trả về gồm query, clicks, impressions, CTR và vị trí trung bình. Lưu dữ liệu này dưới dạng JSON.

Fetcher GA4

from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import (
    RunReportRequest, DateRange, Metric, Dimension
)

def get_ga4_client():
    credentials = service_account.Credentials.from_service_account_file(
        'service-account-key.json',
        scopes=['https://www.googleapis.com/auth/analytics.readonly']
    )
    return BetaAnalyticsDataClient(credentials=credentials)

def fetch_traffic_by_channel(client, property_id, start_date, end_date):
    request = RunReportRequest(
        property=f"properties/{property_id}",
        date_ranges=[DateRange(start_date=start_date, end_date=end_date)],
        dimensions=[Dimension(name="sessionDefaultChannelGroup")],
        metrics=[
            Metric(name="sessions"),
            Metric(name="totalUsers"),
            Metric(name="bounceRate"),
        ]
    )
    return client.run_report(request)

Fetcher Google Ads

Google Ads sử dụng Google Ads Query Language (GAQL). Nếu bạn từng viết SQL thì sẽ thấy quen.

from google.ads.googleads.client import GoogleAdsClient

client = GoogleAdsClient.load_from_storage("google-ads.yaml")
ga_service = client.get_service("GoogleAdsService")

query = """
SELECT
    search_term_view.search_term,
    metrics.impressions,
    metrics.clicks,
    metrics.cost_micros,
    metrics.conversions
FROM search_term_view
WHERE segments.date DURING LAST_30_DAYS
ORDER BY metrics.impressions DESC
"""

response = ga_service.search(customer_id="1234567890", query=query)

Script này lấy cùng dữ liệu với báo cáo Search Terms trong giao diện Google Ads: impressions, clicks, chi phí, conversions, campaign và ad group.


Bước 3: Tạo file cấu hình khách hàng

Mỗi khách hàng có một file JSON riêng. Không cần phức tạp, chỉ cần ID property và một chút context:

{
  "name": "Client Name",
  "domain": "example.com",
  "gsc_property": "https://www.example.com/",
  "ga4_property_id": "319491912",
  "google_ads_customer_id": "9270739126",
  "industry": "Higher Education",
  "competitors": [
    "https://competitor1.com/",
    "https://competitor2.com/"
  ]
}

Bước 4: Đặt câu hỏi phân tích dữ liệu đa nguồn

Bây giờ bạn đã có các file JSON từ GSC, GA4 và Google Ads trong thư mục project. Claude Code có thể đọc tất cả cùng lúc và trả lời những câu hỏi mà bình thường bạn sẽ phải chuyển qua lại giữa nhiều tab và làm VLOOKUP trong spreadsheet.

Phân tích khoảng cách Paid – Organic

Câu hỏi giá trị nhất mà tôi tìm thấy là:

  • “So sánh dữ liệu query từ GSC với search terms trong Google Ads. Tìm các keyword mà chúng ta đang trả tiền cho click nhưng đã có vị trí organic tốt. Đồng thời tìm các keyword đang chạy ads nhưng không có visibility organic. Đó là các khoảng trống nội dung.”

the-paid-organic-gap-analysis.png-260314003307

Khi tôi chạy phân tích này cho một khách hàng trong lĩnh vực giáo dục đại học, hệ thống xác định được:

  • 2.742 search term có chi tiêu quảng cáo lãng phí (impressions nhưng không có click).
  • 351 cơ hội giảm chi tiêu quảng cáo cho các keyword mà organic đã mạnh.
  • 33 query organic hiệu suất cao mà quảng cáo trả phí có thể khuếch đại thêm.
  • 41 khoảng trống nội dung nơi quảng cáo là nguồn hiển thị duy nhất (không có organic).

Phân tích này mất khoảng 90 giây. Nếu làm thủ công (tải CSV từ GSC và Ads, VLOOKUP, phân loại overlap) sẽ mất gần cả buổi chiều.

Những câu hỏi khác đáng thử

Khi bạn đã tải dữ liệu GSC + GA4 + Ads:

  • “Trang nào có nhiều impressions trong GSC nhưng CTR thấp? Traffic GA4 của các trang đó là bao nhiêu?” (xác định cơ hội tối ưu title và meta description)
  • “20 query organic có nhiều impression nhất nhưng chưa chạy ads là gì?” (cơ hội mở rộng quảng cáo)
  • “Nhóm các query GSC theo topic cluster và cho tôi biết cluster nào có nhiều impression nhưng vị trí trung bình thấp.” (ưu tiên đầu tư nội dung)
  • “Trang nào trong GA4 có bounce rate cao nhưng lại có vị trí tốt trong GSC?” (có thể cần cải thiện nội dung)

Claude Code không làm điều gì mà con người không thể làm bằng spreadsheet. Nó chỉ làm điều đó trong vài giây, và bạn có thể tiếp tục hỏi câu hỏi khác mà không phải xây lại toàn bộ phân tích.

Bước 5: Thêm theo dõi AI visibility

Vị trí SERP truyền thống không còn là toàn bộ bức tranh nữa. Giữa Google AI Overviews, AI Mode, Copilot, ChatGPT và Perplexity, bạn cần biết liệu các hệ thống AI có đang trích dẫn nội dung của bạn hay không.

Điều này đặc biệt đúng trong các ngành như giáo dục đại học, nơi sinh viên tiềm năng ngày càng bắt đầu tìm kiếm thông tin bằng các công cụ AI.

Nếu bạn có nền tảng tracking

Các công cụ như Scrunch, Semrush AI Visibility toolkit hoặc Otterly.ai có thể theo dõi sự xuất hiện của thương hiệu bạn trong ChatGPT, Perplexity, Gemini, Google AI Overviews và Copilot.

Xuất dữ liệu dưới dạng CSV hoặc JSON và đặt vào thư mục data. Claude Code có thể đối chiếu các citation AI với dữ liệu GSC và Ads.

claude-code-cross-referencing-ai-citations-against-gsc-and-ads-data.png-260314003453

Khi tôi làm điều này cho website của chúng tôi, chúng tôi phát hiện hai bài blog đang cạnh tranh cho cùng một citation AI trên các query liên quan đến GEO.

Một bài có số citation Copilot gấp 12 lần bài kia dù cả hai nhắm cùng intent. Điều này dẫn đến quyết định hợp nhất nội dung — một quyết định mà chúng tôi sẽ không đưa ra nếu chỉ nhìn vào dữ liệu ranking truyền thống.

Loại cannibalization trong AI search này là thứ mà hầu hết team SEO vẫn chưa kiểm tra.

Nếu bạn không có nền tảng tracking

Bạn không cần công cụ enterprise để bắt đầu. Có nhiều API cho phép lấy dữ liệu AI search trực tiếp với chi phí thấp.

DataForSEO AI Overview API: lựa chọn dễ tiếp cận nhất. Giá khoảng $0.01 mỗi query, nạp tối thiểu $50. Bạn gửi keyword và nhận lại toàn bộ nội dung AI Overview từ SERP Google, bao gồm các URL được trích dẫn.

# DataForSEO AI Overview — ví dụ đơn giản
payload = [{
    "keyword": "best higher education marketing agencies",
    "location_code": 2840,
    "language_code": "en"
}]

response = requests.post(
    "https://api.dataforseo.com/v3/serp/google/ai_overview/live/advanced",
    headers=auth_headers,
    json=payload
)

SerpApi: bắt đầu từ $75/tháng cho 5.000 search. Trả về JSON có cấu trúc cho toàn bộ SERP Google, bao gồm AI Overviews.

SearchAPI.io: tương tự SerpApi, bắt đầu từ $40/tháng. Có API riêng cho Google AI Mode.

Bright Data SERP API: pay-as-you-go khoảng $1.80 cho 1.000 request.

Bing Webmaster Tools: miễn phí và là nguồn dữ liệu AI citation first-party duy nhất hiện nay. Cho biết nội dung của bạn được dùng làm nguồn trong Copilot và Bing AI bao nhiêu lần.

Tự xây bằng LLM API: cách rẻ nhất cho việc theo dõi nhỏ. Viết script Python gửi prompt cố định tới API của OpenAI, Anthropic và Perplexity rồi parse kết quả để tìm brand mention.

Chi phí khoảng dưới $20/tháng cho một thư viện prompt nhỏ.

Mô hình chung: chọn một SERP API cho Google AI Overview, dùng Bing Webmaster Tools (miễn phí), và bổ sung bằng LLM API hoặc công cụ chuyên dụng nếu ngân sách cho phép.

Workflow thực tế

Vậy thực tế workflow này trông như thế nào vào một buổi sáng thứ Ba?

Setup: mỗi khách hàng khoảng 15 phút.

  • Thêm service account vào GSC và GA4
  • Lấy Google Ads customer ID
  • Tạo file config.json

Lấy dữ liệu hàng tháng: khoảng 5 phút.

python3 run_fetch.py --sources gsc,ga4,ads

Phân tích: mở Claude Code trong thư mục project và đặt câu hỏi.

Output: Claude Code tạo báo cáo markdown. Khi cần gửi cho khách hàng, tôi dùng một công cụ riêng để chuyển markdown thành Google Docs.

claude-code-output-260314003513

Toàn bộ quy trình cho khách hàng mới mất khoảng 35 phút. Cập nhật hàng tháng mất khoảng 20 phút.

So sánh với cách thủ công: tải CSV từ nhiều nền tảng, đối chiếu spreadsheet, viết báo cáo.

Những thứ workflow này không thay thế

Tôi không muốn thổi phồng quá mức. Claude Code đọc dữ liệu và tìm pattern nhanh hơn con người. Nhưng nó không quyết định chiến lược.

Bạn vẫn cần người hiểu doanh nghiệp của khách hàng, thị trường cạnh tranh và mục tiêu kinh doanh.

Tool tìm dữ liệu thú vị. Strategist quyết định hành động.

Bạn cũng cần kiểm tra kết quả. LLM có thể hallucinate, kể cả trong phân tích dữ liệu.

Hãy xem output giống như công việc của một analyst mới: tin tưởng nhưng kiểm tra lại, đặc biệt trước khi gửi cho khách hàng.

Tool này cũng không thay thế các nền tảng SEO hiện có. Nếu cần dữ liệu lịch sử, cảnh báo tự động hoặc dashboard cho khách hàng, bạn vẫn cần Semrush hoặc Ahrefs.

Điều nó mang lại là khả năng đặt câu hỏi ad-hoc trên nhiều nguồn dữ liệu cùng lúc.

Bắt đầu với GSC, sau đó mở rộng

Nếu bạn muốn thử:

  • Bắt đầu với GSC. Đây là API dễ kết nối nhất.
  • Thêm GA4. Lúc này bạn có thể đặt câu hỏi cross-source.
  • Thêm Google Ads. Phân tích khoảng cách paid-organic rất đáng giá.
  • Thêm AI visibility. Bắt đầu với Bing Webmaster Tools.

Mỗi lớp dữ liệu bổ sung sẽ làm hệ thống mạnh hơn. Chỉ riêng GSC + GA4 đã có thể tạo ra insight mà bình thường phải mất hàng giờ mới tìm ra.