GA4 Geographic Dimensions: How Country, Region, City, and Continent Work

This article explains how GA4 geographic dimensions (Country, Region, City, Continent) work: what each one means, how location is assigned when a user lands on your site, where compatibility breaks in reporting, the most common real-world issues (including patterns discussed on Reddit), and how to operationalize geo via the GA4 Data API, BigQuery Export, and the GA4 Measurement Protocol.
Table of Content
- What Dimensions mean in GA4
- Geographic Dimensions in GA4
- Compatibility
- Common Issues With Geographic Dimensions
- How Geographic Dimension Gets Assigned
- Reporting with the GA4 Data API
- BigQuery Export
- Measurement Protocol
What Dimensions mean in GA4
In GA4, dimensions are attributes that segment metrics into meaningful slices. Metrics are quantitative measurements (users, sessions, eventCount, etc.), while dimensions answer “how do we break the data down,” such as by country, traffic source, page, or event. Support Google
Geographic dimensions describe where activity originated and, in GA4, they are primarily derived from IP signals (especially for web).
The primary geo fields in the GA4 UI and Data API are Continent, Country, Region, and City, plus helper fields such as countryId, continentId, cityId, and languageCode.
Geographic Dimensions in GA4
Continent
- Definition: The continent where user activity originated.
- Typical values:
Americas,Europe,Asia, etc. - Best use case: common in executive-level global performance dashboards and high-level market health checks.
- Data API fields:
continent, pluscontinentId(geo ID derived from IP).
Country
- Definition: The country where user activity originated.
- Typical values:
United States,Germany, etc.; sometimes(not set)when no value is available for the dimension. - Best use cases: market-level performance reporting, geo scope validation, and paid vs. organic comparisons by market.
- Data API fields:
countryandcountryId(ISO3166-1alpha-2, derived from IP).
Region
- Definition: The region (state/province) where user activity originated, derived from IP.
- Typical values:
California,England,Bavaria, etc. - Best use cases: operational targeting (coverage, fulfillment, pricing) and anomaly detection.
- Data API field:
region.
City
- Definition: The city where activity originated. City is part of “granular location” and may not be collected depending on regional privacy settings.
- Typical values: real cities plus common data-center hubs (e.g.,
Ashburn). In practice, City is often best treated as a diagnostic signal rather than a precise truth. - Data API fields:
cityandcityId(geo ID derived from IP).
Compatibility: Where Geographic Dimensions Incompatible
Why you see “Incompatible request” or “No data available”
GA4 prevents certain dimension/metric combinations when: (1) fields are stored in separate datasets and cannot be queried together (integration data is a common trigger), (2) the selected exploration technique/visualization uses a restricted data model, or (3) additional compatibility rules apply.
What that means for geo
Geo dimensions are generally compatible with core metrics, but issues tend to cluster in three cases:
- Geo + advertising integration metrics (
cost,impressions, etc.) - Geo + narrow/specialized dimensions (
query-string, certain attribution or item-scoped fields) - Explorations technique limitations (e.g., pathing supports only a limited metric set)
How to validate compatibility
- In the UI: Dimensions & Metrics Explorer.
- In the API:
checkCompatibility.
Common Issues With Geographic Dimensions in Practice (Reddit patterns)
Recurring spikes of (not set) with near-zero engagement
In the context of geo dimensions, this typically means GA4 couldn’t capture or infer location data for a portion of events or sessions. Teams report periodic spikes where geo and other attributes show as (not set), engagement is minimal, and the traffic resembles bots/crawlers. Support Google
This can be caused by aggressive privacy and anti tracking solutions that strip or disrupt key signals, most often in server side setups. It’s especially common on B2B sites, where office network behavior tends to come with stricter device and browser protections.
Less often, it’s driven by your own GA4 configuration. If you disable Granular location and device data collection, Google explicitly states it won’t collect City (and certain device parameters). As a result, you’ll often see more “empty” values for City, which in the UI can appear as (not set) or reduced granularity, depending on the report. Support Google
“Data center cities” (Ashburn, Boardman, etc.)
A frequent pattern is Ashburn-type geo spikes with poor quality metrics, often handled via segmentation and analysis-level filtering. The most effective way to protect a site from automated traffic is to use a CDN/WAF (Cloudflare, Akamai, Fastly) and apply challenge / rate limiting / deny rules.
- Enable bot protection / managed challenges for suspicious requests.
- Apply rate limiting to endpoints like
/checkout,/wp-login,/xmlrpc,/admin,/api, and any other “sensitive” endpoints. - Block or challenge “bad” user agents (e.g.,
curl,python-requests, headless browsers) and anomalous patterns (too many requests, repeated identical paths).
Always maintain an allowlist for legitimate bots (Googlebot, Bingbot) and block everything else if the site is frequently scanned.
Geo mismatch between ad platforms and GA4
GA4 geo is derived from IP signals, while ad platforms may apply different location targeting logic (for example, “presence” vs. “presence or interest”), and VPN/proxy usage can change the apparent location.
How Geographic Dimension Gets Assigned: What HappensWhen a User Lands on Your Site
Your GA4 implementation sends events (including page_view and session_start) to Google.
Google derives City/Region/Country/Continent from IP signals.
For EU traffic, GA does not log or store IP addresses; IP is used only to derive geo metadata and is then discarded. Support Google
If granular location and device data collection is disabled for a region, GA4 does not collect City (and certain device details).
The operating model is event-centric: in BigQuery Export, geo.* is attached to the event and represents where the event was initiated, based on IP.
Reporting with the GA4 Data API
Use the official API Schema. General information on using the API can be found in the developer documentation. Developers Google. Core Reporting documentation Developers Google
You can use geographic dimensions to view the distribution by regions, cities, and countries. The runReport method returns a table with the requested dimensions and metrics. Core report: active users by country
«» http Copy
POST https://analyticsdata.googleapis.com/v1beta/properties/PROPERTY_ID:runReport
Content-Type: application/json
{
"dateRanges": [{"startDate": "2026-02-01", "endDate": "2026-02-27"}],
"dimensions": [{"name": "country"}],
"metrics": [{"name": "activeUsers"}],
"orderBys": [{"metric": {"metricName": "activeUsers"}, "desc": true}],
"limit": 50
}
You can also use geographic dimensions as filters to exclude or include data in a report for other dimensions. Core report: City breakdown with a countryId filter
«» http Copy
POST https://analyticsdata.googleapis.com/v1beta/properties/PROPERTY_ID:runReport
Content-Type: application/json
{
"dateRanges": [{"startDate": "2026-02-01", "endDate": "2026-02-27"}],
"dimensions": [{"name": "city"}, {"name": "cityId"}],
"metrics": [{"name": "eventCount"}],
"dimensionFilter": {
"filter": {
"fieldName": "countryId",
"stringFilter": {"matchType": "EXACT", "value": "US"}
}
},
"orderBys": [{"metric": {"metricName": "eventCount"}, "desc": true}],
"limit": 100
}
Geographic dimensions are also available in Realtime reports Developers Google. Realtime: active users by country “right now”
«» http Copy
POST https://analyticsdata.googleapis.com/v1beta/properties/PROPERTY_ID:runRealtimeReport
Content-Type: application/json
{
"dimensions": [{"name": "country"}],
"metrics": [{"name": "activeUsers"}],
"limit": 20
}
The API lets you check metric compatibility with other dimensions and metrics. Compatibility check (critical for report builders)
«» http Copy
POST https://analyticsdata.googleapis.com/v1beta/properties/PROPERTY_ID:checkCompatibility
Content-Type: application/json
{
"dimensions": [{"name": "city"}, {"name": "country"}],
"metrics": [{"name": "activeUsers"}, {"name": "eventCount"}]
}
BigQuery Export
GA4 exports daily events_YYYYMMDD tables and (if streaming is enabled) events_intraday_YYYYMMDD. Daily tables can be updated for up to three days due to ingestion latency, and event_timestamp is the time the event was received by Google Analytics. Support Google
Geo is stored on the event record: geo.continent, geo.sub_continent, geo.country, geo.region, geo.metro, geo.city (based on IP).
Sample SQL: events by country
«» sql Copy
SELECT
geo.country AS country,
COUNT(*) AS events
FROM `PROJECT.analytics_PROPERTY_ID.events_20260227`
GROUP BY 1
ORDER BY events DESC;
Measurement Protocol: how to set or correct geo
The user_location and ip_override attributes provide geographic information. user_location takes precedence over ip_override.
Detailed information on working with geo data in the Measurement Protocol can be found here Developers Google.
Example (user_location):
«» http Copy
POST https://www.google-analytics.com/mp/collect?measurement_id=G-XXXXXXX&api_secret=YYYYYYYY
Content-Type: application/json
{
"client_id": "123.456",
"user_location": {
"city": "Mountain View",
"region_id": "US-CA",
"country_id": "US",
"subcontinent_id": "021",
"continent_id": "019"
},
"events": [
{"name": "purchase", "params": {"value": 199.0, "currency": "USD"}}
]
}
Server-side nuance: if you send events from your server and do not set user_location/ip_override, GA derives geo from tagging events (and the request context), which can map to server location.