SteerAds
GuideOptimisationGoogle Ads

Google Ads Scripts: 10 listos para copiar

Google Ads Scripts = JavaScript ejecutado por Google en su infra con acceso nativo a la Google Ads API. Alertas de gasto, negativas automáticas, auditorías de cuenta, informes semanales — aquí tienes los 10 scripts más rentables para instalar en 2026, con snippet clave, planificación recomendada y ahorro de tiempo estimado.

Matt
MattTracking & Data Lead
···13 min de lectura

Las cuentas que ejecutan al menos 5 Google Ads Scripts gastan entre un 18 y un 26% menos de presupuesto desperdiciado — search terms parásitos, 404 no detectados, pujas incoherentes. Sin embargo, solo el 12-18% de las pymes en España los utilizan en 2026. La brecha es el mayor ROI de automatización disponible, por unas horas de instalación.

Google Ads Scripts sigue siendo en 2026 una de las funcionalidades más infraexplotadas de la plataforma. En nuestras cuentas auditadas en 2025, solo el 12-18% de las pymes españolas utilizan activamente Google Ads Scripts (según la fuente), cuando una decena de scripts bien diseñados ahorra de 10 a 15 horas por semana al equipo de ops. El ticket de entrada es sin embargo minúsculo: JavaScript de nivel principiante, ejecución gratuita alojada por Google, cero infra que mantener.

Esta guía lista los 10 scripts más rentables para instalar inmediatamente, con para cada uno el snippet clave, la planificación cron recomendada, la ganancia de tiempo media y el caso de uso adecuado. No es un copia-pega completo — para eso, la documentación oficial de Google Ads Scripts sigue siendo la referencia. Aquí, nos centramos en el qué y el porqué, con los snippets que matan. Para un panorama más amplio sobre el pilotaje sin agencia, lee también nuestra guía para pilotar Google Ads sin agencia.

¿Qué puede hacer un Google Ads Script (y qué no)?

Google Ads Scripts es JavaScript alojado y ejecutado por Google en su infraestructura, con acceso nativo a los objetos de la cuenta Google Ads vía una API envuelta. Ningún servidor Node que mantener, ninguna clave OAuth que gestionar, ningún cron externo que alquilar. Escribes una función main(), pegas el código en la interfaz de Scripts de la cuenta, autorizas los permisos necesarios y Google la ejecuta por ti — en modo preview (dry-run) o en planificación cron (horaria, diaria, semanal). Es gratis, y corre en los servidores de Google.

Casos de uso donde Scripts brilla: monitorización (alertas de gasto, anomalías, 404), automatización ligera (añadir negativas, pausar keywords con CVR bajo), reporting personalizado (digest semanal por email, export a Sheets), auditorías programadas (extensions faltantes, tracking roto, QS a la baja). Cualquier tarea ops repetitiva y acotada — leer estadísticas, tomar una decisión simple, enviar una alerta o modificar una entidad — es candidata ideal.

Casos donde Scripts es inadecuado: análisis estadístico profundo (sin librerías científicas tipo numpy), dependencias npm de terceros (imposible instalar), pilotaje en tiempo real sub-segundo (mínimo 1 ejecución por hora), workflows que superen 30 minutos (hard timeout). Para estos casos, pasa al backend Google Ads API (Python, Go) o a un SaaS de pilotaje que cubra la infra de monitorización + alertas + acciones sin código.

Insight clave :

en las cuentas que observamos, las cuentas con 5+ scripts activos gastan de media un 18-26% menos en presupuesto desperdiciado (según la madurez) (search terms parásitos, pujas incoherentes, 404 no detectados) que las cuentas sin automatización. El ROI de una inversión de 2-3 horas para instalar el stack de abajo se mide en semanas, no en meses.

Workflow de Google Ads Script — cron, pull, decisión, acciónPlanificación cronhoraria / diaria / semanalPull de datosAdsApp.currentAccount()Decisiónif / else, umbralesAlertaemail, Slack, webhookAcciónnegativa, pausar, puja

