1,000 Valid RSA Combinations from 20 Assets (Gemini + CSV Export)
Contents
A skincare brand's Google Ads account had 1,200 SKUs (Stock Keeping Units, 库存单品) split across 12 categories. The previous agency was running 3 RSAs (Responsive Search Ads, 响应式搜索广告) per ad group, hand-picked headlines, copy-pasted descriptions between campaigns, and averaged 3.8% CTR (Click-Through Rate, 点击率). I rebuilt the ad groups with 8,400 pre-validated RSA combinations generated from a 20-asset pool per ad group, expanded via a theme-substitution matrix and validated by Gemini. CTR after six weeks: 4.83%. +27%.
The math isn't the clever part. RSA already lets Google mix 15 headlines and 4 descriptions into 32,400+ possible combinations per ad — the algorithm is happy. The clever part is that Google's algorithm shouldn't be trusted to discover the best ones on its own when you have a category structure that already tells you the answer. You pre-curate, the algorithm executes.
Here's the workflow that produced those 8,400 combinations.
The 20-asset starter pool
Most PPC (Pay-Per-Click, 按点击付费) managers start RSA with whatever they wrote last week and pad until they hit 15. The combinatorial math doesn't care about the inputs — it still generates thousands of combinations. The problem is that most of those combinations are bad. A headline that says "Free Shipping" never makes sense next to a description that says "Premium Pricing." Google will test those combinations, learn they underperform, and burn your learning budget.
The fix: build a structured starter pool where every headline and every description is known to be combinable.
The structure that has worked for every ecom client I've run this on:
5 headline themes × 3 variants each = 15 headlines
| Theme | Example variants |
|---|---|
| Offer (price, deal, discount) | "30% Off Today", "Free Shipping $50+", "Sale Ends Sunday" |
| Product (feature, ingredient, spec) | "Vitamin C Serum", "For Oily Skin", "30ml Bottle" |
| Trust (rating, cert, guarantee) | "Rated 4.8/5", "Dermatologist Tested", "30-Day Returns" |
| Urgency (scarcity, time, stock) | "Limited Stock", "Order by 5pm", "Almost Sold Out" |
| Brand (name, story, positioning) | "Acme Skincare", "Since 2014", "Made in California" |
4 description angles = 4 descriptions
- Benefit-led — "Reduce dark spots in 14 days with our Vitamin C formula."
- Proof-led — "Join 50,000+ customers. Rated 4.8 stars across 12,000 reviews."
- Offer-led — "Get 30% off your first order. Free shipping on orders over $50."
- CTA-led (Call-To-Action, 行动号召) — "Shop the full collection. Subscribe and save 15%."
Each description must make sense next to any of the 15 headlines. That's the only editorial rule. If a description has the word "discount" in it, it can't appear next to a "Sale Ends Sunday" headline cleanly — adjust one or both until they read naturally in any pairing.
This 20-asset pool produces 15 × 4 = 60 base combinations, but the math gets interesting when you expand.
The expansion matrix (60 → 1,000)
A pure 20-asset pool gives you 60 base combinations. To hit 1,000+, you add theme-substitution variants. For each headline in the pool, generate 4–6 thematic rewrites that match the same intent but differ in phrasing:
- Original: "30% Off Today" → variants: "Save 30% Now", "30% Off Sitewide", "Take 30% Off", "Sale: 30% Off", "30% Off Everything"
- Original: "Free Shipping $50+" → variants: "Free Shipping Over $50", "Free Delivery $50+", "Ships Free $50+"
Doing this across all 15 headlines gives you ~80 headline variants. Paired with 4 descriptions, that's 80 × 4 = 320. To hit 1,000, add per-category angle swaps — for the skincare client, I had 12 categories (Serum, Cleanser, Moisturizer, etc.), and each description got a category-injection version: "Reduce dark spots in 14 days" → "Reduce dark spots with our Serum" → "Reduce dark spots with our Cleanser" → ...
You can do this expansion manually in a spreadsheet, but the validation step is where Gemini earns its place.
The 4 validation rules (and the Gemini prompt)
The four failure modes that tank RSA performance, in order of how often they appear:
- Duplicate detection — two headlines that say the same thing in different words ("30% Off Today" + "Save 30% Now" after Google's algorithm normalizes them). Google flags these as "low ad strength" and throttles impression share.
- Pinned-position conflicts — if you pin headline 1 to your brand, the other 14 headlines must not also be brand-style. Google's position-pinning logic is brittle.
- Character limit violations — 30 chars for headlines, 90 for descriptions. A single character over triggers a hard reject in the Google Ads Editor CSV import.
- Brand-safety / policy — superlatives ("best", "#1") and certain claims ("guaranteed results") trigger Google ad policy review and add 24–48 hours to approval.
The Gemini prompt that catches all four at once:
For each headline/description combination in the table below, validate against these 4 rules:
1. DUPLICATE: Flag any headline pair where the core message is the same (e.g. "30% Off Today" and "Save 30% Now" both communicate "30% off"). Use semantic equivalence, not just string match.
2. PIN COMPATIBILITY: Headlines marked "PIN=H1" must contain brand name or legal disclaimer. Other headlines must NOT contain brand name.
3. CHARS: Each headline must be ≤30 characters. Each description ≤90 characters. Count spaces.
4. POLICY: Flag any use of "best", "#1", "guaranteed", "lowest price", or absolute claims.
Output: CSV with columns: combination_id, headline, description, duplicate_flag, pin_ok, char_count, policy_flag, action (keep/fix/reject). Be strict.
INPUT:
[paste your 1,000-row table here]The "Be strict" line matters. Without it, Gemini defaults to a polite 80% threshold and lets borderline duplicates through. With it, you get a hard 95%+ pass rate after you re-run the "fix" rows once.
The Google Ads Editor CSV schema
Once Gemini gives you the validated combinations, the upload is mechanical. Google Ads Editor (free desktop app, runs offline) imports CSV with this minimum schema per ad group:
Campaign,Ad group,Ad type,Headline 1,Headline 2,Headline 3,
Headline 4,Headline 5,Headline 6,Headline 7,Headline 8,
Headline 9,Headline 10,Headline 11,Headline 12,Headline 13,
Headline 14,Headline 15,Description 1,Description 2,
Description 3,Description 4,Final URL,Path 1,Path 2Three things trip people up:
- 15 headlines per row, not 15 per ad. Each CSV row is one RSA. Your 1,000 combinations become 1,000 rows. Or 700 if you pack three combinations into one RSA via Google Ads Editor's "Multiple combinations per ad" feature (added in 2023) — though I'd avoid that for the first run, it makes the validation math harder to follow.
- Final URL must be live. A 404 final URL passes the CSV import but kills Quality Score (Google's 1-10 rating of ad relevance, 质量得分) within 48 hours. Always pre-flight check.
- The header row must be exact. Google's CSV importer is case-sensitive on column names. "Headline 1" works, "headline1" does not.
After import, hit "Make Multiple Changes" → "Validate and post". Errors show as red icons. The 4 validation rules above will catch 90% of what those red icons would have flagged.
The strategic logic: which 1,000 to serve
The hard part isn't the math or the validation. It's the editorial decision of which 1,000 of the trillions of theoretically-possible combinations to actually serve.
The rule I follow: every combination must answer a different search intent, not just use different words. A skincare searcher typing "best vitamin c serum for oily skin" wants different copy than someone typing "cheap vitamin c serum." If your combination matrix doesn't segment by intent, you're just rearranging furniture.
For the 12-category ecom client, I built 12 ad groups (one per category) × ~700 combinations per ad group = 8,400 total. Each ad group's pool was tailored to that category's search intent. The "Serum" ad group's headline pool mentioned serums explicitly; the "Cleanser" ad group's pool mentioned cleansers. Google learned the category-level CTR signals faster, and Ad Strength ("Ad Strength" is Google's 1-5 rating of RSA asset diversity, 广告强度评分) went from "Average" to "Excellent" across all 12 ad groups within the first week.
This is where human judgment beats pure algorithmic optimization. The Gemini prompt gets you a clean CSV. The strategic pool design is what makes those combinations perform.
What I'd do differently next time
I'd skip the 1,000-combo target and aim for 300–500 per ad group. We hit +27% CTR, but when I dug into the search-term reports at the end, the long tail of low-impression combinations (positions 700–1,000) had contributed under 3% of total clicks. The top 300 combinations per ad group did almost all the work. A 1,000-combo build costs roughly the same in Gemini tokens as a 500-combo build, but the marginal value decays fast.
Save the spreadsheet, save the Gemini prompt, save the 4 validation rules. Re-run this quarterly per category. The combinatorial work pays off more from iteration than from scale.