Od promptu ke kampani: jak AI generuje PMax import do Google Ads Editoru za 15 minut
Problém: Standardní PMax launch pro e-commerce klienta vypadal u mě takhle: dvě hodiny v tabulkách, další hodina v Google Ads Editoru, půl hodiny opravování chyb v importu. Tři hodiny čisté práce na každou novou kampaň, a u klienta s rostoucím katalogem to byly desítky hodin ročně.
Dnes mám PMax Editor import XLSX hotový za 15 minut. Od briefu po soubor připravený pro File → Import. Tři roky zkušeností s PMaxem mi říkají, co do kampaně patří, ale skládání atomárních kousků dělá skript s AI asistencí — a to je rozdíl, který stojí za rozepsání.
1. Proč vůbec XLSX import, když je k dispozici UI
Google Ads UI postavilo PMax jako “vyplň pár políček a my s tím kouzlíme”. Pro malou kampaň to funguje. Ve větším měřítku (víc asset groups, desítky headlines, dlouhý seznam search themes, precizní audience signals) je UI pomalé, klikací a náchylné na překlepy.
Google Ads Editor s XLSX importem je obráceně — minimum UI, maximum struktury. Co jde ze spreadsheetu, jde z něj rychle, konzistentně a kontrolovatelně:
- Celá kampaň + asset groups + search themes + audience signals + sitelinks v jednom souboru
- Diff před uploadem — uvidíš přesně, co se zapíše, než to zapíšeš
- Verzování v Gitu nebo Drive, dohledání, kdo co kdy změnil
- Bulk editace napříč kampaněmi — změna brand voice v 8 účtech během 5 minut
- Klient může komentovat přímo v Sheetu, než se nahraje
Jediná nevýhoda: musíš znát formát. Editor XLSX má tuhá pravidla na sloupce, sheety, pořadí. První tři importy si odtrápíš chybovými hláškami. Moje řešení bylo postavit si na to generátor, který pravidla drží sám.
2. Anatomie PMax Editor importu
Editor nebere 1 sheet = 1 kampaň. Bere typizovaný workbook se 6 sheety, každý reprezentuje jednu entitu nebo její relaci:
| Sheet | Obsah | Formát |
|---|---|---|
| README | Klient, záměr, instrukce pro kolegu | volný text |
| Campaigns | Kampaň settings (budget, bid strategy, URL expansion, final URL suffix) | 1 řádek = 1 kampaň |
| Asset groups | Headlines, descriptions, long headlines, cesty k obrázkům a videím | 1 řádek = 1 asset group (wide format) |
| Search themes | Search themes pro každou asset group | 1 řádek = 1 search theme |
| Audience signals | Custom audience / interest / remarketing signals | 1 řádek = 1 signal |
| Sitelinks | Sitelink texty a URL (ad-level) | 1 řádek = 1 sitelink |
Proč oddělené sheety a ne všechno wide v jednom? Protože Editor interně ukládá search themes, audience signals a sitelinks jako samostatné entity, ne jako sloupce asset groupy. Když je slepíš do jednoho wide sheetu, importér je buď ignoruje, nebo se rozbije. Naučil jsem se to metodou “importnul jsem 47krát a pak už ano”.
3. Můj workflow end-to-end
Ukážu to na hypotetickém setupu — retailer se třemi kategoriemi produktů, tři asset groups, každá s vlastními search themes a obecnějším audience signal.
1. Brief (5 min)
Od klienta (nebo z existujícího auditu) mám:
- Webovou adresu a top-selling kategorie
- Rozpočet a cílový CPA/ROAS
- Nevhodná slova (konkurence, značky, které nesmí chytit — ale pozor, brandy, které sám prodáváš, nejsou waste)
- Audience: existující remarketing listy, lookalike inspirace
2. Plán kampaně v konverzaci s AI (5 min)
Vypíšu do AI asistenta:
“Postav PMax pro klienta X. Rozpočet Y, ROAS target Z. Tři asset groups podle kategorií A, B, C. Potřebuju 15 headlines, 5 long headlines, 5 descriptions, 10 search themes per AG. Headlines na mix výhod + USP + price point. Audience signal: existující remarketing + interest in fitness equipment.”
AI mi vrátí návrh struktury — texty headlines s obměnou podle kategorie, search themes odhadnuté z SERP kontextu (a případně z MarketingMiner MCP dotahu), audience signal s ID existujících remarketing listů. Projdu, upravím, co neodpovídá brand voice, odmažu slabé varianty.
3. Obrázky (3 min)
Pokud klient nemá připravené product shoty, generuji je přes NanoBanana z briefu (“clean studio shot běžeckého pásu, bílé pozadí, 1200×1200 px, komerční fotografie”). Pro PMax potřebuju 1:1 a 1.91:1 minimum + logo square + landscape. Optimalizované WebP do ~350 KB per obrázek.
4. Spuštění generátoru (2 min)
Mám pmax_xlsx_builder.py script — reusable generátor, který vezme Python config (CONFIG dict) a vygeneruje kompletní XLSX se všemi 6 sheety. Cesty k obrázkům jsou absolutní. Asset groups ve wide formátu (1 řádek = 1 AG, 20 sloupců pro Image 1..20). Search themes, audience signals, sitelinks v samostatných sheetech.
Vyplním config — typicky ~60 řádků Pythonu — a spustím:
python tools/pmax_xlsx_builder.py clients/retailer/pmax_config.py out/pmax_retailer_2026-04.xlsxHotový XLSX mám na disku během 20 vteřin.
5. Sanity check (2 min)
Otevřu v Excelu, projedu sheets:
- Budget rozumný? Campaigns
- Počty asset groups a obrázků sedí? Asset groups
- Search themes per AG jsou unikátní, ne duplicity? Search themes
- Audience signal má správné user list IDs? Audience signals
Pokud mám i URL templaty, Final URL suffix je správný pro GA4 tracking.
6. Import do Editoru (1 min)
Google Ads Editor → Account → Import → From file… → XLSX. Editor ukáže diff (co se zapíše). Kontrola, Keep nebo Reject per řádek.
7. Upload do Google Ads (1 min)
Post changes → kampaň vznikla v účtu. Hotovo.
Celkem 15–20 minut.
4. Proč builder, a ne ruční skládání
Tři hlavní důvody, proč jsem investoval čas do generátoru, místo abych šablonu tahal ručně:
1. Konzistence napříč klienty. Každá kampaň má stejný formát, stejné sloupce, stejné konvence. Když se vrátím po měsíci, okamžitě se orientuji.
2. Chyby se opravují jednou, ne 30×. Když jsem zjistil, že Editor potřebuje Final URL suffix jako samostatný sloupec (ne součást URL), opravil jsem builder. Všechny budoucí exporty to mají správně.
3. Rozšiřitelnost bez refactoru. Loni na podzim Google přidal Brand exclusions jako nový field. Do builderu jsem přidal sloupec Brand exclusions v Campaigns sheetu, vyplnil pro dotčené klienty, import to zvládl.
Builder jsem opensourcoval vnitřně (plánuji veřejný release) — struktura je jednoduchá:
tools/
pmax_xlsx_builder.py # generátor
template_pmax_config.py # šablona configu (copy & fill)Config vypadá přibližně takto:
CONFIG = {
"campaign": {
"name": "PMax_retailer_2026-Q2",
"budget_daily": 1500, # CZK
"bid_strategy": "MaxConversions",
"target_roas": None,
"final_url_suffix": "utm_source=google&utm_medium=cpc",
},
"asset_groups": [
{
"name": "Behaci_pasy",
"final_url": "https://retailer.cz/behaci-pasy",
"headlines": ["Běžecké pásy od 12 990 Kč", "..."],
"long_headlines": ["...", "..."],
"descriptions": ["...", "..."],
"images": ["images/treadmill_1.jpg", "..."],
"search_themes": ["běžecký pás domů", "..."],
"audience_signals": ["user_list:12345", "interest:fitness"],
},
# další asset groups
],
"sitelinks": [
{"text": "Rychlé dodání", "url": "https://retailer.cz/doprava"},
# další
],
}Všechno, co mění kampaň, je v configu. Builder sám ví, jak z toho postavit správný XLSX.
5. Co tím reálně řeším
Za poslední čtvrtletí jsem tímto workflow postavil 11 PMax kampaní napříč 6 klienty. Průměrná doba od briefu k uploadu: 17 minut. Dřív jsem tohle nezvládal pustit ani jednou týdně, dnes je to ad-hoc operace, kterou pustím ráno mezi kávami.
Druhý vedlejší efekt: kvalita úvodní verze kampaně je vyšší. Proč? Protože generátor mě nutí vyplnit strukturovaný config, a když mi v něm chybí pole, vím o tom. Ručně jsem někdy zapomněl na long headlines nebo podstrčil jen default descriptions. Systém to neumí “zapomenout”.
Třetí efekt, kterého jsem si všiml později: lepší review s klientem. Místo “podíváte se na draft v Editoru, jestli vám to sedí?” posílám klientovi config (nebo sheet) a on může přímo komentovat: “tenhle USP vyměňte za ten”, “tady chybí kategorie pilates”. Změna v configu, rerun, hotovo.
6. Co to neumí (hranice)
Férově — builder řeší asset a structure. Neřeší za tebe strategii:
- Výběr správných kategorií pro asset groups (segmentace podle marže, sezónnosti, objemu) — to je pořád moje práce jako PPCčkaře.
- Rozhodnutí, zda PMax vůbec zapínat. Pro malé rozpočty nebo specifický B2B tráfik je cílený Search pořád lepší.
- Exclusions na úrovni účtu (brand exclusions, placement exclusions) — ty řešíš mimo XLSX.
- Optimalizace po spuštění. Builder je launch tool, ne management tool.
Pro post-launch optimalizaci používám jiný workflow přes Google Ads MCP (výkon asset groups, search themes expansion, audience signal iterace).
Závěr
PMax XLSX builder je banální kousek infrastruktury. Necelých 400 řádků Pythonu, žádná raketová věda. Ale šetří mi 2,5 hodiny každou novou PMax kampaní a drží kvalitu napříč mým portfoliem. Tahle kombinace — malá investice × opakovaný přínos — je přesně to, co podle mě dělá ten rozdíl mezi freelancerem, co jede na výkon, a freelancerem, co stále hasí požáry.
Pokud launchuješ PMaxy ručně v Editoru a trápí tě stejné vzorce (překlepy, zapomenuté fieldy, inkonzistence mezi klienty), zvaž něco takového postavit. Pokud to řešit nechceš (nebo nechceš sám), napiš — rád builder adaptuju na tvoji situaci a předám v použitelném stavu.
Stavíš PMaxy ručně a bolí to?
Ukážu ti můj builder na tvých kampaních a zprovozníme ti ho tak, aby fungoval u tvého setupu. Půl dne práce, zřetelně rychlejší launches napořád.
Tech FAQ
- Proč XLSX a ne CSV? Editor bere oba formáty, ale XLSX podporuje multi-sheet strukturu a formátování (styly, validační pravidla). CSV bys musel importovat 6× za sebou.
- Proč Python a ne Google Sheets + makra? Skriptovatelnost, versioning v Gitu, lepší ladění, bez závislosti na Google APIs. Sheets varianta fungovala půl roku, Python je robustnější.
- Podporuje builder Shopping (retail PMax)? Ano, stačí v configu vyplnit
feed_labelamerchant_center_id. Produktová část kampaně pak jede přes Merchant Center feed, zbytek (asset groups, search themes) se chová jako u standard PMax. - Jak řeším image optimalizace? Před importem projíždím všechny obrázky přes mini script — 1200×1200 crop, WebP 85 quality, ~300 KB target. Asset performance v Google Ads ukazuje, že lehké obrázky se vykreslí stabilněji.
- Plánuješ builder open-source? Ano. Až bude dokumentace a testy na úrovni, kterou bych chtěl mít u věci, kterou sdílím.




