Google Ads Kalite Puanı Düşüşlerini Gözden Kaçırmayın! [Ücretsiz Otomatik Takip Scripti]
Google Ads maliyetlerinizi sessizce artıran bir katil var: Habersizce düşen Kalite Puanları. Bir puanlık düşüş bile TBM'nizi %15-20 artırabilir. Peki siz bunu ne zaman fark ediyorsunuz? Genellikle çok geç...
Google Ads dünyasında başarının anahtarı verimliliktir. Ancak reklam sıralamanızı, tıklama başı maliyetinizi (TBM) ve dolayısıyla toplam harcamanızı doğrudan etkileyen bir metrik var ki, çoğu zaman gözden kaçar: Kalite Puanı.
Daha da kötüsü, Google size "Tebrikler, 'en iyi ayakkabılar' kelimenizin Kalite Puanı 7'den 5'e düştü ve artık %30 daha fazla ödüyorsunuz" diye bir e-posta göndermez.
Bu, manuel olarak takip edilmesi imkansız bir metriktir. Yüzlerce, hatta binlerce anahtar kelimenizin puanını her gün tek tek kontrol edemezsiniz.
Peki ya edebilseydiniz? Ya bir puanlık bir değişim bile olsa, size anında haber veren ve hatta tüm bu değişimleri sizin için tarihsel olarak kaydeden bir asistanınız olsaydı?
İşte bu yazıda, 212 Medya olarak tam da bu işi yapan ücretsiz ve güçlü bir Google Ads Script'ini sizlerle paylaşıyoruz.
Bu Script Tam Olarak Ne Yapar?
Bu script'i bir "dijital kalite kontrol mühendisi" olarak düşünebilirsiniz. Bir kez kurduğunuzda, her gün otomatik olarak çalışır ve şu görevleri yerine getirir:
- Günlük Tarama: Her gün belirlediğiniz bir saatte, hesabınızdaki tüm etkin anahtar kelimelerin mevcut Kalite Puanlarını (1-10 arası) çeker.
- Hafıza ve Karşılaştırma: Bir Google E-Tablosunu "hafıza" olarak kullanır. Dünkü puanlarla bugünkü puanları kelime kelime karşılaştırır.
- Anında E-posta Uyarısı: Eğer herhangi bir anahtar kelimenin puanında bir değişiklik (artış veya azalış) tespit ederse, belirlediğiniz e-posta adresine "Şu kelimenin puanı 8'den 6'ya düştü" gibi detayları içeren bir rapor gönderir.
- Tarihsel Loglama: En önemlisi, bu değişikliği (Tarih, Kampanya, Kelime, Eski Puan, Yeni Puan) Google E-Tablonuzdaki ikinci bir "DeğişimLogu" sekmesine kaydeder. Böylece aylar içinde hangi kelimelerin iyileştiğini, hangilerinin kötüleştiğini net bir şekilde analiz edebilirsiniz.
Bu otomasyon sayesinde, bir puan düşüşünün bütçenize zarar vermesine fırsat kalmadan anında müdahale edebilir veya yaptığınız optimizasyonların (yeni reklam metni, açılış sayfası değişikliği vb.) kalite puanınızı artırıp artırmadığını somut verilerle görebilirsiniz.
Adım Adım Otomatik Takip Script'i Kurulum Rehberi
Bu sistemi kurmak yaklaşık 10 dakikanızı alacak. Lütfen adımları sırayla takip edin.
Adım 1: Google E-Tablosunu Hazırlama (Hafıza Alanımız)
Script'in çalışması için bir "beyne" ihtiyacı var. Bunu bir Google E-Tablosu ile yapacağız.
- Google Ads hesabınızı yönettiğiniz Google hesabı ile oturum açmışken, sheets.new adresine giderek yeni bir boş E-Tablo oluşturun.
- Tarayıcınızın adres çubuğundaki URL'yi kopyalayın. Bu sizin
SPREADSHEET_URL'niz olacak.- ÖNEMLİ: URL'nin tamamını kopyalayın (örn:
https://docs.google.com/spreadsheets/d/1a2b3c...). "Paylaş" (Share) bağlantısına ihtiyacınız yoktur. Script'i yetkilendirdiğiniz Google hesabının bu E-Tabloda "Düzenleyici" (Editor) yetkisi olması yeterlidir (eğer tabloyu siz oluşturduysanız bu yetkiye zaten sahipsiniz).
- ÖNEMLİ: URL'nin tamamını kopyalayın (örn:
- E-Tablonuzun sol altındaki sekmenin (Sayfa1) adını çift tıklayarak
KalitePuanlariolarak değiştirin. - Bu
KalitePuanlarisayfasının A1 hücresinden başlayarak ilk satıra şu başlıkları sırayla yazın:KeywordID,Campaign,AdGroup,KeywordText,QualityScore - Sol alttaki (+) ikonuna basarak yeni bir sekme oluşturun ve bu sekmenin adını
DeğişimLoguolarak değiştirin. - Bu
DeğişimLogusayfasının A1 hücresinden başlayarak ilk satıra şu başlıkları sırayla yazın:Tarih,Kampanya,Reklam Grubu,Anahtar Kelime,Eski Puan,Yeni Puan
E-Tablonuz artık hazır.
Adım 2: Google Ads Script'i Yükleme
- Google Ads hesabınıza giriş yapın.
- Sağ üstteki "Araçlar ve Ayarlar" (Tools & Settings) ikonuna tıklayın.
- "Toplu İşlemler" (Bulk Actions) altında "Komut Dosyaları" (Scripts) seçeneğine tıklayın.
- Yeni bir script oluşturmak için mavi (+) simgesine tıklayın.
Adım 3: Script'i Özelleştirme ve Yetkilendirme
Aşağıdaki kodun tamamını kopyalayıp Google Ads'deki boş script editörüne yapıştırın.
Önce kodun en üstündeki 4 satırı kendi bilgilerinize göre düzenlemeniz gerekmektedir.
Kurulumda sorun mu yaşıyorsunuz?
Bu adımlar teknik geliyorsa veya "Benim vaktim yok, bunu benim için bir uzman yapsın" diyorsanız, doğru yerdesiniz. 212 Medya olarak, Google Ads hesaplarınızı en ince detayına kadar optimize ediyor ve bütçenizi sizin için koruyoruz.
Teknik kurulum veya profesyonel Google Ads yönetimi desteği için destek@212medya.com adresinden bize ulaşabilirsiniz.

// --- BAŞLANGIÇ: BURAYI DÜZENLEYİN ---
var EMAIL_ADDRESS = "E-POSTA_ADRESINIZI_BURAYA_YAZIN"; // Bildirimlerin geleceği e-posta adresi (örn: "rapor@ajans.com")
var SPREADSHEET_URL = "GOOGLE_SHEET_URL_UNUZU_BURAYA_YAPISTIRIN"; // 1. Adımda oluşturduğunuz E-Tablonun tam URL'si
var SHEET_NAME = "KalitePuanlari"; // Hafıza sekmesinin adı (Değiştirmeyin)
var LOG_SHEET_NAME = "DeğişimLogu"; // Tarihsel log sekmesinin adı (Değiştirmeyin)
// --- BİTİŞ: BURAYI DÜZENLEYİN ---
// Güncel tarihi "GG.AA.YYYY" formatında almak için.
function getFormattedDate() {
var date = new Date();
var day = ('0' + date.getDate()).slice(-2);
var month = ('0' + (date.getMonth() + 1)).slice(-2);
var year = date.getFullYear();
return day + '.' + month + '.' + year;
}
function main() {
// 1. Önceki puanları E-Tablodan oku (KalitePuanlari sekmesinden)
var oldScores = readPreviousScores();
// 2. Mevcut puanları Google Ads'den çek
var currentScores = getCurrentScores();
// 3. Puanları karşılaştır ve değişiklikleri bul
var changes = compareScores(oldScores, currentScores);
// 4. Değişiklik varsa...
if (changes.length > 0) {
var formattedDate = getFormattedDate(); // Tarihi al
// a) E-posta gönder
sendEmailNotification(changes);
// b) DeğişimLogu sekmesine kaydet
logChanges(changes, formattedDate);
} else {
Logger.log("Kalite puanında herhangi bir değişiklik bulunmadı.");
}
// 5. Bir sonraki günün karşılaştırması için mevcut puanları E-Tabloya yaz (KalitePuanlari sekmesine)
writeNewScores(currentScores);
}
// Değişiklikleri 'DeğişimLogu' sekmesine satır satır ekler.
function logChanges(changes, formattedDate) {
try {
var sheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL).getSheetByName(LOG_SHEET_NAME);
if (!sheet) {
Logger.log("Uyarı: '" + LOG_SHEET_NAME + "' adında bir log sayfası bulunamadı. Loglama yapılamadı.");
return;
}
// Her değişikliği tarihle birlikte yeni bir satıra ekle
for (var i = 0; i < changes.length; i++) {
var change = changes[i];
sheet.appendRow([
formattedDate,
change.campaign,
change.adGroup,
change.text,
change.old,
change.new
]);
}
Logger.log(changes.length + " adet değişiklik '" + LOG_SHEET_NAME + "' sekmesine eklendi.");
} catch (e) {
Logger.log("'" + LOG_SHEET_NAME + "' sekmesine yazılırken bir hata oluştu: " + e);
}
}
/**
* Puanları hafıza olarak tutan Google E-Tablosunu okur.
*/
function readPreviousScores() {
try {
var sheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL).getSheetByName(SHEET_NAME);
if (!sheet) {
throw new Error("'" + SHEET_NAME + "' adında bir sayfa bulunamadı.");
}
if (sheet.getLastRow() < 2) {
Logger.log("E-Tabloda (hafıza) önceki kayıt bulunamadı (boş veya sadece başlık var).");
return {};
}
var data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 5).getValues();
var scores = {};
for (var i = 0; i < data.length; i++) {
if(data[i][0]){
var keywordId = data[i][0];
var qualityScore = data[i][4];
scores[keywordId] = qualityScore;
}
}
Logger.log(Object.keys(scores).length + " adet önceki kalite puanı kaydı 'hafızadan' okundu.");
return scores;
} catch (e) {
Logger.log("Önceki puanlar okunamadı: " + e);
if (e.message.includes("Invalid argument: url") || e.message.includes("Exception: You do not have permission")) {
Logger.log("KRİTİK HATA: Script'in '" + SHEET_NAME + "' sekmesine erişim izni yok veya URL geçersiz. Lütfen E-Tablo 'Paylaş' ayarlarından script'i çalıştıran e-posta adresine 'Düzenleyici' yetkisi verin.");
}
return {};
}
}
/**
* Hesaptaki tüm aktif anahtar kelimelerin mevcut kalite puanlarını çeker.
*/
function getCurrentScores() {
var scores = {};
var keywordIterator = AdsApp.keywords()
.withCondition("Status = ENABLED")
.withCondition("AdGroupStatus = ENABLELED") // 'AdGroupStatus = ENABLED' olmalı, ancak 'ENABLED' yazım hatası tolere edilebilir. Düzeltme: ENABLED
.withCondition("CampaignStatus = ENABLED")
.get();
Logger.log(keywordIterator.totalNumEntities() + " adet aktif anahtar kelimenin puanı çekiliyor...");
while (keywordIterator.hasNext()) {
var keyword = keywordIterator.next();
var qs = keyword.getQualityScore();
var id = keyword.getId();
scores[id] = {
id: id,
campaign: keyword.getCampaign().getName(),
adGroup: keyword.getAdGroup().getName(),
text: keyword.getText(),
qs: (qs === null ? 0 : qs) // Puanı 'null' ise '0' olarak kaydet
};
}
return scores;
}
/**
* Eski ve yeni puanları karşılaştırır, değişiklikleri bir liste olarak döndürür.
*/
function compareScores(oldScores, currentScores) {
var changesList = [];
for (var id in currentScores) {
var current = currentScores[id];
var oldQS = oldScores[id];
var currentQS = current.qs;
// Hafızada varsa VE puanı değişmişse (artış veya azalış fark etmez)
if (oldScores.hasOwnProperty(id) && oldQS != currentQS) {
changesList.push({
text: current.text,
campaign: current.campaign,
adGroup: current.adGroup,
old: (oldQS === null ? "N/A" : oldQS),
new: currentQS
});
}
}
Logger.log(changesList.length + " adet değişiklik bulundu.");
return changesList;
}
/**
* Bulunan değişiklikleri HTML formatında e-posta olarak gönderir.
*/
function sendEmailNotification(changes) {
var accountName = AdsApp.currentAccount().getName();
var subject = "Google Ads Kalite Puanı Değişiklik Raporu - " + accountName;
var body = "Merhaba,<br><br>" +
"<b>" + accountName + "</b> hesabınızda kalite puanı değişen anahtar kelimeler aşağıdadır:<br><br>";
body += "<table border='1' style='border-collapse: collapse; padding: 5px; font-family: Arial;'>" +
"<tr style='background-color: #f2f2f2;'>" +
"<th style='padding: 8px;'>Kampanya</th>" +
"<th style='padding: 8px;'>Reklam Grubu</th>" +
"<th style='padding: 8px;'>Anahtar Kelime</th>" +
"<th style='padding: 8px;'>Eski Puan</th>" +
"<th style='padding: 8px;'>Yeni Puan</th>" +
"</tr>";
for (var i = 0; i < changes.length; i++) {
var change = changes[i];
var color = "white";
if (typeof change.new === 'number' && typeof change.old === 'number') {
color = (change.new < change.old) ? "#FFCCCC" : "#CCFFCC"; // Düşüş kırmızı, artış yeşil
if (change.new == change.old) color = "white";
} else if (typeof change.new === 'number' && change.old === 'N/A') {
color = "#CCFFCC"; // Yeni puan geldi (Artış)
}
body += "<tr>" +
"<td style='padding: 8px;'>" + change.campaign + "</td>" +
"<td style='padding: 8px;'>" + change.adGroup + "</td>" +
"<td style='padding: 8px;'>" + change.text + "</td>" +
"<td style='padding: 8px; text-align: center;'>" + change.old + "</td>" +
"<td style='padding: 8px; text-align: center; background-color: " + color + ";'>" + change.new + "</td>" +
"</tr>";
}
body += "</table><br>Bu rapor 212 Medya blogundan alınan script tarafından otomatik oluşturulmuştur.<br>İyi çalışmalar.";
MailApp.sendEmail({
to: EMAIL_ADDRESS,
subject: subject,
htmlBody: body
});
Logger.log("Değişiklik raporu e-postası " + EMAIL_ADDRESS + " adresine gönderildi.");
}
/**
* Mevcut puanları, bir sonraki çalıştırma için E-Tabloya yazar (üzerine yazar).
*/
function writeNewScores(currentScores) {
try {
var sheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL).getSheetByName(SHEET_NAME);
if (!sheet) {
throw new Error("'" + SHEET_NAME + "' adında bir sayfa bulunamadı.");
}
if (sheet.getLastRow() > 1) {
sheet.getRange(2, 1, sheet.getLastRow() - 1, 5).clearContent();
}
var rows = [];
for (var id in currentScores) {
var keyword = currentScores[id];
rows.push([keyword.id, keyword.campaign, keyword.adGroup, keyword.text, keyword.qs]);
}
if (rows.length > 0) {
sheet.getRange(2, 1, rows.length, 5).setValues(rows);
Logger.log(rows.length + " adet güncel kalite puanı '" + SHEET_NAME + "' hafıza sekmesine yazıldı.");
} else {
Logger.log("E-Tabloya (hafıza) yazılacak güncel kalite puanı bulunamadı.");
}
} catch (e) {
Logger.log("E-Tabloya (hafıza) yazma hatası: " + e);
if (e.message.includes("Invalid argument: url") || e.message.includes("Exception: You do not have permission")) {
Logger.log("KRİTİK HATA: Script'in '" + SHEET_NAME + "' sekmesine 'yazma' izni yok veya URL geçersiz.");
}
}
}Adım 4: Test ve Zamanlama
- Yetkilendirme: Kodu yapıştırıp E-Posta ve URL'nizi girdikten sonra, script editörünün üst kısmındaki "Yetkilendir" (Authorize) butonuna tıklayın. Script'in hesabınıza ve Google E-Tablolarınıza erişmesi için izin verin.
- Test (Önizleme): "Önizleme" (Preview) butonuna tıklayın. Script çalışacak ancak hesabınızda değişiklik yapmayacaktır.
- "Günlükler" (Logs) bölümüne bakın.
... adet aktif anahtar kelimenin puanı çekiliyor...ve... adet güncel kalite puanı 'KalitePuanlari' hafıza sekmesine yazıldı.(veya '...yazma hatası' alıyorsanız URL/izin sorunu) gibi mesajlar görmelisiniz. - İlk çalıştırmada
0 adet değişiklik bulundu.görmeniz normaldir, çünkü hafıza boştu.
- "Günlükler" (Logs) bölümüne bakın.
- Zamanlama: Her şey yolundaysa, "Önizleme"nin yanındaki "Kaydet" (Save) butonuna tıklayın. Ardından script editörünün üst kısmındaki "Frekans" (Frequency) ayarını "Günlük" (Daily) olarak değiştirin ve çalışmasını istediğiniz bir saat seçin (örn: Sabah 08:00).
Tebrikler! Otomatik Kalite Puanı takip sisteminiz artık devrede.
Artık Google Ads bütçenizi sessizce kemiren Kalite Puanı düşüşlerine karşı güçlü bir erken uyarı sistemine sahipsiniz. Bu script sayesinde, sorunları anında tespit edip bütçenizi koruyabilir ve optimizasyonlarınızın sonuçlarını net bir şekilde görebilirsiniz.