Límites técnicos que recordar: timeout de 30 minutos por ejecución, cuota diaria de API en bulk mutations, frecuencia mínima de 1 ejecución por hora, sin paquete npm (todo debe ser JavaScript puro ES5+ compatible con Rhino) y sintaxis ligeramente propietaria sobre los objetos AdsApp. Nada bloqueante para los 10 scripts de abajo, pero tenlo en cuenta si diseñas un script a medida que deba procesar un catálogo grande. Para los workflows que superen estos límites, la Google Ads API oficial (Python, Java, Go) sigue siendo el fallback de backend.

Total estimado: 10 a 15 horas por semana ahorradas si los 10 scripts corren en paralelo, en una cuenta media (3-8 campañas activas). Es el equivalente a un tercio de un full-time de ops junior — por 3 horas de instalación inicial.

¿Cómo detectar automáticamente una anomalía de gasto?

El script que detecta en menos de una hora un pico anormal de gasto — fuga de presupuesto, bug de pujas, ataque de bots, o simplemente un cambio estacional mal anticipado. Comparamos el gasto horario actual con la media móvil de 7 días, disparamos la alerta si supera un umbral (aquí 1,5× la media). Versión más fina: calcular la desviación típica, alertar por encima de 2σ.

Caso de uso: cualquier cuenta con presupuesto diario > 100 €. Crítico para e-commerce con picos estacionales y para SaaS donde un error de feed puede arruinar el presupuesto en 4 horas.

function main() {
  var today = AdsApp.currentAccount().getStatsFor("TODAY").getCost();
  var avg7d = AdsApp.currentAccount().getStatsFor("LAST_7_DAYS").getCost() / 7;
  if (today > avg7d * 1.5) {
    MailApp.sendEmail(
      "ops@example.com",
      "[SPEND ALERT] Anomaly detected",
      "Today: " + today.toFixed(2) + "€ vs 7d avg: " + avg7d.toFixed(2) + "€"
    );
  }
}

Planificación: horaria. Tiempo ahorrado: en torno a 1 hora por semana (se acabaron los check manuales de dashboard cada mañana). Mejora nivel 2: sustituye el umbral de 1,5× por un cálculo real de desviación típica sobre 30 días para evitar falsos positivos ligados a picos de fin de mes.

¿Cómo añadir automáticamente negativas a partir de search terms?

El script que escanea los search terms de los últimos 30 días y añade automáticamente como negativas los que cuestan más de X € con 0 conversiones. Rentabilidad inmediata: en nuestras auditorías, son de media del 8 al 15% del presupuesto Search los que se fugan en consultas fuera de scope. El script no reemplaza la revisión manual semanal — captura los peores ofensores inmediatamente.

Caso de uso: cuentas Search con broad match o phrase match activas, catálogo diversificado. Menos útil si ejecutas 100% exact match bien controlado.

function main() {
  var report = AdsApp.report(
    "SELECT search_term_view.search_term, metrics.cost_micros, metrics.conversions " +
    "FROM search_term_view WHERE segments.date DURING LAST_30_DAYS " +
    "AND metrics.cost_micros > 20000000 AND metrics.conversions = 0"
  );
  var rows = report.rows();
  var campaign = AdsApp.campaigns().withIds(["123456789"]).get().next();
  while (rows.hasNext()) {
    var r = rows.next();
    campaign.createNegativeKeyword('[' + r["search_term_view.search_term"] + ']');
  }
}

Planificación: diaria. Tiempo ahorrado: en torno a 2 horas por semana (se acabó la caza manual de search terms parásitos). Guardrail imprescindible: registra la lista de negativas añadidas en cada ejecución, y envuelve createNegativeKeyword en un try/catch — un bug aquí puede ponerle negativa a consultas convertidas si inviertes un operador.

Script 3 · Alerta de caída del Quality Score

