The Problem: Ad Fatigue is Silently Killing Your ROAS
Last quarter, a campaign I run for a small e-commerce client went off a cliff. Click-through rate dropped by half. Cost per acquisition doubled. The search terms were the same, the bids were stable, the landing page hadn’t changed. The problem was ad fatigue. Weβd been running the same three headlines and two descriptions for six months because they worked. Until they didn’t. The fix required a weekend of frantic copywriting and CSV uploads. I decided then I was never going to do it manually again. This article shows you how to build an automated system to generate and refresh your Google AI Ads copy before it goes stale.
You don’t need to be a developer. You just need to connect a few tools and understand the logic. By the end of this, you’ll have a working model for an AI agent that writes, monitors, and suggests new ad copy, keeping your campaigns fresh and your performance consistent.
What Most Guides Get Wrong About AI Ad Copy
Most tutorials on this topic show you a laughably simple prompt. Something like: Write 5 Google Ad headlines for a company that sells blue widgets. You run that, and you get five generic, soulless headlines that could apply to any of your competitors. This is useless. It doesn’t capture your brand’s voice, it doesn’t speak to your customer’s actual pain points, and it will probably get flagged by Google for being low-quality.
AI Side Hustles
Practical setups for building real income streams with AI tools. No coding needed. 12 tested models with real numbers.
Get the Guide β $14
Garbage in, garbage out.
A production-grade system requires a production-grade prompt. It needs to be a detailed specification document that you feed to the AI. It should include sections for:
- Core Product/Service Value Proposition: What do you actually do? Be specific.
- Target Audience Persona: Who are you talking to? What is their job title? What keeps them up at night?
- Brand Voice & Tone: Are you professional? Witty? Direct? Provide examples of copy you like.
- Key Features & Benefits: List them out. A feature is what it *is*, a benefit is what it *does for the customer*.
- Call to Action (CTA): What do you want them to do? ‘Shop Now’, ‘Learn More’, ‘Get a Free Quote’.
- Constraints: Character limits for headlines (30) and descriptions (90). Things you absolutely CANNOT say (e.g., making income claims).
- Negative Keywords: Words or concepts to avoid that might attract the wrong audience.
Building this master prompt is 80% of the work. Once you have it, the AI becomes a reliable copy engine, not a random word generator.
The Automation Stack: My Current Setup
I’ve built this system a few different ways, but the most reliable and cost-effective stack I’ve found uses three core components:
- Google Sheets: The central database. It holds the master prompt, tracks generated copy, logs performance data (pulled from the Ads API), and serves as a dashboard. Simple, free, and everyone knows how to use it.
- Make (formerly Integromat): The orchestrator or ‘brain’ of the operation. It runs the schedule, calls the other APIs, and handles the logic. I prefer it over Zapier automations for this kind of multi-step, conditional workflow. Honestly, trying to build complex loops in Zapier is a nightmare of nested paths and expensive tasks. Make’s visual flow is just better for this. The Make.com Core plan at $29/month is a no-brainer and can run this for several clients.
- OpenAI API (GPT-4): The copywriter. You’ll need an API key and a small budget for credits. For generating a few hundred ad variations a month, you’re looking at less than $10 in usage. It’s absurdly cheap for the value it provides.
This setup is a basic AI agent framework. Google Sheets is the memory, Make.com is the agent’s logic and tool-use capability, and GPT-4 is the reasoning engine.
How Do You Actually Build the Workflow in Make.com?
This is where the rubber meets the road. The workflow is a scenario in Make that runs on a schedule (say, every Monday at 3 AM). Hereβs the high-level flow:
Step 1: Trigger & Read Data. The scenario starts with a scheduler. The first module is a ‘Google Sheets: Get Range’ module that pulls data from your control sheet. This includes your master prompt, the campaign/ad group IDs you’re targeting, and any performance thresholds (e.g., ‘only refresh ads with a CTR below 2%’).
Step 2: Generate New Copy. The data from the sheet is passed to the ‘OpenAI: Create a Completion’ module. You’ll construct the prompt dynamically, inserting the product details and audience persona from the spreadsheet. A crucial detail here is to ask the model to return the output in a structured format, like JSON. For example:
Please generate 3 new headlines and 2 new descriptions based on the provided data. Return the output as a valid JSON object with two keys: "headlines" (an array of strings) and "descriptions" (an array of strings).
This makes the next step way easier.
Step 3: Parse and Validate. The OpenAI module outputs a single block of text. You need a ‘JSON: Parse JSON’ module to turn that text into usable data objects that Make can loop through. After parsing, I add a filter to check if the generated text meets character limits. If a headline is 32 characters, it gets rejected before it ever goes to Google. This simple validation step saves a ton of debugging headaches.
Step 4: Create New Ads. This is the fun part. You’ll use an iterator to loop through your validated headlines and descriptions. Inside the iterator, you use the ‘Google Ads: Create Ad’ module. You map the campaign ID, ad group ID, and the generated text to the right fields. My one concrete gripe with the Google Ads API is its error reporting. It will often return a generic ‘INVALID_ARGUMENT’ error with zero context. 99% of the time, this is either a character limit violation you failed to validate or a policy issue with a word in your copy (like a brand name you don’t have permission to use).
Step 5: Log the Output. After an ad is successfully created, the final step is to log it. Use a ‘Google Sheets: Add a Row’ module to write the new headline/description, the date it was created, and its new Ad ID back to your spreadsheet. This closes the loop and gives you a record of what the automation is doing.
