When a mid-size UK retailer came to Meridian Digital with a brief to build out their Google Ads account from scratch, the account manager ran the numbers and quietly winced.
50 ad groups. 300 keyword themes. Each ad group needed at least three responsive search ad variations — meaning 3 headlines and 2 descriptions per variation, per ad group. The brief also asked for seasonal and evergreen variants for each.
Do the maths: roughly 15,000 individual pieces of copy, all needing to be distinct, within Google's character limits, relevant to the keyword theme, and consistent with the client's brand voice.
At a senior copywriter's day rate, that was a five-figure project. At a junior rate, it was still two weeks of focused work. Neither fitted the budget or the timeline.
The structural problem with ad copy at scale
Ad copy has a frustrating characteristic: it's highly structured (character limits, slot constraints, format rules), but it also needs to feel distinct and human for every single ad group. A headline for "women's running shoes" can't sound like a headline for "trail running shoes" — the intent is different, the audience is different, and Google's Quality Score will punish lazy repetition.
Templates help, but only so far. "[Keyword] — Free UK Delivery" works as a formula, but it produces copy that looks mechanical, performs mediocrely, and doesn't differentiate the account.
What was actually needed was the same thinking a good copywriter applies to a single ad group — understanding the keyword intent, matching the offer to the searcher, writing headlines that feel written for that specific search — applied to all 300 themes at once.
Building the CSV
The account manager exported the keyword data and built a structured CSV with one row per ad group:
| ad_group | keyword_theme | product_category | key_usp | intent |
|---|---|---|---|---|
| Womens Running Shoes | women's running shoes | Footwear | Free returns, 500+ styles | purchase |
| Trail Running Shoes | trail running shoes UK | Footwear | Waterproof options, expert advice | purchase + research |
300 rows. About two hours of data prep, mostly pulling from the client's existing product taxonomy and adding the intent column manually.
The batch instructions
Batch instructions used:
You are a Google Ads copywriter. Write responsive search ad copy for this ad group.
Output exactly this format — no extra text:
H1: [headline, max 30 characters]
H2: [headline, max 30 characters]
H3: [headline, max 30 characters]
D1: [description, max 90 characters]
D2: [description, max 90 characters]
Rules:
— Include the keyword_theme naturally in at least one headline
— At least one headline should reference a key_usp
— Match the tone to the intent: purchase intent = direct and benefit-led; research intent = helpful and reassuring
— No exclamation marks. No "Click here". No generic filler.
— Character limits are hard limits — count carefully
They ran a test batch of 20 ad groups on Gemini 2.5 Flash first. The output was strong — headlines that felt genuinely written for each keyword theme, descriptions that matched the intent column, character counts within limits. A few needed minor edits but the majority were import-ready.
They ran the full 300 on the same model. Job completed in under 90 minutes.
From output to import
The output CSV had one row per ad group with the five copy fields populated. Getting it into Google Ads took a bit of formatting work — they used Google Ads Editor's bulk import format, which required a few column remaps. That took about an hour.
Total time from brief to import-ready file: one afternoon, including data prep, testing, the batch run, QA, and formatting for import.
They found around 25 ad groups that needed meaningful edits — mostly where the keyword theme was ambiguous or the USP column was sparse. Everything else was publish-ready.
What made the difference
The intent column was the most important input. Telling the model whether a searcher is in purchase mode or research mode produced noticeably different copy — not just in tone but in which benefits to lead with. It's a small data point that has a big effect on output quality.
Hard character limits need explicit instruction. "Max 30 characters" needs to be in the batch instructions. Left to its own judgement the model will occasionally creep over — not by much, but enough to fail Google Ads validation. Stating it as a hard limit and asking it to count carefully reduced violations to near zero.
Gemini 2.5 Flash is the right model for this. Ad copy is structured and format-constrained — it benefits less from the deeper reasoning of Pro and more from speed and cost efficiency. Flash handled 300 ad groups cleanly and cheaply.
Plan for a formatting step. The output from a batch job is clean CSV data. Getting it into Google Ads Editor or Meta Ads Manager requires matching column names to their import format. Budget 30–60 minutes for this regardless of how good the copy is.