El script que exporta diariamente el Quality Score de tus top keywords a una Google Sheet, compara con la puntuación de la semana anterior y alerta si una keyword cae más de 1 punto. Esencial para reaccionar antes de que el CPC explote — un QS que pasa de 8 a 6 aumenta el CPC medio entre un 40 y un 60%. Para profundizar en la mecánica del Quality Score, consulta nuestra checklist de auditoría Google Ads.

Caso de uso: cuentas Search maduras con 50+ keywords activas. Permite identificar rápidamente una landing que se degrada o un anuncio que pierde relevancia.

function main() {
  var sheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/XXX").getActiveSheet();
  var keywords = AdsApp.keywords()
    .withCondition("Status = ENABLED")
    .withCondition("Impressions > 100")
    .forDateRange("LAST_7_DAYS").get();
  while (keywords.hasNext()) {
    var kw = keywords.next();
    sheet.appendRow([new Date(), kw.getText(), kw.getQualityScore()]);
    // Compara con el valor D-7 aquí, alerta si caída > 1 pt
  }
}

Planificación: diaria. Tiempo ahorrado: en torno a 45 minutos por semana, pero sobre todo prevención de pérdidas de presupuesto: reaccionar en 24h sobre un QS que cae evita 2 semanas pagando CPC inflado.

¿Cómo monitorizar el budget pacing todo el año?

El script que compara el gasto acumulado del mes con el presupuesto teórico prorrateado (día actual ÷ días del mes × presupuesto mensual) y dispara una alerta si el delta supera ±15%. Infragasto = campañas estranguladas por pujas demasiado bajas o presupuesto diario mal dimensionado; sobregasto = pacing agresivo que quemará el presupuesto a mitad de mes. Ambos escenarios salen caros. Consulta también nuestra guía específica sobre budget pacing de Google Ads.

Caso de uso: todas las cuentas con presupuesto mensual fijo (agencias con clientes en retainer mensual, departamentos de marketing internos con sobre tope).

function main() {
  var MONTHLY_BUDGET = 10000; // € — a configurar
  var now = new Date();
  var dayOfMonth = now.getDate();
  var daysInMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0).getDate();
  var expected = MONTHLY_BUDGET * (dayOfMonth / daysInMonth);
  var actual = AdsApp.currentAccount().getStatsFor("THIS_MONTH").getCost();
  var delta = (actual - expected) / expected;
  if (Math.abs(delta) > 0.15) {
    MailApp.sendEmail("ops@example.com", "[PACING] Delta " + (delta * 100).toFixed(0) + "%",
      "Spent: " + actual + "€ vs expected: " + expected.toFixed(0) + "€");
  }
}

Planificación: diaria (final del día). Tiempo ahorrado: en torno a 1h30 por semana, más la tranquilidad de evitar un desbordamiento de presupuesto anual embarazoso en el lado de finanzas.

Script 5 · Detector de fatiga de ad copy (CTR a la baja)

El script que detecta los anuncios cuyo CTR en los últimos 7 días cae más de un 25% frente al CTR en los últimos 30 días. Síntoma clásico de fatiga creativa: tu audiencia ha visto el anuncio demasiadas veces, hace scroll sin hacer clic. Reacción: refresca el copy, prueba un nuevo headline, rota los assets RSA.

Caso de uso: cuentas que escalan presupuesto, Display retargeting, campañas always-on sobre la misma audiencia. No es útil en adquisición fría ultradiversificada.

function main() {
  var ads = AdsApp.ads().withCondition("Status = ENABLED").get();
  while (ads.hasNext()) {
    var ad = ads.next();
    var ctr7 = ad.getStatsFor("LAST_7_DAYS").getCtr();
    var ctr30 = ad.getStatsFor("LAST_30_DAYS").getCtr();
    if (ctr30 > 0 && ctr7 < ctr30 * 0.75) {
      Logger.log("FATIGUE: ad " + ad.getId() + " | 7d=" + ctr7 + " | 30d=" + ctr30);
      // Opcional: etiquetar el anuncio "to-refresh"
    }
  }
}

Planificación: semanal. Tiempo ahorrado: en torno a 1 hora por semana en revisión manual de stats de anuncios, y sobre todo detección más temprana que evita 2-3 semanas de CTR bajo.

