Script con notifica Telegram se l'account è offline
Un account Google Ads che smette di girare è un problema silenzioso. Ho adattato uno script che manda una notifica Telegram gratuita appena le impression si azzerano.
Come faccio a sapere se le campagne si sono fermate?
Uno degli scenari peggiori nella gestione di account Google Ads è scoprire, magari dopo giorni, che le campagne si erano fermate per un problema di pagamento o un annuncio rifiutato.
Per anni ho usato uno script di Frederick Vallaeys che invia un'email se l'account non genera impression nelle ultime 12 ore. Funziona, ma l'email è facile da perdere.
Poi ho scoperto uno script di Nils Rooijmans che mandava notifiche su WhatsApp, molto più immediato. Problema: le API di WhatsApp sono a pagamento.
Perché Telegram e non una email o WhatsApp?
Perché Telegram arriva come messaggio diretto ed è gratuito, mentre l'email finisce nel mucchio e le API di WhatsApp costano.
Ho chiesto aiuto a GPT per adattare lo script su Telegram, che è completamente gratuito. Il bot manda un messaggio diretto non appena l'account smette di generare impression.
Lo script è configurabile:
- Controlla le impression delle ultime X ore (default: 12)
- Puoi estenderlo per monitorare anche le conversioni, non solo le impression
- Funziona con qualsiasi account Google Ads tramite Google Ads Script
Come si configura lo script, passo per passo?
In quattro passaggi: crei il bot, recuperi il chat ID, incolli le due variabili nello script e imposti la pianificazione. Ci vogliono circa 10 minuti. Non servono competenze di programmazione.
1. Crea un bot Telegram
Apri Telegram, cerca @BotFather e invia /newbot. Segui le istruzioni e prendi nota del BOT_TOKEN che ti verrà fornito. Se è la prima volta che ne crei uno, ho scritto una guida passo passo a BotFather con tutti i dettagli.
2. Recupera il tuo CHAT_ID
Invia un messaggio al bot, poi apri questa URL nel browser (sostituendo {BOT_TOKEN} con il tuo token):
https://api.telegram.org/bot{BOT_TOKEN}/getUpdates
Il CHAT_ID è nel campo "id" all'interno di "chat".
3. Configura lo script
Incolla il BOT_TOKEN e il CHAT_ID nelle variabili dello script, poi caricalo in Google Ads tramite Strumenti → Script.
4. Imposta la pianificazione
Configura lo script per girare ogni ora. Con 12 ore come finestra di controllo, l'avviso arriva entro un'ora da quando l'account si ferma.
Cosa controllo quando arriva la notifica?
Per prima cosa i metodi di pagamento, che è esattamente quello che ti dice il messaggio del bot. È il primo posto dove guardare quando un account smette di colpo di generare impression.
L'altra causa tipica è quella con cui apro l'articolo, l'annuncio rifiutato. In quel caso la strada che uso è doppia: ricorso e, in parallelo, un annuncio nuovo quasi identico con una piccola modifica, perché il ricorso richiede almeno 48 ore e nel frattempo l'account resta fermo.
Qual è il codice completo dello script?
Eccolo qui sotto, pronto da incollare. Le uniche righe da toccare sono le prime: TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID e, se ti serve una finestra diversa dalle 12 ore, NUM_HOURS_TO_CHECK.
var TELEGRAM_BOT_TOKEN = "INSERT_YOUR_BOT_TOKEN"; // Insert your Telegram bot token
var TELEGRAM_CHAT_ID = "INSERT_YOUR_CHAT_ID"; // Insert your chat ID to receive notifications
var NUM_HOURS_TO_CHECK = 12;
var METRIC_TO_CHECK = "Impressions";
var DEBUG = 1; // Set to 1 to enable debug logs
Date.prototype.yyyymmdd = function () {
var yyyy = this.getFullYear().toString();
var mm = (this.getMonth() + 1).toString();
var dd = this.getDate().toString();
return yyyy + (mm[1] ? mm : "0" + mm[0]) + (dd[1] ? dd : "0" + dd[0]);
};
function getDateRangeYesterdayToToday() {
var currentDate = new Date();
var tempDate = new Date();
tempDate.setDate(tempDate.getDate() - 1);
var yesterdayDate = tempDate;
return yesterdayDate.yyyymmdd() + "," + currentDate.yyyymmdd();
}
function sendTelegramMessage(chatId, message) {
var url = "https://api.telegram.org/bot" + TELEGRAM_BOT_TOKEN + "/sendMessage";
var payload = {
chat_id: chatId,
text: message,
parse_mode: "HTML"
};
var options = {
method: "post",
contentType: "application/json",
payload: JSON.stringify(payload)
};
var response = UrlFetchApp.fetch(url, options);
if (DEBUG) Logger.log("Telegram Response: " + response.getContentText());
}
function main() {
var dateRange = getDateRangeYesterdayToToday();
var currentDate = new Date();
Logger.log("Date Range: " + dateRange);
// Generate the query to fetch performance data
var queryText =
"SELECT " +
METRIC_TO_CHECK +
", DayOfWeek, HourOfDay FROM ACCOUNT_PERFORMANCE_REPORT DURING " +
dateRange;
Logger.log("Query Text: " + queryText);
var result = AdWordsApp.report(queryText);
var rows = result.rows();
var daysMapping = [];
daysMapping["Sunday"] = 0;
daysMapping["Monday"] = 1;
daysMapping["Tuesday"] = 2;
daysMapping["Wednesday"] = 3;
daysMapping["Thursday"] = 4;
daysMapping["Friday"] = 5;
daysMapping["Saturday"] = 6;
var impressionsByHour = {};
// Read data from the report
while (rows.hasNext()) {
var currentRow = rows.next();
var dayFactor = daysMapping[currentRow["DayOfWeek"]];
var hourFactor = parseInt(currentRow["HourOfDay"], 10);
var actualHour = dayFactor * 24 + hourFactor;
impressionsByHour[actualHour] = parseInt(currentRow[METRIC_TO_CHECK], 10) || 0;
if (DEBUG) {
Logger.log(
"Day: " +
currentRow["DayOfWeek"] +
", Hour: " +
currentRow["HourOfDay"] +
", " +
METRIC_TO_CHECK +
": " +
currentRow[METRIC_TO_CHECK]
);
}
}
Logger.log("ImpressionsByHour: " + JSON.stringify(impressionsByHour));
// Check activity in the last NUM_HOURS_TO_CHECK hours
var foundEntry = false;
var numHoursToCheck = NUM_HOURS_TO_CHECK + 1;
for (var i = 1; i < numHoursToCheck; i++) {
var tempDate = new Date(currentDate.getTime());
tempDate.setHours(tempDate.getHours() - i);
var hourIndexToCheck = tempDate.getDay() * 24 + tempDate.getHours();
var impressions = impressionsByHour[hourIndexToCheck] || 0;
if (DEBUG) {
Logger.log(
"Checking HourIndex: " +
hourIndexToCheck +
", Impressions: " +
impressions
);
}
if (impressions > 0) {
foundEntry = true;
break;
}
}
if (foundEntry) {
Logger.log(
"All good! The account seems to be active in the last " +
NUM_HOURS_TO_CHECK +
" hours."
);
} else {
var message =
"⚠️ <b>Warning</b>: The Google Ads account <b>" +
AdWordsApp.currentAccount().getName() +
"</b> (ID: " +
AdWordsApp.currentAccount().getCustomerId() +
") has not received any impressions in the last " +
NUM_HOURS_TO_CHECK +
" hours. Please check the payment methods!";
sendTelegramMessage(TELEGRAM_CHAT_ID, message);
Logger.log(
"WARNING: The account has been inactive for the last " +
NUM_HOURS_TO_CHECK +
" hours."
);
}
}
Questo script fa una cosa sola e la fa bene: ti avvisa quando l'account si spegne. Se invece vuoi un controllo quotidiano più ampio, ho scritto anche un assistente bot su Telegram che ogni giorno manda un riepilogo di conversioni, spesa, campagne senza impression, link rotti e stato dei prodotti.
Di questo script non esiste una versione per account MCC. Se ti dovesse servire scrivimi, posso crearla su misura per te.
Scrivimi se hai bisogno di aiuto nella configurazione. Nel frattempo puoi vedere tutti i miei script per Google Ads.
Domande frequenti
Come faccio a sapere se le campagne Google Ads si sono fermate?
Con uno script che controlla le impression delle ultime ore e ti manda un messaggio su Telegram appena l'account smette di generarne. Lo scenario peggiore è scoprire dopo giorni che le campagne erano ferme per un problema di pagamento o un annuncio rifiutato.
Perché Telegram e non una email?
Perché l'email si perde. Per anni ho usato lo script di Frederick Vallaeys che manda un alert via mail: funziona, ma finisce nel mucchio. Telegram arriva come messaggio diretto.
E perché non WhatsApp?
Esiste uno script di Nils Rooijmans che lo fa, ma le API di WhatsApp sono a pagamento. Telegram è completamente gratuito.
Serve saper programmare per configurarlo?
No, e servono circa dieci minuti: creare il bot con BotFather, recuperare il chat ID e incollare le due variabili nello script.
Ogni quanto controlla l'account?
Di default guarda le impression delle ultime 12 ore, ma la finestra è configurabile. Si può estendere il controllo anche alle conversioni, non solo alle impression.
Cosa controllo quando arriva la notifica di account fermo?
Prima i metodi di pagamento, che è quello che suggerisce il messaggio stesso del bot. L'altra causa tipica di un account che smette di generare impression è un annuncio rifiutato: in quel caso conviene fare ricorso e, in parallelo, ricaricare l'annuncio con una piccola modifica.