In short: In a new country paid ads are the only channel that works on day one, as there is no SEO, no brand, no repeat buyers yet. So two numbers decide whether expansion pays: what a click costs on that market, and how your product price sits against the local competition. This blueprint pulls both straight from your product feed. You can feed your catalogue in and you get a ranked table of countries out, scored on real demand, CPCs, competitor prices and a simulated ROAS per market. One overnight run on a real online shop, every number shown.
This spring a client with a quarter-million-item catalogue asked me a simple question: which country should we expand into next? A few years ago I would have quoted that analysis in months. Demand, click prices, competitor prices and unit economics across thirteen countries used to mean something like 400 hours of manual work, the kind of quote clients politely decline. This time the keyword research ran overnight while I slept, and my own time on the whole thing came to a few focused hours.
The analysis is worth doing for one brutal reason. On day one in a new country you have no SEO ranking, no brand recognition, no repeat customers. Paid advertising is the only channel that brings buyers. So one number quietly decides whether the whole move pays off: what a click costs on that market. Pick a country because it felt right in a meeting, walk into an expensive auction, and you bleed budget before you’ve sold a thing.
And the click is only half of it. Even with cheap traffic you still have to close the sale, so the price of your product against the local competition matters just as much, along with the conversion rate and the average order value on that market. Western markets tend to run higher prices and higher click costs. Eastern markets run lower on both. Which combination actually turns a profit differs by country, and in twenty years of PPC I have never seen it be obvious from the map.
The good news is that every one of those numbers already sits in data you can pull in a day. That’s what this blueprint does. It starts from your product catalogue, the same Google Merchant Center file you already have, and ends with a ranked table of countries: where to expand next and why, backed by real search demand, real click prices, real competitor prices and a simulated return on ad spend for each market. Below is every step, with the actual numbers from one overnight run on a real online shop.
- In a new market paid ads are your only channel on day one, so the price of a click on that market is the number that decides whether expansion pays.
- The other half is your product price vs local competitors: cheap clicks into an expensive shelf can still lose. You have to check both.
- Feed your Merchant Center catalogue in and you get a ranked table of countries out, scored on real demand, CPCs, competitor prices and simulated ROAS.
- The obvious picks lose: on this run Germany landed 4th, Austria 5th, because their clicks cost up to 5× the cheapest market's.
Why doesn’t everyone do this already? Because the honest version used to be absurdly expensive. Demand, prices, competition and unit economics across ten or fifteen markets meant hundreds of hours of manual work: pulling keyword volumes country by country, translating seeds by hand, and above all reading the raw search queries line by line to sort real demand from junk. Until a couple of years ago no AI could do that reading for you, so a person had to. Hundreds of hours of it, and no client would pay for that. So it mostly didn’t get done, and teams picked their next country because someone spoke the language or a distributor called. The idea was always sound. What collapsed is the cost of executing it. Those hundreds of manual hours are now one overnight run plus an afternoon.
The seven-step blueprint at a glance
Here’s the whole shape before we go deep. For each step: what you do, what you’re looking at, and why. Every step answers one specific question about a market and moves you one decision closer to the ranked table.
1. Pick the shortlist (logistics first)
Do: list the countries you can actually deliver to. Why: market size is a terrible front-door filter, because the biggest market is usually the priciest to enter. Logistics is the real constraint, so it goes first. You get: a list of 10–15 candidate countries, and nothing wasted on markets you can’t serve.
2. Turn the feed into seeds
Do: take the product_type category paths from your Merchant Center feed and split them into single, searchable categories: “fridges and freezers” becomes “fridge” and “freezer”, generic levels like “home” get dropped. Why: your own catalogue already names every category you sell. It’s the best, cheapest seed source there is, far better than brainstorming keywords. You get: a few hundred meaningful seeds instead of a quarter-million raw feed rows.
3. Translate each seed into the native language
Do: have an LLM translate the full seed list into each shortlisted country’s own language, before any research. Why: nobody in Warsaw searches in English. Query the proxy language and every volume and CPC downstream is quietly wrong. You get: the exact local words to query each market on.
4. Pull keyword ideas per country
Do: ask Google Ads for keyword ideas for every translated seed in every country. Technically that’s the GenerateKeywordIdeas API endpoint, the same engine behind the Keyword Planner, just scripted. Why: this is the raw demand signal: volume, CPC and seasonality per keyword. You get: the full keyword universe per market, with each keyword still linked to its source category.
5. Clean the keywords, not the seeds
Do: filter the noise out at the keyword level, not the seed level. Why: a broad seed like “football” pulls millions of junk searches, but kill the seed and you also kill “football boots”, a real sale. You get: a relevant core, plus the buying-intent keywords tagged rather than thrown away.
6. Scrape the competition and their prices
Do: for your best-selling products, scrape the live results page per market in one API call. Why: volume tells you demand. It doesn’t tell you whether you’ll be crushed on price. The results page shows who advertises, at what price, how crowded the auction is. You get: competitor ad copy, live shopping prices and the organic players, for a few dollars per market.
7. Simulate the economics, then score
Do: simulate ROAS from real CPC, a defensible conversion rate and per-market AOV, then weight demand, prices, logistics and friction into one score. Why: this is the question you actually came to answer. You get: the ranked table. Where to expand, in order.
Now the same seven steps, one at a time, each with the real thing it produced on this run.
Step 1 · Shortlist
Step 1: Shortlist the countries you can actually ship to
Don’t start from the prize, from which markets are biggest, richest, most exciting. That’s the wrong front door. The biggest market is usually the one with the most brutal auction, and a market you can’t deliver to is worth exactly zero no matter how good its numbers look. So the real first filter is logistics. Start from where your carriers actually reach, and list only the countries where you can put a box on a doorstep.
For this shop that produced 13 candidate countries across Central and Eastern Europe and the Balkans. The home market (Czechia) sits in the list too, but only as the calibration baseline, not a target. Watch the last column. Two countries drop out here, before a single keyword is pulled.
| Country | In EU? | Currency | E-com growth | Note |
|---|---|---|---|---|
| Germany | Yes | EUR | +5 % | Anchor market |
| Austria | Yes | EUR | +6 % | — |
| Poland | Yes | PLN | +12 % | Largest CEE market |
| Slovakia | Yes | EUR | +8.5 % | Home-language overlap |
| Czechia (home) | Yes | CZK | — | Calibration baseline |
| Hungary | Yes | HUF | +15 % | — |
| Romania | Yes | RON | +18 % | — |
| Bulgaria | Yes | BGN | +16 % | — |
| Croatia | Yes | EUR | +14 % | Local payments prerequisite |
| Slovenia | Yes | EUR | +10 % | — |
| Serbia | No | RSD | +20 % | — |
| Albania | No | ALL | +28 % | — |
| Bosnia & Herz. | No | BAM | +22 % | Dropped: Keyword Planner lacks Bosnian |
| North Macedonia | No | MKD | +25 % | Dropped: Keyword Planner lacks Macedonian |
To be clear, Google Ads runs in both countries just fine. What’s missing is the research. The Keyword Planner doesn’t support Bosnian or Macedonian, so it returns no keyword suggestions, no volumes and no CPCs for those languages. You can’t price a market the tool can’t read. So both fall out of the analysis no matter how attractive their growth looks (+22 % and +25 %). Thirteen planned, eleven the tool can actually research.
That’s the texture of a real run: the data takes two of your best-looking options off the table for a reason you’d never have guessed in advance.
Step 2 · Seeds
Step 2: Turn your product feed into keyword seeds
You don’t need to brainstorm keywords. The seeds come straight from the product_type attribute in your Google Merchant Center feed. That attribute carries the shop’s own category tree, the same structure customers click through on the site, so it already names every category you sell, with a frequency count attached, and it’s sitting on your hard drive. The raw material here was ~252,000 catalogue items, with product_type paths glued together by ampersands and slashes the way real feeds always are (“Fridges and freezers”, “Toys & games”). The parser splits those into single categories, drops generic top-level nodes (“home”, “electronics”, “garden”), and keeps only paths that clear a frequency threshold. A quarter-million items collapses to a tight, meaningful seed list:
Feed → seeds: a quarter-million rows become 400 questions
- Raw catalogue items parsed ~252,000
- Distinct brands catalogued (kept out of seeds) 40,000+
- Frequency threshold: smallest kept seed still tags 234 items
- Meaningful category seeds after normalization 400
And the seeds are exactly what you’d query a market on: categories, never product names. The heaviest by catalogue weight:
| Seed (translated) | Catalogue items | Level |
|---|---|---|
| Toys | 21,636 | L2 |
| Cases | 14,411 | L3 |
| Women's clothing | 14,341 | L2 |
| Phones | 13,544 | L2 |
| Laptops | 12,277 | L2 |
| Pet supplies | 11,940 | L2 |
| Kitchen equipment | 11,379 | L2 |
| Auto & moto (accessories) | 11,683 | L1 |
To make it concrete, let’s say the shop’s feed has a path like Electronics > Mobile > Phone cases. The parser throws away “Electronics” as too generic, keeps “phone cases” as a seed, and counts how many products sit under it. Here “cases” tags 14,411 items, so it’s clearly a real category worth researching, not a one-off. Product names mostly have zero search volume, so they’re ignored; the 40,000-plus brands are held back as a separate signal. The categories carry the research, and you spent zero minutes inventing them.
Step 3 · Translate
Step 3: Translate every seed into the local language
This is the step people skip, and skipping it quietly ruins everything downstream. If you research Poland by typing “toys” into the keyword tool, Google hands you the volume and CPC for the English word “toys” as searched in Poland, a tiny, weird slice of expats and tourists. The number looks real. It is real. It’s also worthless, and every decision after it is now built on a market of nobody.
So before a single API call, an LLM translates the full seed list into each country’s native language. The 400 core seeds, expanded with synonyms and spelling variants, became 488 entries × 12 languages = 5,856 machine translations ready to go. Here is one seed, “toys”, as it actually went out to each market:
| Market | What 'toys' becomes before the API call |
|---|---|
| Germany (de) | Spielzeug |
| Poland (pl) | zabawki |
| Czechia / Slovakia (cs/sk) | hračky |
| Hungary (hu) | játékok |
| Romania (ro) | jucării |
| Croatia / Serbia (hr/sr) | igračke / играчке |
| Bulgaria (bg) | играчки |
| Slovenia (sl) | igrače |
| Albania (sq) | lodra |
Query zabawki instead of “toys” and you get the actual Polish market. The numbers move by an order of magnitude, not a rounding error. The one exception is brand names; those never get translated. Skip this step and steps 4 through 7 are built on sand, and nobody will tell you, because the spreadsheet looks perfectly plausible all the way to the wrong decision.
Step 4 · Pull demand
Step 4: Pull the search demand for every market
Now the heavy lifting, and the first thing you download. You run each translated seed, in each country, through the Google Ads GenerateKeywordIdeas endpoint, with the link from every keyword back to its source product_type preserved. I’ve been writing code against the Google Ads API for twelve years, and this is still the endpoint I lean on most. It returns the same demand data the Keyword Planner shows, just at a scale no human would ever click through. No Google Ads API access? Use the DataForSEO API instead. It serves the same keyword data, you pay per request, and the pricing is low enough that even a run this size stays cheap. Across eleven researchable countries the run produced 1,402,486 keyword ideas. And the per-market split is already a finding, because raw demand does not line up with the markets you’d bet on:
| Market | Raw keyword ideas | With search volume |
|---|---|---|
| Poland | 410,343 | 408,852 |
| Germany | 348,914 | 347,868 |
| Austria | 323,294 | 311,438 |
| Romania | 128,304 | 126,385 |
| Bulgaria | 76,866 | 75,650 |
| Croatia | 61,611 | 58,179 |
| Serbia | 14,573 | 13,848 |
| Slovakia | 10,884 | 9,173 |
| Albania | 9,704 | 4,339 |
| Hungary | 9,281 | 8,584 |
| Slovenia | 8,712 | 6,542 |
If demand were the whole story, this table would be the answer: Poland, Germany, Austria, go. It’s exactly the trap. Germany and Austria sit at the top here, which is precisely why a demand-only analysis marches you into the most expensive auction in the set. The markets that actually win are further down, and the click-price and economics steps are about to lift them.
The run is bookkept seed by seed, country by country: 4,220 seed-country jobs attempted, 3,619 returned data, 601 errored. Most of those errors were API quota limits, and quota errors you simply retry later until the run is complete. The rest were the unsupported-language aborts from step 1, which no retry will fix. Keep the log either way; you want proof of which cells actually have data behind them.
Step 5 · Clean
Step 5: Clean the keywords, not the seeds
A broad seed drags in noise, and the obvious move is to kill the noisy seed. Don’t. “Football” in Germany pulls millions of Bundesliga searches that have nothing to do with your shop. The same seed also pulls “football boots”, which you very much want to sell. Kill the seed and you kill its buying-intent children with it. So you filter at the keyword level, not the seed level, every time.
Here’s what the cleanup actually removed on this run, out-of-segment categories first, then pure noise:
| Removed bucket | Keywords cut | Why |
|---|---|---|
| Out of segment: large appliances | 11,243 | Fridges, washers (small-goods shop only) |
| Out of segment: whole vehicles | 8,127 | Motorcycles, cars (not parts) |
| Out of segment: large furniture | 6,675 | Too heavy for the logistics radius |
| Out of segment: central heating | 6,354 | Bulky items outside the catalogue |
| Noise: local car marketplace | 3,837 | PL 'otomoto' classifieds, not category demand |
| Noise: calendar pages | 2,528 | German 'Kalender', wrong intent |
| Noise: online games | 2,378 | Entertainment, not retail |
| Noise: used-car queries | 2,100+ | 'gebrauchtwagen', 'auto kaufen' |
| Noise: football / sport | 1,800+ | Bundesliga pulled in by the 'football' seed |
The rule in one example. The seed “auto-moto” is great for this shop, which sells car accessories. But in German it also pulls “gebrauchtwagen” (used cars) and “auto kaufen” (buy a car), worthless to a small-goods online shop. You don’t delete the seed. You delete those specific keywords and keep “Handyhalter Auto” (phone holder for cars). 2,100-plus junk keywords gone, the good ones untouched.
And cleanup isn’t only subtraction; it’s also tagging the signal you do want. For a bargain-segment catalogue the buying intent lives in the deal words, so 49,770 keywords got tagged as bargain-intent across eleven languages:
Deal-intent: the 49,770 keywords worth keeping, not cutting
- German 'gebraucht' (used) 22,128
- Polish 'używany' + variants 6,290
- German 'günstig' (cheap) 2,606
- Romanian 'ieftin' (cheap) 2,305
- English 'second hand' 1,783
- Total bargain-intent keywords tagged 49,770
This is the step that separates a deliverable a client trusts from a spreadsheet they quietly ignore. My first pass was full of Bundesliga, 2026 calendars and used-car listings. It took me a second full review across ten languages to get to a core worth handing over.
Step 6 · Competitive scrape
Step 6: Scrape the competition and their prices
Everything so far measures demand. None of it tells you whether you’ll walk into a market and get flattened on price by an incumbent who’s been there ten years. For that you have to look at the actual battlefield. So for the top 20–30 % of best-selling products per category, you localize the title and scrape the live results page. One POST request to DataForSEO’s SERP endpoint returns the entire page as structured JSON, and it costs about $0.0035 per query, so checking 3,000 top products in a market runs around $10.50. The exact call, ready to paste, is in the copy box near the end of this article.
One response, three things, one price: the paid block (competitor ad copy, raw material for your messaging), popular_products (shopping listings with live prices you can’t get from your own Merchant Center), and the organic results (the market’s real players, including the ones who don’t advertise). You pay for a price check and walk away with a competitor copy library and a market map.
And because the whole thing is scripted, you don’t stop at prices. The same pipeline walks the competitors it just found and pulls the rest of their offer: delivery prices and times, free-shipping thresholds, payment methods, cash on delivery or not. In this region that last one decides orders. If every local shop offers cash on delivery and you don’t, the checkout is where your cheap click dies. We run all of this through DataForSEO’s SEO APIs, so it’s one JSON pipeline end to end, no homemade scrapers to babysit. And the whole-program cost is the punchline:
The entire competitive pass, 12 markets, priced
- Organic Regular, task mode $21.60
- Merchant Shopping (prices only) $36
- Organic Advanced, live (paid + shopping + PAA) $126
- DataForSEO minimum top-up (lasts months) $50
A full competitive SERP pass across twelve countries runs $22–126 depending on mode. Compare that to a Semrush subscription at ~$140+/month flat, just for the UI. You’re mapping every competitor in every target market for less than one month of the tool everyone defaults to.
Step 7 · Score
Step 7: Score every market and rank them
Now everything collapses into one number per country. From real CPC, a defensible conversion rate and a per-market AOV you simulate ROAS for every market, then weight demand, prices, logistics, growth and entry friction into a single score. One ranked table. The thing you came for:
There it is: Slovakia, Poland and Serbia. A small market, a payments-headache market, and a non-EU one most people wouldn’t have floated. Germany, the country with the most demand in the entire set (348k keyword ideas), lands fourth, dragged down by a simulated ROAS of barely 1.0. Austria, the other default, comes fifth, below 1.0, which means it loses money.
The two markets that look most obvious are the two the math throws out first.
What does the dragging? One deliberate, brutal rule that keeps the table honest. When simulated ROAS drops below the viable threshold, the score is multiplied by 0.4. Remember why. On a fresh market paid is your only channel. You have no SEO yet, no brand, no repeat customers. A market where paid acquisition doesn’t pay can’t be your entry point, however big the prize. The penalty exists precisely to stop the spreadsheet from rubber-stamping a hunch.
Calibrate on one account you own first, or none of the above is trustworthy. The CPCs in that ranking are planner estimates, and they run high. On this client’s live home account I had the real numbers to check against: 22.6 million search terms over twelve months, a real paid CPC of 2.54 CZK, AOV 747 CZK, a measured conversion rate near 3 %. The Keyword Planner’s suggested CPC ran roughly 10× higher than what the account really paid, so every simulated CPC here gets discounted by ten before it touches the ROAS math. Never trust a simulated ROAS you haven’t calibrated against one account you actually run. This is the single step between “interesting analysis” and a number I’d bet budget on.
How the score is built: nine weighted factors
The score isn’t one metric wearing a crown. It’s nine components, each weighted by how much it actually moves the decision. ROAS dominates, because a huge market with brutal CPCs loses to a small market with cheap clicks every single time. That’s the entire lesson of the ranking above:
| Factor | Weight | What it measures |
|---|---|---|
| Paid viability (ROAS) | 20 % | Simulated AOV × CR ÷ CPC |
| Price competition | 15 % | Your prices vs. local sellers, per unit |
| Logistics | 15 % | Distance and delivery cost from home market |
| Search demand | 13 % | Normalized monthly search volume |
| Entry ease | 12 % | EU, shared currency, related language, COD |
| E-commerce growth | 10 % | Annual growth of the market |
| Market size | 5 % | E-commerce revenue, capped |
| Organic opportunity | 5 % | Low difficulty with enough volume |
| Purchasing power | 5 % | GDP per capita |
Two hard penalties keep it honest. Sub-viable ROAS multiplies the score by 0.4, as above. And a country with no CPC data at all gets cut to a third, because you don’t bet on a market you can’t price. That second penalty is exactly why the two countries dropped at step 1 never even reach the ranking: no language support, no keyword data, no price to model, no defensible bet.
The biggest lever: the price of a click per market
If you strip the model back to the one factor that moves it most, this is it. Here is the median planner CPC per market from the overnight run, across 745,712 cleaned, priced keyword ideas (Google Ads GenerateKeywordIdeas, 28–29 April 2026). Every figure is in CZK, the account’s own currency, so the markets compare cleanly. The spread is the whole reason not to default to the obvious market:
Read the colours before the numbers. The map runs cool in the east and south and heats up as you move west: Serbia and the Balkans sit in mint, Germany and Austria burn coral, and an Austrian click costs 5.1× a Serbian one, a German click 4.5×. That’s before basket size, before conversion rate, before anything you can control. The dashed row is the anchor. That 2.54 CZK is what the home account really pays per click in Czechia today. Even Poland, the biggest market in the region and one border away, plans its median click at nearly double that figure. Not a single market on the list promises home prices, and the familiar Western markets sit a full factor of five above the floor, then charge it for the rest of the campaign’s life. (Albania is left out of the map because with only 31 priced ideas its median isn’t worth trusting.)
Why does this one number decide so much? Because in a new country the click is the cost of a customer; you have no other way in yet. Hold everything else steady and change only the click, and the click price alone swings your return on ad spend by about 5×. Same product, same conversion rate, same basket. The only thing that moves is what the market charges to be seen:
| Market | Click (CZK) | Conv. rate | Cost per sale | ROAS, same basket |
|---|---|---|---|---|
| Serbia | 2.42 | 2 % | 121 CZK | 8.3× |
| Poland | 4.73 | 2 % | 237 CZK | 4.2× |
| Germany | 10.99 | 2 % | 550 CZK | 1.8× |
| Austria | 12.40 | 2 % | 620 CZK | 1.6× |
At a 2 % conversion rate it takes 50 clicks to make one sale. So a Serbian sale costs 121 CZK in ads and an Austrian one 620 CZK, for the exact same product. Against the same basket, that’s a healthy 8.3× ROAS in Serbia and a loss-making 1.6× in Austria. Nothing changed except the country’s click price. That’s the whole argument in one table: the cheapest-looking demand can be the most expensive customer.
The honest caveat is the same as in the callout. These are planner estimates, and planner CPC runs high. The real home account paid 2.54 CZK per click across 22.6M search terms, below even the cheapest planner figure here. So read the numbers as relative market pressure, not as the literal price you’ll pay. The ratios hold; the absolute figures come down once you calibrate. And a pricier Western click can still pay if its basket is bigger, which is exactly why you don’t stop at the click.
The other half: your product price vs the local market
The click gets the visitor to your page. Whether they buy depends on your price against the local competition, and that price level swings between markets even harder than the click does. The same exercise bike that holds a shelf at €349 in Austria sells for €151 in Romania. A household fan is €126 in Austria and €41 in Hungary. The ranking so far prices the click and is blind to every euro of this, because it never looks at what the competition actually charges.
So I ran the layer the model skips. For sixteen categories the shop actually stocks, I pulled the competitor median price in each market and set it next to the shop’s own median. Medians on both sides, never the single cheapest listing, because one outlier price tells you nothing. The source is Google Shopping’s popular_products carousel, the real listings real shoppers see. The eleven categories with broad enough coverage to compare across markets are below.
One note before you read it. The shop’s own column needs honest framing. This is a bargain shop. Its catalogue is deliberately built from the cheap end of every category, so its median often lands at half a category’s typical market price, sometimes lower. Comparing it against the market average as if the goods were like for like would flatter every cell. So read each cell as headroom instead, meaning how high the local shelf sits above the shop’s bargain floor. That headroom is the cell colour: green is wide (market at 3× the floor or more), gold is decent (1.6–3×), coral is tight (under 1.6×).
| Category | The shop € | DE | AT | PL | HU | SK | RO |
|---|---|---|---|---|---|---|---|
| Vacuum cleaners | €62 | €80 | €102 | €83 | €83 | €91 | €88 |
| Keyboards & mice | €21 | €30 | €33 | €23 | €25 | €27 | €24 |
| Aquarium pumps | €12 | €16 | €18 | €23 | €26 | — | €14 |
| Hair dryers | €17 | €33 | €44 | €56 | €30 | — | €26 |
| Diving gear | €18 | €44 | €59 | €23 | — | €27 | €24 |
| Bags | €8 | €31 | €40 | €23 | €21 | €26 | €28 |
| Fans | €15 | €62 | €126 | €45 | €41 | — | — |
| Snow chains | €24 | €119 | €147 | €59 | — | — | — |
| Equestrian | €19 | €106 | €116 | €81 | — | €106 | — |
| Terrariums | €12 | €110 | €96 | €46 | — | — | — |
| Exercise bikes | €23 | €192 | €349 | €197 | — | — | €151 |
Two things fall out that the click-price table could never show you.
Headroom is category × market, never a flat “we’re cheaper”. Vacuum cleaners and keyboards run coral almost everywhere. Even a bargain shop sits within a whisker of the market on high-value electronics, because everyone’s margin there is already shaved thin. But exercise bikes, terrariums, snow chains and equestrian gear glow green. In those corners the market charges five to fifteen times the floor, because nobody is competing hard on price. “We’re the cheap option” is true per cell, not per country. And it’s the cells that tell you which catalogue lines to lead the expansion with.
The expensive-click markets are the expensive-shelf markets too. Germany and Austria carry the two priciest clicks in the whole run, and they’re exactly where the shelf sits highest (Austria’s exercise-bike shelf is €349, Romania’s €151). That’s the nuance the click-cost ranking hides. A pricey Austrian click can still pencil out if the basket it buys is worth more, while a cheap Polish click into a cheap Polish shelf can quietly be the worse deal. Click cost and shelf price are two different axes, and you only see the trap when you plot both. Which is why the score above weights price competition at 15 %, right behind ROAS.
And the holes in the table are themselves a finding. Carousel coverage thins as you move east and south. Germany, Austria and Poland fill nearly every cell; Hungary, Slovakia and Romania already show blanks; and the cheapest-click markets of all, the Balkans, return almost nothing, because Google doesn’t render a popular_products carousel in those countries. The price layer evaporates exactly where the click looked cheapest. To price those markets you leave Google and read the local comparison engines (Ceneje.si, Jeftinije.hr, Pazaruvaj.bg), which is a different afternoon’s work.
Bonus: the same data tells you when to launch
You paid for one keyword pull and it quietly carried a second deliverable: twelve months of search volume per keyword, 16.7 million monthly data points across 1.39 million keywords. Aggregate it and the demand curve is unmistakable. One peak month carries 40 % more search demand than the quietest.
December tops the curve, July bottoms it. Exactly what you’d expect for a general-merchandise catalogue. That single swing is your launch-timing signal. You don’t open a new market into its dead month, and you load spend before the December run-up, not during it. The analysis you ran to pick where already told you when, for free.
Real numbers, one real run
Every figure above came out of one real run. Here’s the headline set, with two more cross-border analyses for scale:
From real CEE expansion analyses
- Keyword ideas, one shop (Google Ads API) 1,402,486
- Countries targeted / completed 13 / 11
- Keyword research wall-clock, overnight & automated ~10 hours
- Niche catalogue: raw keywords → kept after AI cleanup 1.18M → 168k (−86 %)
- Full SERP pass: 12 countries × 3,000 queries $22–126
Two markets had to be dropped mid-run because the keyword research tools don’t support their language. That’s the kind of constraint you only learn by actually running the thing. The ~10 hours is machine time. The research grinds overnight across all countries in parallel while you sleep. The human work (shaping the feed, calibrating the economics, cleaning the noise, building the deliverable) is a few focused hours on top. I used to scope this exact deliverable at roughly half a million crowns, and the money was never for clever code. It bought hundreds of hours of hand work. Someone had to read and clean search queries market by market, a job no AI could touch a few years ago. Clients understandably said no. Now it’s an overnight run plus a day of my attention.
(The −86 % cut is from a different, far more niche catalogue, a B2B construction-profiles shop where most broad-seed keywords were genuinely off-topic. The bargain shop above only shed a single-digit percentage. How aggressive the cleanup is depends entirely on how niche you are.)
What to do with the ranking
Enter the market the data picked, not the one you assumed
The whole point was to be surprised, and you were. Slovakia and Serbia, a small market and a non-EU one, outscored Germany and Austria outright, purely because clicks were a fraction of the price and the economics actually closed. That’s the deliverable doing its only job: overruling the assumption with the math, before the assumption spends the budget.
The competitive scrape is already your launch playbook
Step 6 pulled every competitor’s ad copy and price point per market, so you don’t walk in blind. You know who’s there, what they charge, which benefits they push in their headlines, and where there’s a price gap to undercut or a positioning gap to own. All of it before you spend a single euro on traffic.
Demand per category tells you what to ship first
You kept the link from each keyword back to its product_type. So you don’t just know Poland is good; you know which categories Poland searches for, in what volume. The catalogue you launch with is the one the data says the market wants, not a copy-paste of your home assortment.
Download the complete instructions for your AI
The whole blueprint above, rewritten as a brief you can paste straight into Claude or any capable coding agent. You supply the Merchant Center feed and the API access; it runs the seven steps on your shop. Leave your email and the file is yours.
One file, one list. I only write when there's something worth reading.
Frequently asked questions
How many countries should I analyze?
Start from logistics, not ambition. List whatever you can actually ship to, usually a 10–15 country shortlist. This run started from 13 and lost two at the keyword stage because Google Ads couldn’t research their language; the scoring thinned the rest.
A million keywords sounds like overkill. Is it?
That’s simply the natural scale: 400 seeds × a dozen languages × all their variants runs into the millions. This one shop produced 1,402,486 keyword ideas. The volume is the point. You’re mapping a market, not writing a 5,000-word brief.
Google Ads API, DataForSEO or Semrush?
Google Ads API for the keyword ideas if you have a strong token; it’s the source of truth. DataForSEO for the SERP scraping and as a cheap keyword alternative. A full 12-country competitive pass runs $22–126. Semrush is the expensive option, and for this job there’s little reason to pay its flat subscription.
How do you handle so many languages?
An LLM translates the seed list into each country’s native language before the research runs. The 400 core seeds expand to 488 entries with variants, times 12 languages on this run, which meant 5,856 translations ready before the first API call. English as a proxy quietly distorts every volume and CPC, because nobody in Warsaw searches in English.
Can I trust the CPC numbers for the ROAS simulation?
Not raw. Keyword-tool CPCs are planning estimates; on this live account the suggested CPC was about 10× the real paid one (2.54 CZK across 22.6M search terms). Calibrate against one account you actually run, apply that discount, and then the simulated ROAS is worth something.
How long does the whole thing take?
The keyword research itself is one overnight run, roughly 10 hours of unattended machine time across all countries in parallel. The human work around it (feed shaping, economics, cleanup, deliverable) is a handful of hours. Call it a day or two end to end, against what used to be weeks.