Script 6 · Anomalía de puja competidora (top IS caído)

El script que monitoriza tu Impression Share (top y absolute top) en tus campañas core y alerta si pierdes más de 10 puntos en 24h. Señal típica: un competidor acaba de subir las pujas, o un nuevo entrante se ha posicionado. Reacción rápida posible: ajusta tu Target CPA, empuja un asset diferenciador, activa un sitelink competitivo.

Caso de uso: verticales competitivos (seguros, mutuas, B2B SaaS, moda e-commerce). Menos crítico en nichos de baja competencia.

function main() {
  var campaigns = AdsApp.campaigns().withCondition("Status = ENABLED").get();
  while (campaigns.hasNext()) {
    var c = campaigns.next();
    var statsYd = c.getStatsFor("YESTERDAY");
    var stats7d = c.getStatsFor("LAST_7_DAYS");
    var isYd = statsYd.getSearchImpressionShare();
    var is7d = stats7d.getSearchImpressionShare();
    if (is7d > 0 && (is7d - isYd) > 0.10) {
      MailApp.sendEmail("ops@example.com", "[IS DROP] " + c.getName(),
        "IS dropped from " + (is7d * 100).toFixed(0) + "% to " + (isYd * 100).toFixed(0) + "%");
    }
  }
}

Planificación: diaria. Tiempo ahorrado: en torno a 1 hora por semana de vigilancia competitiva activa, sustituida por una alerta pasiva.

¿Cómo detectar landing pages en 404 en tus anuncios?

El script que hace HTTP GET sobre cada URL final de los anuncios activos, comprueba el status code y alerta de inmediato si una URL devuelve 404, 500 o un redirect roto. Pagar por enviar tráfico a una página rota es el error más humillante de una campaña. En la práctica, el 3% de las cuentas auditadas tienen al menos una URL 404 activa de forma permanente, a menudo tras un rediseño o un cambio de CMS.

Caso de uso: e-commerce con rotación de productos (roturas de stock, fin de colección), sitios recién migrados, multi-sitios con URLs dinámicas.

function main() {
  var ads = AdsApp.ads().withCondition("Status = ENABLED").get();
  var broken = [];
  while (ads.hasNext()) {
    var ad = ads.next();
    var url = ad.urls().getFinalUrl();
    if (!url) continue;
    try {
      var resp = UrlFetchApp.fetch(url, { muteHttpExceptions: true, followRedirects: false });
      if (resp.getResponseCode() >= 400) broken.push(url + " → " + resp.getResponseCode());
    } catch (e) { broken.push(url + " → FETCH ERROR"); }
  }
  if (broken.length) MailApp.sendEmail("ops@example.com", "[404] Broken landing pages", broken.join("\n"));
}

Planificación: horaria si es e-commerce, diaria en los demás casos. Tiempo ahorrado: en torno a 2 horas por semana, más el ahorro directo del presupuesto gastado en una página rota (que puede llegar a cientos de euros en un día).

Script 8 · Deriva del conversion tracking (caída de tasa)

El script que calcula la tasa de conversión de las últimas 24 horas frente a la media de 14 días, y alerta si la tasa cae más de un 40% sin explicación de volumen. Síntoma principal: tracking roto — tag de GTM que ya no se dispara, consent mode mal configurado, GA4 desconectado. La pesadilla absoluta cuando Smart Bidding pierde su señal de conversión. Para la reauditoría de tracking completa, consulta nuestra guía de conversion tracking.

Caso de uso: todas las cuentas con Smart Bidding activo. Crítico siempre que se planee un rediseño técnico del sitio.

