# Geolocation and timezone tracking
> Track user location using IP-based geolocation enrichment or device GPS coordinates with the geolocation context entity.
> Source: https://docs.snowplow.io/docs/events/ootb-data/geolocation/
> Documentation index: https://docs.snowplow.io/llms.txt

Snowplow provides several ways to capture location and timezone information:

- IP-based geolocation: the IP Lookup enrichment adds location data to the `geo_` atomic event properties based on the user's IP address.
- Device geolocation: client-side trackers can access GPS coordinates from the device and attach them as an entity. This requires user permission but provides more accurate location data.
- Timezone: most trackers can capture the device timezone and add it to the `os_timezone` atomic event property.

## Location atomic event properties

The [IP Lookup enrichment](/docs/pipeline/enrichments/available-enrichments/ip-lookup-enrichment/) populates the `geo_` [atomic event properties](/docs/fundamentals/canonical-event/#location-fields), based on the IP address of the HTTP request to the event Collector.

## Timezone atomic event property

Some Snowplow trackers can populate the `os_timezone` [atomic event field](/docs/fundamentals/canonical-event/#time-and-date-fields) based on the device timezone.

Depending on the tracker, you may need to configure a plugin, set configuration on tracker initialization, or use the tracker Subject class. This table shows the support for timezone tracking across the main [Snowplow tracker SDKs](/docs/sources/):

| Tracker                                                                      | Supported | Since version |
| ---------------------------------------------------------------------------- | --------- | ------------- |
| [Web](/docs/sources/web-trackers/tracking-events/timezone-geolocation/)      | ✅         | 3.0.0         |
| [iOS](/docs/sources/mobile-trackers/client-side-properties/)                 | ✅         | 0.1.0         |
| [Android](/docs/sources/mobile-trackers/client-side-properties/)             | ✅         | 0.1.0         |
| [React Native](/docs/sources/react-native-tracker/client-side-properties/)   | ✅         | 0.1.0         |
| [Flutter](/docs/sources/flutter-tracker/initialization-and-configuration/)   | ✅         | 0.1.0         |
| [Roku](/docs/sources/roku-tracker/adding-data/)                              | ✅         | 0.1.0         |
| [Node.js](/docs/sources/node-js-tracker/configuration/)                      | ✅         | 0.8.0         |
| [Golang](/docs/sources/golang-tracker/adding-extra-data-the-subject-class/)  | ✅         | 0.1.0         |
| [.NET](/docs/sources/net-tracker/subject/)                                   | ✅         | 0.1.0         |
| [Java](/docs/sources/java-tracker/tracking-specific-client-side-properties/) | ✅         | 0.4.0         |
| [Python](/docs/sources/python-tracker/subject/)                              | ✅         | 0.4.0         |
| [Scala](/docs/sources/scala-tracker/subject-methods/)                        | ✅         | 0.1.0         |
| [Ruby](/docs/sources/ruby-tracker/adding-data-events/)                       | ✅         | 0.3.0         |
| [Rust](/docs/sources/rust-tracker/initialization-and-configuration/)         | ✅         | 0.1.0         |
| [PHP](/docs/sources/php-tracker/subjects/)                                   | ✅         | 0.1.0         |
| [C++](/docs/sources/c-tracker/adding-extra-data-the-subject-class/)          | ✅         | 0.1.0         |
| [Unity](/docs/sources/unity-tracker/subject/)                                | ✅         | 0.1.0         |
| Lua                                                                          | ❌         |               |
| Google Tag Manager                                                           | ❌         |               |

## Geolocation entity

Some Snowplow trackers can access device geolocation information, e.g. GPS coordinates, and attach it to events as an entity. This requires permission from the user, but is often more accurate than the IP-based geolocation.

This table shows the support for geolocation tracking across the main client-side [Snowplow tracker SDKs](/docs/sources/). The server-side trackers don't include geolocation tracking.

| Tracker                                                                    | Supported | Since version | Auto-tracking | Notes                           |
| -------------------------------------------------------------------------- | --------- | ------------- | ------------- | ------------------------------- |
| [Web](/docs/sources/web-trackers/tracking-events/timezone-geolocation/)    | ✅         | 3.0.0         | ✅             | Requires timezone plugin        |
| [iOS](/docs/sources/mobile-trackers/installation-and-set-up/)              | ✅         | 0.6.0         | ✅             | Set in tracker configuration    |
| [Android](/docs/sources/mobile-trackers/installation-and-set-up/)          | ✅         | 0.6.0         | ✅             | Set in tracker configuration    |
| React Native                                                               | ❌         |               |               |                                 |
| [Flutter](/docs/sources/flutter-tracker/initialization-and-configuration/) | ✅         | 0.1.0         | ✅             | Set in tracker configuration    |
| Roku                                                                       | ❌         |               |               |                                 |
| [Google Tag Manager](/docs/sources/google-tag-manager/settings-template/)  | ✅         | v3            | ❌             | Integrates with timezone plugin |

The React Native tracker did include geolocation entity configuration in earlier versions. We [deprecated it in version 4](/docs/sources/react-native-tracker/migration-guides/migrating-from-v2-x-to-v4/).

### `geolocation_context`

**Type:** Schema

Schema for client geolocation contexts

**Properties:**

| Property                             | Description |
| ------------------------------------ | ----------- |
| `latitude` _number_                  | _Required._ |
| `longitude` _number_                 | _Required._ |
| `latitudeLongitudeAccuracy` _number_ | _Optional._ |
| `altitude` _number_                  | _Optional._ |
| `altitudeAccuracy` _number_          | _Optional._ |
| `bearing` _number_                   | _Optional._ |
| `speed` _number_                     | _Optional._ |
| `timestamp` _integer_                | _Optional._ |
