Skip to content
Back to skills

Routine

ASecurity

The daily/weekly/monthly/quarterly operating rhythm for a Google Ads account. Orchestrates tracker (observe) and optimizer (act) at the right cadence, remembers when each was last run, auto-surfaces overdue checks, and gates every action behind explicit preconditions (only act when ALL are met, else wait). Use when the user says "daily routine", "weekly review", "what should I check today", "routine", "what's due", "ongoing management", "what can I change now".

  • 11 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 6, 2026
ai-agentspythongorailsperformance

Works with

  • cli

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned September 6, 2026

npx -y skills add chanktb/claude-google-ads --skill routine --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Routine?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Routine
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/chanktb-routine/badge)](https://www.skillsdirectory.com/skills/chanktb-routine)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: google-ads-routine
description: >
  The daily/weekly/monthly/quarterly operating rhythm for a Google Ads account. Orchestrates tracker
  (observe) and optimizer (act) at the right cadence, remembers when each was last run, auto-surfaces
  overdue checks, and gates every action behind explicit preconditions (only act when ALL are met, else
  wait). Use when the user says "daily routine", "weekly review", "what should I check today", "routine",
  "what's due", "ongoing management", "what can I change now".
---

# Google Ads — Routine (cadence + decision gates)

This is the operating rhythm, not a new analysis engine: it **calls `tracker` and `optimizer`** at the
right cadence, **remembers history**, and **gates actions** so nothing changes unless its preconditions
are met. It answers: "what do I check today, what am I allowed to change, and under what conditions."

## STEP 0 — Read state + build today's agenda
1. Load `account-context.yaml` (esp. `guardrails`, `margin_tiers`, `campaign_defaults`).
2. Run the history engine:
   `python "${CLAUDE_PLUGIN_ROOT}/skills/routine/scripts/routine_state.py" [--today YYYY-MM-DD]`
   It reads `routine-state.json` in the working dir and prints what's **DUE / OVERDUE** per cadence.
3. **Run everything that's due or overdue — not just what the user asked.** If the user says "daily" but
   the weekly/monthly is overdue (they haven't checked in a while), run those too and say so. This is the
   "it remembers and nags" behavior: long gap → the overdue cadence surfaces automatically.

## Model dispatch (run cheap, decide expensive) — see `${CLAUDE_PLUGIN_ROOT}/references/model-tier-dispatch.md`
- **Scout (`haiku`)** — STEP 0 `routine_state.py` run (agenda) and the `--mark` stamp after acting.
- **Routine / Judge** — inherited from the skills this orchestrates: `tracker` and `optimizer` carry their own per-STEP tiers (collection is Routine, verdicts are Judge).
- **Judge (main session)** — the **decision gates** (every precondition check, +10% vs WAIT), reading the cooldown from guardrails, and deciding what overdue work to run. The agenda is cheap; the gate is judgment — **never delegate a gate**.

## Cadence checklists (each calls existing skills — don't re-implement)
- **Daily (~15 min) — health check, NOT optimization.** Via `tracker`: spend/CPC/clicks vs yesterday,
  budget pacing, disapprovals/policy, paused-by-error, sudden anomalies. Goal = spot what's BROKEN. No
  performance changes off one day of data.
- **Weekly (1-2h) — via `optimizer`:** **search-term review (mandatory, both sources)** — pull
  `search_term_view` (covers Search/Branded campaigns) AND PMax/Demand-Gen **search category insights**
  (`campaign_search_term_insight`; search_term_view does NOT contain PMax terms). Feed both to
  `search_term_miner.py`. **Never propose blocking brand terms** (brand intent = your own traffic, even at
  0 conv). Then: budget pacing + reallocate to top performers, campaign tiering, automated-rules check.
  Apply the decision gates below.
- **Monthly (2-4h):** the full **money-leak sweep** — run D1-D14 in
  `${CLAUDE_PLUGIN_ROOT}/references/diagnostic-playbook.md`: bid/target health (decode
  `bidding_strategy_system_status`; lower tROAS if `LIMITED_BY_INVENTORY`, scale if `LIMITED_BY_BUDGET` on-target),
  budget allocation (shift low-ROAS→high-ROAS), geo waste, dayparting, structure, Quality Score, PMax channel
  distribution (D8), ad copy/assets/extensions (D9). Any tROAS/budget move follows the **Scaling Ladder**
  (one variable, cooldowns). Plus conversion-tracking audit (`measurement`), attribution review. Pull a fresh
  `audit` if drift is suspected.
- **Quarterly:** strategic `audit` + `plan` alignment to business goals.

## Decision gates — only act when ALL preconditions hold (else WAIT and say which failed)
Read the spacing/cooldown from the context `guardrails` (the `change-event-cooldown` rule), don't hardcode it.

| Action | Preconditions (ALL must hold) | Step |
|--------|-------------------------------|------|
| **Scale budget UP** | ROAS ≥ margin-tier target · campaign is budget-limited (lost IS to budget / capping) · **no budget change within the context cooldown** · not reversing a recent decrease · not in Learning · ≥~15 conv/week | **+10% (gentle), never bigger** |
| **Raise target ROAS** | ≥15 conv/week · ≥2 weeks since last target change · ROAS stable above current target · no recent `change_event` | **+0.1x per step** |
| **Add negative keyword** | term >$10 spend AND 0 conv (or clearly irrelevant) · NOT in the protected set (store/coupon/cheap-brand) | exact/phrase, ready-to-copy |
| **Scale budget DOWN** | ROAS < target sustained (not one bad day) · not in Learning · not reversing a recent increase within cooldown | **PMax: pause low-ROAS asset groups, do NOT cut budget** |
| **Pause campaign / asset group** | Dead tier (ROAS < ~0.5× target) sustained · checked non-paid (organic/email) revenue contribution first | PMax → pause the asset group, not the campaign budget |

Rules of the road (see `${CLAUDE_PLUGIN_ROOT}/references/optimization-playbook.md`): **never reverse budget
direction within the cooldown window** (went up → stay up or hold); **hold the cooldown between changes** so
Smart Bidding stabilizes; **prefer Mondays** for budget changes (cleaner weekday pacing). If a precondition
fails, do NOT act — report the action as "WAIT — needs: <the failing condition>".

## After acting — record it
Stamp the cadence so history stays accurate:
`python "${CLAUDE_PLUGIN_ROOT}/skills/routine/scripts/routine_state.py" --mark weekly --actions "raised <campaign> budget +10%; added 4 negatives"`
Account mutations still go through `pusher` (approval gate): the optimizer serializes the gated actions into a
`change-set.json`, and `pusher` validates (`validate_changeset.py` — the cooldown gate re-checks the spacing
this routine just decided) + renders `CHANGE-PLAN.md`. The routine proposes + gates; it doesn't push silently.

## Scheduling (optional)
Pairs with cron/scheduled agents: a daily cron runs the daily health check; a Monday cron runs the weekly
routine. The history engine means even ad-hoc runs catch up anything overdue.

## To build / refine later
- [ ] A one-line "what changed since last run" diff from the log.

Files in this skill

  • SKILL.md6.2 KB
  • scripts/routine_state.py3.3 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.