function main() {
  var acct = AdsApp.currentAccount();
  var clicks1 = acct.getStatsFor("YESTERDAY").getClicks();
  var conv1 = acct.getStatsFor("YESTERDAY").getConversions();
  var clicks14 = acct.getStatsFor("LAST_14_DAYS").getClicks();
  var conv14 = acct.getStatsFor("LAST_14_DAYS").getConversions();
  if (clicks1 === 0 || clicks14 === 0) return;
  var rate1 = conv1 / clicks1;
  var rate14 = conv14 / clicks14;
  if (rate14 > 0 && rate1 < rate14 * 0.6) {
    MailApp.sendEmail("ops@example.com", "[TRACKING] Conversion drift",
      "CVR 24h=" + (rate1 * 100).toFixed(2) + "% vs 14d=" + (rate14 * 100).toFixed(2) + "%");
  }
}

Planificación: diaria. Tiempo ahorrado: en torno a 1 hora por semana, pero sobre todo el enorme ahorro de un Smart Bidding descarrilado durante 7 días antes de la detección manual.

Script 9 · Auditoría de extensions (sitelinks faltantes)

El script que lista todas las campañas Search activas y verifica la presencia de las extensions clave: sitelinks (mínimo 4), callouts (mínimo 4), structured snippets, business info. Alerta si una campaña no tiene extensions o menos del mínimo. Las extensions incrementan el CTR entre un 10 y un 15% de media — olvidarlas es puro derroche. Documentación en el soporte de Google Ads sobre extensions.

Caso de uso: MCCs de agencias con 20+ cuentas que supervisar, o equipos de marketing que lanzan nuevas campañas con regularidad sin proceso estricto.

function main() {
  var missing = [];
  var campaigns = AdsApp.campaigns().withCondition("Status = ENABLED").get();
  while (campaigns.hasNext()) {
    var c = campaigns.next();
    var sitelinks = c.extensions().sitelinks().get().totalNumEntities();
    var callouts = c.extensions().callouts().get().totalNumEntities();
    if (sitelinks < 4 || callouts < 4) {
      missing.push(c.getName() + " → sitelinks=" + sitelinks + ", callouts=" + callouts);
    }
  }
  if (missing.length) MailApp.sendEmail("ops@example.com", "[EXT] Missing extensions", missing.join("\n"));
}

Planificación: semanal. Tiempo ahorrado: en torno a 30 minutos por semana de auditoría manual sustituida, pero sobre todo cobertura sistemática que asegura que ninguna nueva campaña se queda sin extensions.

Script 10 · Email digest semanal de rendimiento

El script que agrega cada lunes por la mañana las métricas clave de la semana pasada (gasto, clics, conversiones, CTR, CPA, ROAS) y envía un email HTML resumen a los stakeholders. Fin de los 45 minutos cada lunes construyendo el PowerPoint semanal. Bonus: añade la variación semana sobre semana, destaca las top/flop campañas, top 3 search terms convertidores.

Caso de uso: todas las estructuras con un reporting semanal recurrente (agencia, in-house, freelance). Sustituye un entregable manual de 30 a 60 minutos.

function main() {
  var s = AdsApp.currentAccount().getStatsFor("LAST_7_DAYS");
  var prev = AdsApp.currentAccount().getStatsFor("LAST_14_DAYS");
  var html = "<h2 data-speakable>Weekly digest</h2>" +
    "<p>Spend: " + s.getCost().toFixed(0) + "€</p>" +
    "<p>Conv: " + s.getConversions() + "</p>" +
    "<p>CPA: " + (s.getCost() / Math.max(s.getConversions(), 1)).toFixed(2) + "€</p>" +
    "<p>CTR: " + (s.getCtr() * 100).toFixed(2) + "%</p>";
  MailApp.sendEmail({
    to: "team@example.com",
    subject: "[Weekly digest] Google Ads — week " + new Date().toLocaleDateString(),
    htmlBody: html
  });
}

Planificación: semanal, lunes a las 8. Tiempo ahorrado: en torno a 1h30 por semana, y regularidad garantizada (se acabaron los digests olvidados en semanas ajetreadas).

Error fatal a evitar :

un Google Ads Script sin manejo de errores puede disparar una acción masiva en caso de bug de API — imagina 500 negativas broad añadidas en toda tu estructura porque la línea 12 devolvió undefined. Regla absoluta: cualquier mutación de entidad (add, set, pause, remove) debe envolverse en un try/catch con notificación de error y un tope de entidades modificadas por ejecución (p. ej. máximo 50 negativas añadidas/ejecución).

