Phần lớn công việc SEO thường phải liên tục chuyển qua lại giữa các tab như Google Search Console, Google Analytics 4, Google Ads và các công cụ AI. Nhưng điều gì sẽ xảy ra nếu chỉ cần một thiết lập duy nhất có thể đối chiếu dữ liệu từ tất cả các nguồn này?
Gần đây, tôi dành phần lớn thời gian làm việc trong Cursor để chạy Claude Code. Tôi không phải là lập trình viên; tôi điều hành một agency digital marketing. Tuy nhiên, Claude Code trong Cursor đã trở thành cách nhanh nhất để tôi xử lý nhiều tác vụ, bao gồm truy xuất và phân tích dữ liệu từ Google Search Console, GA4 và Google Ads.
Việc thiết lập chỉ mất khoảng một giờ. Sau đó, bạn có thể đặt những câu hỏi như:
“Những từ khóa nào tôi đang trả tiền quảng cáo nhưng đã có thứ hạng tự nhiên (organic) rồi?”
Và bạn sẽ nhận được câu trả lời chỉ trong vài giây, thay vì phải dành cả buổi chiều xử lý bảng tính. (Thực ra tôi cũng không phải người trực tiếp ngồi cả buổi chiều với spreadsheet, nhưng giờ thì không ai phải làm điều đó nữa.)
Dưới đây là quy trình từng bước mà tôi đã phát triển khi phân tích dữ liệu cho các khách hàng của agency. Nếu phần này trông 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.
Bạn đang xây dựng điều gì?
Kết quả cuối cùng sẽ là một thư mục dự án (project directory), nơi Claude Code có thể truy cập các script Python để lấy dữ liệu trực tiếp từ Google APIs.
Bạn chỉ cần fetch dữ liệu, dữ liệu sẽ được lưu vào các file JSON, sau đó bạn trò chuyện trực tiếp với dữ liệu đó.
-
Không cần xây dựng dashboard
-
Không cần duy trì template trong Looker Studio
-
Về cơ bản, bạn đang cung cấp cho Claude Code cùng một bộ dữ liệu mà team SEO thường xem, và để AI tự thực hiện việc đối chiếu dữ liệu (cross-referencing).
Cấu trúc thư mục dự án
seo-project/
├── config.json # Thông tin client + 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 hiển thị trên AI Search
├── data/
│ ├── gsc/ # Hiệu suất truy vấn + trang
│ ├── ga4/ # Lưu lượng theo kênh, trang top
│ ├── ads/ # Search terms, chi phí, chuyển đổi
│ └── ai-visibility/ # Dữ liệu trích dẫn từ AI
└── reports/ # Các báo cáo phân tích được tạo ra
Bước 1: Thiết lập xác thực Google API
Toàn bộ hệ thống chạy thông qua một service account trên Google Cloud. Một service account có thể dùng chung cho cả Google Search Console và Google Analytics 4, điều này khá thuận tiện. Tuy nhiên, Google Ads cần thiết lập OAuth riêng, điều này hơi phức tạp hơn nhưng vẫn có thể quản lý được.
Thiết lập xác thực Google API
Service account (dùng cho GSC + GA4)
-
Tạo một project trong Google Cloud Console.
-
Bật Search Console API và Google Analytics Data API.
-
Tạo service account trong mục IAM & Admin > Service Accounts.
-
Tải file JSON key về.
-
Thêm email của service account làm user trong property của Google Search Console (chỉ cần quyền read access).
-
Thêm email đó làm Viewer trong property của Google Analytics 4.
Email của service account sẽ có dạng:
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ư khi thêm một 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à có thể sử dụng.
Xác thực Google Ads
Google Ads hoạt động khác. Bạn sẽ cần:
-
developer token từ Google Ads API Center (Tools & Settings > Setup > API Center)
-
thông tin xác thực OAuth 2.0 từ Google Cloud (không phải service account, mà là OAuth client riêng)
-
một lần xác thực qua trình duyệt để tạo refresh token
Developer token yêu cầu gửi đơn đăng ký. Với agency, bạn có thể mô tả mục đích là “automated reporting for marketing clients”. Thông thường việc phê duyệt mất khoảng 24–48 giờ.
Nếu bạn sử dụng Manager Account (MCC), chỉ cần một developer token và một refresh token cho toàn bộ các tài khoản con. Bạn chỉ cần thay đổi customer ID cho từng khách hàng.
Nếu bạn chưa có quyền truy cập API hoặc chưa có MCC, ví dụ khi mới onboard một khách hàng, bạn có thể bỏ qua API. Hãy tải dữ liệu 90 ngày về keyword và search terms dưới dạng CSV từ giao diện Google Ads, đặt chúng vào thư mục data. Claude Code vẫn có thể phân tích dữ liệu này bình thường. Đây cũng là cách chúng tôi xử lý các khách hàng chưa nằm trong MCC của agency.
Cài đặt các thư viện Python cần thiết
Các ví dụ dưới đây giả định bạn đang làm việc trong terminal trên máy Mac hoặc Linux. Nếu dùng Windows, cách đơn giản nhất là sử dụng Windows Subsystem for Linux (WSL).
Bước 2: Xây dựng các script lấy dữ liệu
Mỗi fetcher là một script Python ngắn có nhiệm vụ xác thực, lấy dữ liệu và lưu dưới dạng 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 script.
Một điều khá bất ngờ là tôi không cần đọc tài liệu API. Không phải cho GSC, GA4 hay Google Ads.
Tôi chỉ cần nói đại loại như: “Tôi muốn lấy 1.000 truy vấn hàng đầu từ Search Console trong 90 ngày gần nhất”, và Claude Code sẽ tự xử lý việc xác thực, endpoint và tham số truy vấn. Nó đã hiểu sẵn các API này, bạn chỉ cần nói mình muốn dữ liệu gì.
Script lấy dữ liệu Google Search Console
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 các truy vấn cùng với số clicks, impressions, CTR và vị trí trung bình. Sau đó lưu dữ liệu này dưới dạng JSON.
Script lấy dữ liệu GA4
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)
Script lấy dữ liệu Google Ads
Google Ads sử dụng Google Ads Query Language (GAQL). Nếu bạn từng viết truy vấn SQL, cấu trúc này sẽ khá quen thuộc. Nếu chưa từng viết, bạn cũng không cần lo vì Claude Code có thể tạo truy vấn giúp bạn.
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 loại dữ liệu như báo cáo Search Terms khi bạn tải từ giao diện Google Ads: impressions, clicks, chi phí, conversions, match type, campaign và ad group.
Bước 3: Tạo file cấu hình cho từng khách hàng
Mỗi khách hàng sẽ có một file JSON riêng. Không cần cấu trúc phức tạp, chỉ bao gồm các property ID và một số thông tin bối cảnh:
{
“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 từ nhiều nguồn
Sau bước này, bạn sẽ có các file JSON từ Google Search Console, Google Analytics 4 và Google Ads nằm trong thư mục dự án. Claude Code có thể đọc tất cả chúng cùng lúc và trả lời những câu hỏi mà bình thường sẽ cần chuyển qua lại giữa nhiều tab và sử dụng VLOOKUP trong spreadsheet.
Phân tích khoảng trống giữa paid và organic
Câu hỏi có giá trị nhất mà tôi từng sử dụng là:
“Compare the GSC query data against the Google Ads search terms. Find keywords where we’re paying for clicks but already have strong organic positions. Also, find keywords where we’re spending on ads with zero organic visibility. Those are content gaps.”
Khi 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 đã phát hiện:
- 2.742 search terms đang tiêu tốn ngân sách quảng cáo nhưng không có click
- 351 cơ hội giảm chi phí quảng cáo vì kết quả organic đã có thứ hạng tốt
- 33 truy vấn organic hoạt động tốt mà quảng cáo có thể khuếch đại thêm
- 41 khoảng trống nội dung khi quảng cáo là sự hiện diện duy nhất (không có kết quả organic)
Toàn bộ phân tích chỉ mất khoảng 90 giây. Nếu làm thủ công, bạn sẽ phải tải CSV từ GSC và Google Ads, sau đó dùng VLOOKUP để đối chiếu dữ liệu, thường mất gần cả buổi chiều.
Những câu hỏi phân tích khác đáng thử
Khi đã có dữ liệu từ GSC, GA4 và Ads, bạn có thể hỏi thêm:
-
“Trang nào có nhiều impressions trong GSC nhưng CTR thấp? Traffic từ GA4 của những trang đó là bao nhiêu?”
→ giúp xác định cơ hội tối ưu meta description và title -
“20 truy vấn organic có impressions cao nhất nhưng chưa chạy quảng cáo là gì?”
→ gợi ý các keyword nên mở rộng quảng cáo -
“Nhóm các truy vấn GSC theo topic cluster và cho tôi biết cluster nào có impressions cao nhất nhưng vị trí trung bình thấp nhất.”
→ giúp ưu tiên đầu tư nội dung -
“Trang nào trong GA4 có bounce rate cao nhưng vị trí GSC lại tốt?”
→ dấu hiệu cần cải thiện nội dung trang
Claude Code thực chất không làm điều gì mà con người không thể làm bằng spreadsheet. Khác biệt là nó làm điều đó trong vài giây, và bạn có thể tiếp tục đặt câu hỏi mới mà không cần xây dựng lại toàn bộ phân tích.
Bước 5: Thêm hệ thống theo dõi khả năng hiển thị trên AI
Thứ hạng trên SERP truyền thống không còn phản ánh toàn bộ bức tranh nữa. Với sự xuất hiện của AI Overviews của Google, 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 mình hay không.
Điều này đặc biệt quan trọ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 quá trình tìm hiểu thông tin thông qua các công cụ AI.
Các nền tảng AI cần theo dõi bao gồm:
- ChatGPT
- Perplexity AI
- Google Gemini
- Microsoft Copilot
Nếu bạn có nền tảng tracking
Các công cụ như:
- Semrush (AI Visibility toolkit)
- Scrunch
- Otterly.ai
có thể theo dõi sự xuất hiện của thương hiệu trên ChatGPT, Perplexity, Gemini, Google AI Overviews và Copilot.
Bạn chỉ cần export dữ liệu CSV hoặc JSON và đặt vào thư mục data. Claude Code sẽ tự đối chiếu dữ liệu trích dẫn AI với dữ liệu từ GSC và Google Ads.
Khi thực hiện phân tích này cho website của chính mình, chúng tôi phát hiện hai bài blog đang cạnh tranh cho cùng một AI citation trên các truy vấn liên quan đến GEO.
Một bài có số lần được Copilot trích dẫn nhiều gấp 12 lần bài còn lại, dù cả hai nhắm đến cùng search intent. Điều này dẫn đến quyết định gộp nội dung mà trước đó chúng tôi sẽ không nhận ra nếu chỉ dựa trên dữ liệu ranking truyền thống.
Đây là dạng AI search cannibalization mà nhiều team SEO hiện vẫn chưa theo dõi.
Nếu bạn không có nền tảng tracking
Bạn vẫn có thể bắt đầu mà không cần công cụ enterprise. Có nhiều API cho phép lấy dữ liệu AI search với chi phí khá thấp.
Một số lựa chọn phổ biến:
DataForSEO AI Overview API
Khoảng 0.01 USD cho mỗi truy vấn, yêu cầu nạp tối thiểu 50 USD. Bạn gửi một keyword và API sẽ trả về toàn bộ nội dung AI Overview trên Google SERP, bao gồm các URL được trích dẫn.
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
)