Guide

How to see Google Ads profit by country and Shopify market

To see Google Ads profit by country, join two records on one country code: the country segment in each product's offer ID (shopify_uk_…), which says which feed the spend was for, and the shipping country on each Shopify order. Convert each day's spend at that day's rate, take off cost of goods, refunds and ad spend per country, and add countries together for a Shopify market. Google Ads' own location report shows conversion value, which for a store sending order value is revenue, not profit.

Last checked · More guides

How profit by country is worked out

Profit by country is product profit split by one more key. Both sides usually carry a country, but not the same one: the ad side's is the feed the offer was listed for, and the order side's is where it ships. When the two match, as when a UK feed sells to UK addresses, the join is clean. An order shipped outside its feed's country lands in a country with no spend.

On the ad side, the country comes from the offer ID, the Merchant Center item ID Google reports spend against. Shopify-synced feeds usually use offer IDs of the form shopify_<country>_<product ID>_<variant ID>, so shopify_uk_123_456 is variant 456 listed for the United Kingdom. Not every ID names a real country: Google's help gives shopify_ZZ_ as a raw Shopify ID, and ZZ is no country. A feed from another app may use SKUs instead. Spend on such IDs cannot be split by country from the ID alone. Campaign location targeting decides where the ad may show; the offer ID is how its spend comes back labelled.

On the order side, each order's shipping address carries a country code, and each country can belong to a Shopify market with its own currency and prices.

The formulas, per country

Revenue = gross sales − refunds. ROAS = revenue ÷ ad spend. POAS = (revenue − cost of goods) ÷ ad spend, with break-even at 1.00×. Net profit = revenue − cost of goods − ad spend. Total a country's figures first, then divide; never average ratios.

The join: offer-ID country, order country, one code