Estos 10 scripts cubren el 90% de las necesidades clásicas de automatización. Si quieres una capa de monitorización más rica (detección estadística de anomalías multicriterio, alertas Slack/webhook, historización profunda, dashboards multicuenta), la mayoría de estos scripts ya están integrados en SteerAds — nuestro módulo Monitoring funciona 24/7 sin que tengas que mantener código, Auto-optimization añade las acciones automáticas (negativas, pacing, redistribución de presupuesto), y nuestra auditoría gratuita señala en 72h los scripts a instalar con prioridad en tu cuenta. Para un escalado más estructural, continúa con nuestra guía completa de Performance Max.

Fuentes

Fuentes oficiales consultadas para esta guía:

FAQ

¿Hay que saber programar para usar Google Ads Scripts?

Con JavaScript básico basta para instalar y adaptar los scripts que ofrecemos. Los objetos AdsApp.* están bien documentados, el compilador integrado en la interfaz de Google Ads muestra los errores antes de la ejecución, y la mayoría de los scripts útiles caben en 40 a 120 líneas. Debes poder leer una función, entender un bucle for y manipular objetos JSON — nada más. Para equipos no técnicos, un copia-pega prudente desde nuestro repo y 2-3 pruebas en preview (sin ejecución real) permiten instalar un script de monitorización en menos de 15 minutos. Para desarrollar un script a medida con lógica de negocio compleja, sigue siendo preferible un desarrollador junior.

¿Son seguros los Google Ads Scripts?

Sí, en el lado de la ejecución — Google los ejecuta en su propia infraestructura en sandbox, no tienes servidor que mantener ni credenciales que alojar. Principal riesgo en el lado del código: un script con bugs que altere masivamente la cuenta (p. ej. pause todas las campañas, cambie todas las pujas) sin manejo de errores. Prueba siempre en modo preview antes de programar, envuelve las operaciones de escritura en try/catch con notificación de error, y añade guardrails (p. ej. limitar el número de entidades modificadas por ejecución). En nuestro benchmark interno SteerAds, el 14% de los incidentes Google Ads mayores encontrados por clientes en auditoría están ligados a un script sin guardrails.

¿Cuántos scripts puedes ejecutar en una cuenta Google Ads?

A nivel de cuenta individual, Google permite hasta 250 scripts activos, pero chocarás con el techo de utilidad mucho antes — una decena de scripts bien diseñados cubren el 90% de las necesidades de automatización. Las cuotas reales que te bloquearán primero son: máximo 30 minutos de ejecución por script, límite diario de operaciones API (bulk mutations) y frecuencia máxima de 1 ejecución por hora para los scripts horarios. Una MCC (manager account) puede ejecutar un script que itere sobre decenas de cuentas hijas en una sola ejecución, lo que cambia las reglas para las agencias. Empieza pequeño, mide el impacto, luego escala.

Scripts vs herramienta SaaS (como SteerAds): ¿cuál elegir?

Ambos son complementarios. Los scripts brillan en acciones puntuales e hiperpersonalizadas donde ya tienes una lógica de negocio precisa que codificar — un SaaS jamás reproducirá tu regla de exclusión interna. Un SaaS como SteerAds cubre la infraestructura genérica (monitorización 24/7, alertas multicanal, detección estadística de anomalías, auditorías automáticas, dashboards multicuenta, historización profunda) sin obligarte a mantener código. En nuestro benchmark interno SteerAds, las cuentas que combinan 2-3 scripts business a medida + un SaaS de pilotaje ahorran de 10 a 15h/semana, frente a 4-5h para quienes solo tienen scripts. La pregunta no es 'cuál', sino 'dónde poner el cursor'.

Ready to optimize your campaigns?

Start a free audit in 2 minutes and discover the ROI potential of your accounts.

Start my free audit

Free audit — no credit card required

Keep reading