How To Track AI Overviews For Your Website
What is this script?
This script allows you to track if your website is appearing in top 5 links of AI Overview referrence websites for your keywords. This script uses SERP API (https://serpapi.com). You can use their free or paid plan for this script.
How to use this script?
Go to line 36 and paste your SERP API key.
The rest is explained in the video (down below)
The Script (AI Overviews Tracker)
//This script was created by TeamAmitTiwari, watch full video at https://youtu.be/JN4s1E4VLEk
//Enter your SERP API key at serpapi.com and enter at line 36
function checkAIOverviews() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var historySheet = ss.getSheetByName("History");
if (!historySheet) {
historySheet = ss.insertSheet("History");
historySheet.appendRow(["Date", "Query", "AI Overview", "Top 5 References", "Target Site Match"]);
historySheet.getRange("A:A").setNumberFormat("yyyy-MM-dd");
}
var lastRow = sheet.getLastRow();
if (lastRow < 2) {
Logger.log("No data found.");
return;
}
var queries = sheet.getRange(2, 1, lastRow - 1, 1).getValues();
var today = Utilities.formatDate(new Date(), ss.getSpreadsheetTimeZone(), "yyyy-MM-dd");
var targetDomain = sheet.getRange("H2").getValue().toLowerCase().replace(/^https?:///, '').replace(/^www./, '').split("/")[0];
for (var i = 0; i < queries.length; i++) {
var query = queries[i][0];
var row = i + 2;
if (!query) continue;
var status = "";
var referencesList = "";
var siteMatch = "";
var aiPresent = false;
try {
var apiKey = "Your_API_Key"; // Replace with your SerpApi key
var searchUrl = "https://serpapi.com/search?engine=google&q=" + encodeURIComponent(query) + "&api_key=" + apiKey;
var response = UrlFetchApp.fetch(searchUrl);
var data = JSON.parse(response.getContentText());
if (data.error || (data.search_metadata && data.search_metadata.status === "Error")) {
throw new Error(data.error || "SerpApi error");
}
if (data.ai_overview) {
var refs = data.ai_overview.references;
if (refs && refs.length > 0) {
aiPresent = true;
status = "Yes";
var topRefs = refs.slice(0, 5).map(ref => ref.link).filter(Boolean);
referencesList = topRefs.join("n");
var matchFound = topRefs.some(link => {
var linkDomain = link.toLowerCase().replace(/^https?:///, '').replace(/^www./, '').split("/")[0];
return linkDomain === targetDomain;
});
siteMatch = matchFound ? "Yes" : "No";
} else if (data.ai_overview.page_token) {
status = "N/A";
siteMatch = "N/A";
} else {
status = "No";
siteMatch = "No";
}
} else {
status = "No";
siteMatch = "No";
}
} catch (e) {
Logger.log("Error in row " + row + ": " + e.message);
status = "Error: " + e.message;
referencesList = "";
siteMatch = "";
}
// Write to main sheet
sheet.getRange(row, 2).setValue(status);
sheet.getRange(row, 3).setValue(referencesList);
sheet.getRange(row, 4).setValue(siteMatch);
// Sparkline in Column E (as line chart now)
var sparklineFormula =
'=IF($A' + row + '="","", IFERROR(SPARKLINE(IF(FILTER(History!$C:$C, History!$B:$B=$A' + row + ')="Yes", 1, 0), {"charttype","line"}), ""))';
sheet.getRange(row, 5).setFormula(sparklineFormula);
// Log to History (only if not error or N/A)
if (!status.startsWith("Error") && status !== "N/A") {
historySheet.appendRow([
new Date(),
query,
status,
referencesList,
siteMatch
]);
}
}
}
DOWNLOAD THIS ON YOUR SYSTEM