Spend and orders line up by country only when both sides share the country code, the days and the currency.

  • One variant, many offer IDs

    A variant published to several feed countries can have one offer ID per country: shopify_uk_123_456 and shopify_de_123_456 are the same variant. All of that spend belongs to it. Assuming one offer per variant silently drops spend. Where one shopify_zz_ ID covers several countries, the ID cannot tell you which country the spend came from.

  • UK in the feed, GB on the order

    Shopify-synced feed IDs can spell the United Kingdom uk (shopify_uk_…), while orders arrive with the ISO 3166-1 code GB. Stored as they come, one country becomes two, one with spend and no orders, one with orders and no spend, and both ROAS figures are meaningless. Fold UK into GB (and EL, the EU's code for Greece, into GR) wherever a country enters, and pass unknown codes through rather than guessing.

  1. Step 1: Export cost by item ID, by day

    The shopping-performance report gives cost by item ID for Shopping and Performance Max. Use the same window on both sides, ending yesterday.

  2. Step 2: Read the country from each item ID

    It is the second part of shopify_uk_123_456: uk, which you then fold into GB. Keep spend on IDs that do not parse as an unattributed line; do not spread it.

  3. Step 3: Normalise the codes

    Upper-case them and fold UK into GB and EL (the EU's code for Greece) into GR on both sides.

  4. Step 4: Convert spend day by day

    Into store currency at each day's rate, then sum. Example rates: £100 at 1.17 is €117 and £100 at 1.15 the next day is €115, €232 in all; the £200 total at a later 1.19 would give €238.

  5. Step 5: Export orders with their shipping country

    With line revenue, refunds and each sold variant's cost per item.

  6. Step 6: Total per country, then per market

    Compute ratios from each country's totals, then add countries into their markets and compute again from those totals.

Shopify Markets: regions, currencies and price lists

A Shopify market changes the revenue side of the sum, so the same product can earn a different margin in each market at the same ad cost.

Shopify defines a market as “a merchant-defined group of buyers identified by conditions such as their region, retail location, or company location”. Each has currency settings and catalogues that set its prices, and can have its own domain, subdomain or subfolder. Prices convert at the current exchange rate by default; you can also set rates manually, adjust prices by a percentage, set prices by country or region, and round them per market.

So a market with a lower price list earns less per unit on the same cost of goods, and a market grouping several countries can hide which of them is paying. Look at its countries before acting on its total.

Opteno reads markets, regions, currencies and price lists from Shopify on each sync. Markets themselves are created and configured in Shopify, not in Opteno.

Worked example: one product, two countries

Example figures, not customer data

One product sold to Germany and the United Kingdom over 30 days, in a store that reports in euros, with spend already converted at each day's rate.

  • Germany (DE)

    Gross sales €3,200, refunds €200, so revenue €3,000. Cost of goods €1,200, ad spend €900. ROAS 3.33×. POAS (3,000 − 1,200) ÷ 900 = 2.00×. Net profit €900.

  • United Kingdom (GB)

    Gross sales €2,600, refunds €400, so revenue €2,200. Cost of goods €1,100, ad spend €1,300. ROAS 1.69×. POAS (2,200 − 1,100) ÷ 1,300 = 0.85×. Net profit −€200.

  • Both together

    Revenue €5,200, cost of goods €2,300, ad spend €2,200. ROAS 2.36×, POAS 1.32×, net profit €700.

The combined row hides the loss: a profitable product at 2.36× ROAS. By country, Germany makes €900 and the United Kingdom loses €200, its 1.69× ROAS below break-even once cost of goods is taken off (POAS 0.85×).

Averaging would also mislead: the mean of 3.33× and 1.69× is 2.51×, not the 2.36× the totals give.

The decisions are then per country. Where the UK and German offers have separate item IDs (shopify_uk_… and shopify_de_…), the UK one can be excluded while the German one keeps serving. Alternatively, the UK price can be raised, or the product can be withdrawn from the UK market.

What Opteno shows, and what you can do with it

Opteno runs this join per product and variant, and splits profit by country and by Shopify market, over rolling 7, 14, 30 and 60-day windows ending yesterday. Publishing to a market and changing a price are proposals a person approves, and each write shows as applying, then applied, failed or unconfirmed.

  • Profit by country and by market

    Profit split by country and by market, with the same arithmetic as the main dashboard, one level down.

  • One offer per feed country

    Spend is joined on the offer ID Google reports against, each day converted at its own rate. Spend that cannot be tied to a product is shown as unattributed, not spread.

  • Publish or withdraw per market

    From the place where you can see whether that market is paying for the product.

  • Change a price, with a 30-day snapshot

    Override one variant's price in one market's price list, or change the base price. Each change stores the ad spend, revenue, net profit, cost of goods, gross margin, ROAS, POAS, units and exchange rate of the 30 days before it.

  • Markets are read from Shopify and not edited in Opteno; price changes need the Shopify scopes that permit them.
  • A snapshot is a record, not a controlled experiment: it does not prove the price change caused what followed.
  • An order's country is its shipping-address country. An order with no shipping address, or one whose address Shopify withholds, still counts but is shown without a country.

Questions merchants ask

Can Google Ads show profit by country without another tool?

Partly. The Locations report shows performance by targeted or matched location, and its conversion value is revenue unless you send something else. Google can report gross profit if you send cart data and add cost_of_goods_sold to your Merchant Center feed, but its help lists that at campaign, ad group and product level, and it is built from conversions Google attributes to ads, not from Shopify's order records.

Why does the United Kingdom appear twice in my country report?

Because the two sides can spell it differently. Shopify-synced offer IDs can use uk, while Shopify orders use the ISO code GB, so spend lands under one and revenue under the other. Fold UK into GB on both sides before joining.

Is the country in the offer ID where the shopper was?

Not necessarily. It is the feed label the offer was listed under, usually a country (uk, de) and sometimes not one (zz). Google's “Matched locations” view shows where ads appeared, whether a physical location or a location of interest, and Shopify's country is where the order ships.

How do I convert spend when my ad account and store use different currencies?

Convert each day's spend at that day's rate, then add the days up, so a closed period keeps the profit it was earned at. In Opteno, a day with ad activity and no usable rate makes the affected totals not computable rather than estimated.

See which products are losing you money

Connect Shopify and Google Ads in under five minutes. From $14.99 a month, cancel whenever you want, and no change to your store or your campaigns without your approval.

support@opteno.app