ad-copy-google-ads
npx machina-cli add skill edholofy/dojo.md/z-ai--glm-5 --openclawDomain Knowledge
Character Limits — The Hard Constraints
- Headlines: 30 characters (including spaces, punctuation, em dashes, pipes — every character counts)
- Descriptions: 90 characters
- Sitelink text: 25 characters
- Sitelink descriptions: 35 characters
- Callout extensions: 25 characters
- Structured snippet values: 25 characters
- DKI default text +
{KeyWord:}wrapper must fit within the headline's 30-char limit. The longest keyword in the ad group determines whether DKI is safe.
Critical: LLMs consistently miscount characters by 1-3. Never estimate. Count every character deterministically using a reliable method. "Expert cosmetic dentistry" = 25 chars, not 28. Recount before finalizing.
Google-Approved Structured Snippet Headers (Exhaustive List)
Only these are valid: Amenities, Brands, Courses, Degree programs, Destinations, Featured hotels, Insurance coverage, Models, Neighborhoods, Service catalog, Shows, Styles, Types. Anything else (e.g., "Features," "Integrations," "Coverage Options") will be rejected by Google.
Quality Score — The Three Levers
- Expected CTR: Driven by headline relevance to query + compelling language. Specific numbers and benefits > generic claims.
- Ad Relevance: Keyword must appear naturally in headlines/descriptions. Not keyword stuffing — semantic alignment.
- Landing Page Experience: Ad promise must match landing page content. If the ad says "Free Trial," the landing page must show a free trial above the fold.
DKI Syntax and Capitalization
{KeyWord:Default Text}— Title Case each word{Keyword:Default Text}— Sentence case{keyword:default text}— lowercase{KEYWORD:DEFAULT TEXT}— ALL CAPS- Default text appears when the keyword is too long or would create policy violations.
Search Intent → Copy Strategy Mapping
| Intent | User Mindset | Headline Approach | CTA Style |
|---|---|---|---|
| Informational | Learning | Educate, guide | "Learn More," "Read the Guide" |
| Commercial | Comparing | Differentiate, prove | "Compare Plans," "See Why We're #1" |
| Transactional | Buying | Sell, convert | "Buy Now," "Start Free Trial" |
| Navigational | Finding specific brand | Confirm identity, redirect | "Official Site," "Log In Here" |
Non-Obvious Insights
- Pinning headlines reduces Google's optimization ability. Only pin when brand compliance or messaging control outweighs performance. Pin position 1 for brand terms, position 2 for CTAs if required.
- Callouts should never repeat what's already in a typical headline. "Free Shipping" as a callout is wasted if it also appears in headline rotation.
- Each RSA description must work independently with ANY headline combination. Descriptions that depend on a specific headline for context will produce incoherent ads 70%+ of the time.
- Feature dumping kills CTR. One specific benefit with a number ("Save 3 Hours/Week") beats listing five features.
- Legitimate urgency converts; fake urgency violates policy. "Offer Ends March 15" is valid. "Last Chance!" running perpetually is a policy violation.
- CTR predictions should be grounded: authority-based headlines (awards, stats) typically outperform emotional appeals for B2B; emotional and specificity approaches outperform for B2C impulse purchases.
Quick Start
Task: Write a complete RSA for a SaaS project management tool targeting "project management software"
Step 1 — Count characters BEFORE writing: Plan each headline to land at 25-29 chars. Never rely on estimation.
Step 2 — Write 15 headlines with variety:
Pin 1: "Project Management Software" (28 chars) — keyword match
Pin 2: "Start Your Free Trial Today" (27 chars) — CTA
: "Trusted by 10,000+ Teams" (24 chars) — social proof
: "Cut Project Time by 40%" (23 chars) — specific benefit
: "All Tasks in One Dashboard" (26 chars) — feature/benefit
: "No Credit Card Required" (23 chars) — objection handler
: "Award-Winning PM Platform" (25 chars) — authority
: "Plans Starting at $9/Mo" (22 chars) — price anchor
: "See Results in Week One" (23 chars) — speed
: "Built for Remote Teams" (22 chars) — audience
: "Gantt Charts & Kanban" (21 chars) — feature specific
: "Replace Spreadsheet Chaos" (25 chars) — pain point
: "Enterprise-Grade Security" (25 chars) — trust
: "Integrate With 200+ Apps" (24 chars) — ecosystem
: "5-Star Rated on G2 & Capterra" (29 chars) — social proof
Step 3 — Write 4 descriptions (each independent, each under 90 chars):
"Manage tasks, timelines & teams in one intuitive platform. Start free — no card needed." (88 chars)
"Join 10,000+ teams who cut project delivery time by 40%. See the difference in one week." (89 chars)
"Drag-and-drop Gantt charts, Kanban boards & real-time reporting. Plans from $9/month." (86 chars)
"Rated 4.8/5 on G2. Integrates with Slack, Jira & 200+ tools. Try it free for 14 days." (87 chars)
Step 4 — Verify every character count. Recount each headline and description character by character.
Core Rules
-
ALWAYS count characters deterministically for every headline, description, and extension before including it in output. LLM estimation fails consistently by 1-3 characters. Count spaces, punctuation, and special characters. Report the count alongside each line.
-
ALWAYS produce a complete response for every task, even under uncertainty. If the prompt is ambiguous, state assumptions and deliver full output. Zero output is the worst possible outcome. If a subtask is unclear, produce a best-effort version with a caveat rather than skipping it.
-
ALWAYS validate structured snippet headers against the approved list before including them:
IF header NOT IN [Amenities, Brands, Courses, Degree programs, Destinations, Featured hotels, Insurance coverage, Models, Neighborhoods, Service catalog, Shows, Styles, Types]: REJECT header SELECT closest valid alternative from approved list NOTE the substitution -
ALWAYS validate DKI safety with this process:
FOR each keyword in ad group: insertion = apply_capitalization(keyword, dki_format) full_headline = template.replace(dki_placeholder, insertion) char_count = count_characters(full_headline) IF char_count > 30: FLAG as overflow, default text will show IF insertion creates grammatical/semantic issues: FLAG PROVIDE at least 2 static non-DKI headline alternatives -
Prefer specific, quantified claims over generic value propositions when the advertiser has real data. "Save 3 Hours/Week" beats "Save Time." "Trusted by 10,000+ Teams" beats "Trusted by Many." If no data exists, use specificity of mechanism ("Drag-and-Drop Gantt Charts") rather than vague benefits ("Easy to Use").
-
ALWAYS differentiate ad groups by search intent, not just keywords. Each ad group must target a distinct user need with messaging tailored to that need. If two ad groups could share the same ad copy, they should be merged.
-
ALWAYS separate CTAs from urgency triggers. CTA = action verb + specific outcome ("Start Free Trial," "Book a Demo"). Urgency = time/scarcity context ("Offer Ends March 15," "Only 3 Spots Left"). Combine them, but never confuse one for the other.
Decision Tree
If writing headlines:
- If brand campaign → Pin brand name to position 1, use official brand terms
- If non-brand campaign → Pin highest-intent keyword headline to position 1
- If CTA is required → Pin CTA headline to position 2
- If unsure about pinning → Don't pin; let Google optimize
If choosing DKI vs. static headlines:
- If all keywords in ad group are ≤20 chars → DKI is safe (leaves room for template text)
- If any keyword > 22 chars → Test carefully; likely need static fallback
- If keywords include competitor names, misspellings, or sensitive terms → Use static only
- If ad group has >15 keywords with varied phrasing → DKI adds more risk than value; use static
If diagnosing Quality Score issues:
- If CTR is low but relevance is high → Headlines lack compelling hooks; add numbers, urgency, or social proof
- If relevance is low → Keyword doesn't appear in headlines/descriptions; restructure ad groups for tighter theme
- If landing page score is low → Check that ad promises match landing page H1, CTA, and above-fold content
If classifying search intent:
- If query contains "how to," "what is," "guide" → Informational
- If query contains "best," "vs," "review," "top" → Commercial investigation
- If query contains "buy," "price," "discount," "near me," "free trial" → Transactional
- If query contains a brand name + generic term → Navigational
- If query is ambiguous → Write copy that serves the most commercially valuable intent, with a secondary description covering the alternative intent
If writing extensions:
- If sitelinks → Each must link to a genuinely different page (not /features and /all-features)
- If callouts → Each must add a benefit NOT already in typical headlines
- If structured snippets → Select header from approved list first, then write values
If writing urgency/CTAs:
- If there's a real deadline → Use it explicitly: "Ends Dec 31"
- If there's genuine scarcity → State it: "Only 50 Seats Available"
- If no real urgency exists → Use value-based urgency: "Start Saving Today" (not fake countdowns)
- If the CTA is "Click Here," "Submit," or "Learn More" for a transactional query → Replace with specific action: "Get Your Free Quote," "Start Building Now"
Edge Cases
Character Count Miscounts
Trap: The agent writes "Best Noise Canceling Earbuds" and reports "30 chars." Actual count: 28. Correct handling: Count each character: B-e-s-t-[space]-N-o-i-s-e-[space]-C-a-n-c-e-l-i-n-g-[space]-E-a-r-b-u-d-s = 28. Always recount. Report the count next to each line item.
DKI Overflow
Trap: Template is {KeyWord:Running Shoes} (total 30 chars with longest keyword "lightweight waterproof running shoes"). DKI will overflow, but the agent doesn't flag it.
Correct handling: Calculate: "Lightweight Waterproof Running Shoes" = 36 chars. This exceeds 30. Flag it. Note the default "Running Shoes" will display instead (which works at 13 chars in the template context). Provide 2 static alternatives.
Non-Approved Structured Snippet Headers
Trap: Agent uses "Features" or "Integrations" as a snippet header. Correct handling: Neither exists in Google's approved list. Map "Features" → "Types" or "Service catalog." Map "Integrations" → "Brands" (if listing integration partner brands). Always state the mapping rationale.
Descriptions That Depend on Specific Headlines
Trap: Headline: "Our Award-Winning Software" / Description: "It also comes with free support." ("It" has no clear referent if paired with a different headline like "Start Your Free Trial.") Correct handling: Each description must be self-contained. Rewrite: "Award-winning software with free 24/7 support. Try it risk-free today."
Mixed-Intent Keywords
Trap: "CRM software" could be informational (what is it?) or transactional (buy it). Agent writes purely transactional copy and alienates researchers. Correct handling: Pin a keyword-rich headline to P1 for relevance. Include one description that educates ("See How CRM Centralizes Your Sales Pipeline") and one that converts ("Start Your 14-Day Free Trial — No Card Needed").
Perpetual Urgency Violations
Trap: Ad copy says "Last Chance — Sale Ends Soon!" but runs indefinitely with no actual deadline. Correct handling: This violates Google's misrepresentation policy. Replace with value-based urgency: "Start Saving on Your Plan Today" or tie to a real event: "Black Friday Pricing — Ends Nov 30."
Ad Group Overlap
Trap: Two ad groups — "project management tool" and "project management software" — with nearly identical copy. Correct handling: These should be one ad group. If kept separate, differentiate messaging: "tool" group emphasizes ease/simplicity, "software" group emphasizes enterprise features/integrations.
Anti-Patterns
DON'T estimate character counts. Instead, count every character deterministically and report the count inline (e.g., "Start Free Trial Today" (22 chars)).
DON'T return empty or partial responses when a task is complex. Instead, state assumptions, break the task into parts, and deliver complete output for each part. Partial output with caveats > no output.
DON'T invent structured snippet headers. Instead, reference the 13 approved headers and select the closest match. If none fit, use "Types" or "Service catalog" as the most flexible defaults.
DON'T write descriptions that only make sense with one specific headline. Instead, read each description in isolation and ask: "Does this make complete sense paired with ANY of my 15 headlines?"
DON'T keyword-stuff headlines. Instead, include the primary keyword naturally in 2-3 headlines maximum. Use the remaining 12-13 headlines for benefits, proof, CTAs, and differentiation.
DON'T use generic CTAs ("Click Here," "Learn More," "Submit") for transactional intent. Instead, match the CTA to the conversion action: "Get Your Free Quote," "Book a Demo," "Start Your Trial."
DON'T list features without connecting them to outcomes. Instead of "Gantt Charts, Kanban Boards, Reports" write "Plan Projects Visually With Drag-and-Drop Gantt Charts."
DON'T create fake urgency. Instead, use legitimate deadlines, real scarcity, or value-based motivation. Fake countdown timers and perpetual "last chance" claims violate Google policy and erode trust.
DON'T provide DKI templates without testing every keyword in the ad group against the character limit. Instead, list each keyword, compute the resulting headline length, and flag any that overflow or produce awkward copy.
Source
git clone https://github.com/edholofy/dojo.md/blob/main/.claude/skills/ad-copy-google-ads/z-ai--glm-5/SKILL.mdView on GitHub Overview
Generates Google Search ad copy including RSA headlines, descriptions, extensions, DKI templates, and CTAs. Use this to create or optimize campaigns, diagnose Quality Score issues, and align ad copy with search intent.
How This Skill Works
The tool outputs RSA-ready headlines (up to 30 characters) and descriptions (up to 90 characters), plus sitelinks, callouts, and structured snippets. It enforces deterministic character counting, applies DKI templates with proper capitalization, and ensures each description can function independently with any headline.
When to Use It
- Creating or optimizing Google Search campaigns using RSA ads
- Diagnosing Quality Score issues related to ad copy
- Aligning headlines with search intent and keyword relevance
- Building DKI-ready templates and DKIs for flexible ads
- Designing extensions and CTAs that match landing pages
Quick Start
- Step 1: Count characters BEFORE writing to respect 30-char headlines and 90-char descriptions
- Step 2: Write 15 RSA headlines with variety; include DKI where appropriate and stay within limits
- Step 3: Validate that each RSA description works with any headline and that extensions stay within their character caps
Best Practices
- Count characters deterministically before finalizing any copy
- Plan headlines to maximize variety within the 30-character limit (aim for 25–29)
- Ensure {KeyWord:} DKI wrappers fit the longest keyword safely within 30 chars
- Avoid over-pinning headlines to preserve CTR and flexibility
- Write descriptions that stand alone and work with any headline; avoid dependencies
Example Use Cases
- Example 1: SaaS project management tool RSA with 15 headlines and 4 descriptions within limits
- Example 2: E-commerce electronics store campaign using 15 headlines and site links under limits
- Example 3: Local service provider using location-based DKIs and extensions
- Example 4: B2B software with authoritative, benefit-focused headlines and DS
- Example 5: Travel booking site employing structured snippet data and clear CTAs