# Common Fields


RudderStack defines some common fields (event type, timestamps, and more) across all API calls that make up the core event data structure.

This guide covers the common and contextual fields in detail.

## Common fields

| <div style="width:100px">Name</div> | Data type | <div style="width:350px">Description</div> |
| :------------------ | :------- | :-------------------- |
| `userId`  <br /><span style="color: #4D4DFF;font-size:12px;">Required, if `anonymousId` is absent.</span>     | String   | Unique identification for the user in the database |
| `anonymousId`  <br /><span style="color: #4D4DFF;font-size:12px;">Required, if `userId` is absent.</span>     | String   | Pseudo-identifier for the user in cases where `userId` is absent. This is the same as the device ID. |
| `channel`  <br /><span style="color: #4D4DFF;font-size:12px;">Required</span> | String   | Identifies the source of the event. Permitted values are `mobile`, `web`, `server` and `sources`. |
| `context`  <br /><span style="color: #4D4DFF;font-size:12px;">Required</span> | Object   | Contains all additional user information. The RudderStack SDKs populate this information automatically. |
| `type`   <br /><span style="color: #4D4DFF;font-size:12px;">Required</span> | String   | Captures the type of event. Values can be either `identify`, `track`, `screen`, `page`, `group`, or `alias`. |
| `originalTimestamp` <br /><span style="color: #4D4DFF;font-size:12px;">Required</span> | Timestamp | Records the actual time (in UTC) when the event occurred. Make sure it conforms to the ISO 8601 date format `yyyy-MM-ddTHH:mm:ss.SSSZ`. <br /><br />  For example, `2022-02-01T19:14:18.381Z`.   |
| `sentAt`  <br /><span style="color: #4D4DFF;font-size:12px;">Required</span> | Timestamp | Captures the time (in UTC) when the event was sent from the client to RudderStack. Make sure it conforms to the ISO 8601 date format `yyyy-MM-ddTHH:mm:ss.SSSZ`. <br /><br />  For example, `2022-02-01T19:14:18.381Z`.       |
| `event` | String   | Captures the user action that you want to record.     |
| `integrations`      | Object   |  You can specify the destinations for which you want to enable/disable sending events.   |
| `messageId`         | String   |  Unique identification for the event.          |
| `properties`        | Object   | Passes all relevant information associated with the event.     |

RudderStack also sets the following fields automatically, so you **do not** have to set them explicitly:

| Name | Data type | <div style="width:350px">Description</div> |
| :---- | :------| :------| 
| `receivedAt` | Timestamp  | Time in UTC when RudderStack ingests the event. | 
| `timestamp` | Timestamp | RudderStack calculates this field (in UTC) to account for any client-side clock skew using the formula: `timestamp` = `receivedAt` - (`sentAt` - `originalTimestamp`). <br /><br />See [Clock skew considerations](#clock-skew-considerations) for more information. |
| `request_ip` | String | User's IP address. RudderStack automatically collects and sets this property as a common field. <br /><br />See [How RudderStack collects IP address](#how-rudderstack-collects-ip-address) for more information. |

## Contextual fields

Contextual fields give additional information about a particular event. The following table describes the available contextual fields.

| <div style="width:100px">Name</div>       | Data type | <div style="width:350px">Description</div> |
| :--- | :--- | :--- |
| `app` | Object | Gives detailed information related to your app, like `build`, `name`, `namespace` and `version`. |
| `campaign` | Object | Gives detailed information about campaigns, like `name`, `source`, `medium`, `content` and `term`. |
| `device` | Object | Information about the device from which you are capturing the event. It contains the device `id`, `manufacturer`, `model`, `name` and `type`. |
| `ip` | String | User's IP address. <br /><br />See [How RudderStack collects IP address](#how-rudderstack-collects-ip-address) for more information. | 
| `library` | Object | Details about the RudderStack SDK you are using, like `name` and `version`. |
| `locale` | String | Captures the language of the device. |
| `network` | Object | Contains information about the reachability of the device. Also, it gives you the status of the device's `bluetooth`, `wifi`, `cellular` network and `carrier` name. |
| `os` | Object | Captures the operating system details of the device you are tracking. <br /><br />**Note**: While the JavaScript SDK does not populate this information automatically, you can get it using the [`uaChTrackLevel`]({{< ref "sources/event-streams/sdks/rudderstack-javascript-sdk/load-js-sdk.md#uachtracklevel" >}}) `load` API option. |
| `screen` | Object | Gives you the screen dimensions of the device,  i.e. `height`, `width` and the `density`. |
| `timezone` | String | Captures the timezone of the user you are tracking. |
| `traits` | Object | Captures any additional relevant information about the user. RudderStack fills in the `anonymousId` for you. You can also associate the   [traits]({{< relref "/event-spec/standard-events/identify.md#identify-traits" >}}) from the previously-made `identify` call from the SDK. |
| `userAgent` | String | The user agent of the device that you are tracking. |

### Automatically collected contextual fields

The following table describes contextual fields that are automatically collected and populated by the RudderStack SDKs:

| Field | JavaScript | Android (Kotlin) | iOS (Swift) | Android (Java) | <div style="width:75px">iOS <br />(Obj-C)</div> |
| :--- | :--- | :--- | :--- | :--- | :--- |
| `app.name` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Application name</span> | - | Yes | Yes | Yes | Yes |
| `app.version` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Application version</span> | - | Yes | Yes | Yes | Yes |
| `app.build` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Application build</span> | - | Yes | Yes | Yes | Yes |
| `campaign.name` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Campaign name</span> | Yes | - | - | - | - |
| `campaign.source` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Campaign source</span> | Yes | - | - | - | - |
| `campaign.medium` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Campaign medium</span> | Yes | - | - | - | - |
| `campaign.term` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Campaign term</span> | Yes | - | - | - | - |
| `campaign.content` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Campaign content</span> | Yes | - | - | - | - |
| `device.type` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Device type</span> | - | Yes | Yes | Yes | Yes |
| `device.id` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Device ID</span> | - | Yes | Yes | Yes | Yes |
| `device.advertisingId` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Advertising ID</span> | - | No** | No** | Yes | Yes |
| `device.adTrackingEnabled` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Whether ad tracking is enabled on the device</span> | - | - | No** | - | Yes |
| `device.manufacturer` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Device manufacturer</span> | - | Yes | Yes | Yes | Yes |
| `device.model` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Device model</span> | - | Yes | Yes | Yes | Yes |
| `device.name` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Device name</span> | - | Yes | Yes | Yes | Yes |
| `library.name` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Library name</span> | Yes | Yes | Yes | Yes | Yes |
| `library.version` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Library version</span> | Yes | Yes | Yes | Yes | Yes |
| `locale` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">User's locale string</span> | Yes | Yes | Yes | Yes | Yes |
| `network.bluetooth` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Bluetooth information</span> | - | Yes* | No** | Yes* | - |
| `network.carrier` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Network carrier information</span> | - | Yes | - | Yes | Yes |
| `network.cellular` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Network's cellular information</span> | - | Yes | - | Yes | Yes |
| `network.wifi` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Network's WiFi information</span> | - | Yes | Yes | Yes | Yes |
| `os.name` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Operating System name</span> | - <br /><br/> <span style="color: #4D4DFF;font-size:13px;">Use the [`uaChTrackLevel`]({{< ref "sources/event-streams/sdks/rudderstack-javascript-sdk/load-js-sdk.md#uachtracklevel" >}}) `load` API option</span> | Yes | Yes | Yes | Yes |
| `os.version` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Operating System version</span> | - <br /><br/> <span style="color: #4D4DFF;font-size:13px;">Use the [`uaChTrackLevel`]({{< ref "sources/event-streams/sdks/rudderstack-javascript-sdk/load-js-sdk.md#uachtracklevel" >}}) `load` API option</span> | Yes | Yes | Yes | Yes |
| `page.path` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Path of the current page in the browser</span> | Yes | - | - | - | - |
| `page.initial_referrer` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Initial referrer of the current page</span> | Yes | - | - | - | - |
| `page.initial_referring_domain` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Initial referring domain of the current page</span> | Yes | - | - | - | - |
| `page.referrer` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Referrer of the current page</span> | Yes | - | - | - | - |
| `page.referring_domain` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Referring domain of the current page</span> | Yes | - | - | - | - |
| `page.search` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Search of the current page</span> | Yes | - | - | - | - |
| `page.title` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Page title</span> | Yes | - | - | - | - |
| `page.url` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Canonical URL of the page (if present)</span> | Yes | - | - | - | - |
| `page.tab_url` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">URL of the current page</span> | Yes | - | - | - | - |
| `screen.density` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Screen density of the device</span> | Yes | Yes | Yes | Yes | Yes |
| `screen.height` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Screen height of the device</span> | Yes | Yes | Yes | Yes | Yes |
| `screen.width` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Screen width of the device</span> | Yes | Yes | Yes | Yes | Yes |
| `screen.innerWidth` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Screen inner width of the device</span> | Yes | - | - | - | - |
| `screen.innerHeight` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">Screen inner height of the device</span> | Yes | - | - | - | - |
| `traits` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">User traits</span> | - | Yes | Yes | Yes | Yes |
| `userAgent` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">User agent information about the device making the request</span> | Yes | No** | No** | Yes | - |
| `timezone` <br/> <span style="color:rgb(0, 0, 0);font-size:13px;">User's timezone</span> | Yes | Yes | Yes | Yes | Yes |

Note that:

- For Android (Kotlin) and iOS (Swift) SDKs, you can still collect the fields marked as **No\*\*** by adding [Custom Plugins]({{< ref "sources/event-streams/sdks/client-side-features/plugin-architecture/use-cases.md" >}}) maintained by RudderStack in the sample applications of the [Android (Kotlin)](https://github.com/rudderlabs/rudder-sdk-kotlin/tree/main/app/src/main/java/com/rudderstack/sampleapp/analytics/customplugins) and [iOS (Swift)](https://github.com/rudderlabs/rudder-sdk-swift/tree/main/Examples/SwiftUIExample/SwiftUIExample/CustomPlugins) SDKs on GitHub.
- For Android (Kotlin) SDK and Android (Java) SDK v1.6.0 and above, the Bluetooth status is collected in the `network.bluetooth` field **only if** the Bluetooth permission is present in the app.
- For iOS (Obj-C) SDK v1.6.3 and above, the Bluetooth status is **not collected** in the `network.bluetooth` field as it is a runtime permission.

### Sample payload with contextual fields

The following sample payload highlights the usage of the common and contextual fields in web and mobile modes:

{{< tabs tabTotal="3" >}}
{{% tab tabName="JavaScript" %}}
<span>

```json
{
  "anonymousId": "78c53c15-32a1-4b65-adac-bec2d7bb8fab",
  "channel": "web",
  "context": {
    "campaign": {
      "name": "sales campaign",
      "source": "google",
      "medium": "medium",
      "term": "event data",
      "content": "Make sense of the modern data stack"
    },
    "ip": "192.0.2.0",
    "library": {
      "name": "RudderLabs JavaScript SDK",
      "version": "2.9.1"
    },
    "locale": "en-US",
    "page": {
      "path": "/best-seller/1",
      "initial_referrer": "https://www.google.com/search",
      "initial_referring_domain": "google.com",
      "referrer": "https://www.google.com/search?q=estore+bestseller",
      "referring_domain": "google.com",
      "search": "estore bestseller",
      "title": "The best sellers offered by EStore",
      "url": "https://www.estore.com/best-seller/1"
    },
    "screen": { 
      "density": 420, 
      "height": 1794, 
      "width": 1080, 
      "innerHeight": 200, 
      "innerWidth": 100 
      },
    "userAgent": "Dalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)"
  },
  "event": "Product Reviewed",
  "integrations": { 
    "All": true 
    },
  "messageId": "1578564113557-af022c68-429e-4af4-b99b-2b9174056383",
  "properties": {
    "review_id": "review_id_1",
    "product_id": "product_id_1",
    "rating": 5.0,
    "review_body": "It's the greatest!"
  },
  "originalTimestamp": "2020-01-09T10:01:53.558Z",
  "type": "track",
  "sentAt": "2020-01-09T10:02:03.257Z"
}
```
</span>
{{% /tab %}}
{{% tab tabName="Android (Java) — Legacy" %}}
<span>

```json
{
  "anonymousId": "78c53c15-32a1-4b65-adac-bec2d7bb8fab",
  "channel": "mobile",
  "context": {
    "app": {
      "name": "RudderAndroidClient",
      "version": "1.0",
      "build": "1"
    },
    "device": {
      "type": "android",
      "id": "78c53c15-32a1-4b65-adac-bec2d7bb8fab",
      "advertisingId":"435o4GRlm",
      "manufacturer": "Google",
      "model": "Android SDK built for x86",
      "name": "generic_x86",
    },
    "ip": "192.0.2.0",
    "library": {
      "name": "com.rudderstack.android.sdk.core",
      "version": "0.1.4"
    },
    "locale": "en-US",
    "network": {
      "bluetooth": false,
      "carrier": "Android",
      "cellular": true,
      "wifi": true
    },
    "os": { 
      "name": "Android", 
      "version": "9" 
      },
    "screen": { 
      "density": 420, 
      "height": 1794, 
      "width": 1080 
      },
     "traits": { 
      "anonymousId": "78c53c15-32a1-4b65-adac-bec2d7bb8fab" 
      },
    "timezone": "Asia/Mumbai",
    "userAgent": "Dalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)"
  },
  "event": "Product Reviewed",
  "integrations": { 
    "All": true 
    },
  "messageId": "1578564113557-af022c68-429e-4af4-b99b-2b9174056383",
  "properties": {
    "review_id": "review_id_1",
    "product_id": "product_id_1",
    "rating": 5.0,
    "review_body": "It's the greatest!"
  },
  "originalTimestamp": "2020-01-09T10:01:53.558Z",
  "type": "track",
  "sentAt": "2020-01-09T10:02:03.257Z"
}
```
</span>
{{% /tab %}}
{{% tab tabName="iOS (Obj-C) — Legacy" %}}
<span>

```json
{
  "anonymousId": "78c53c15-32a1-4b65-adac-bec2d7bb8fab",
  "channel": "mobile",
  "context": {
    "app": {
      "name": "RudderSampleAppObjC",
      "version": "1.0",
      "build": "1"
    },
    "device": {
      "type": "iOS",
      "id": "78c53c15-32a1-4b65-adac-bec2d7bb8fab",
      "advertisingId":"435o4GRlm",
      "adTrackingEnabled": false,
      "manufacturer": "Apple",
      "model": "iPhone",
      "name": "iPhone 12",
    },
    "ip": "192.0.2.0",
    "library": {
      "name": "rudder-ios-library",
      "version": "1.5.0"
    },
    "locale": "en-US",
    "network": {
      "carrier": "unavailable",
      "cellular": false,
      "wifi": true
    },
    "os": { 
      "name": "iOS", 
      "version": "15.2" 
      },
    "screen": { 
      "height": 1794, 
      "width": 1080 
      },
     "traits": { 
      "anonymousId": "78c53c15-32a1-4b65-adac-bec2d7bb8fab" 
      },
    "timezone": "Asia/Mumbai"
  },
  "event": "Product Reviewed",
  "integrations": { 
    "All": true 
    },
  "messageId": "1643629072-8ce81faf-7489-4508-b21b-659e81510991",
  "properties": {
    "review_id": "review_id_1",
    "product_id": "product_id_1",
    "rating": 5.0,
    "review_body": "It's the greatest!"
  },
  "originalTimestamp": "2020-01-09T10:01:53.558Z",
  "type": "track",
  "sentAt": "2020-01-09T10:02:03.257Z"
}
```
</span>
{{% /tab %}}
{{< /tabs >}}

## How RudderStack collects IP address

RudderStack automatically collects the user's IP address in the `request_ip` property as a [common field](#common-fields).

{{< info >}}
Note that:

- The `request_ip` field is available in the final event received at the destination and in the [Live Events]({{< ref "monitor/live-events.md" >}}).
- RudderStack leverages the automatically collected IP address for [Geolocation Enrichment]({{< ref "data-governance/geolocation-service.md" >}}) if enabled, allowing RudderStack to look up geographic information based on that IP address.
{{< /info >}}

### Set custom IP address

You can set a custom IP address or anonymize it in your events using two methods:

#### Method 1: Include IP in the `context` object (Recommended)

Set the IP address in the `context.ip` field:

```javascript
rudderanalytics.identify(
  "1hKOmRA4el9Zt1WSfVJIVo4GRlm", {
    firstName: "Alex",
    lastName: "Keener",
    email: "alex@example.com",
    phone: "+1-202-555-0146"
  }, {
    context: {
      ip: "192.0.2.0"
    }
  },
  () => {
    console.log("Identify event successfully submitted to the RudderStack SDK.");
  }
);
```

#### Method 2: Include IP in the `request_ip` field

Set the IP address directly in the `request_ip` field in the event payload:

```json
{
  "type": "track",
  "event": "Page Viewed",
  "userId": "1hKOmRA4GRlm",
  "properties": {
    "page": "/home"
  },
  "request_ip": "192.168.1.100"  // Custom IP address
}
```

#### How RudderStack prioritizes IP address collection

RudderStack prioritizes the below fields when determining which IP address to use:

1. `context.ip` (if provided)
2. `request_ip` (if provided)
3. **Fallback**: Automatically detected IP from the request

{{< info >}}
RudderStack only adds the automatically captured IP address if no `request_ip` field exists, even if `context.ip` is already present in the event.
{{< /info >}}

## Clock skew considerations

RudderStack considers the time at its end to be absolute and assumes any differences are on the client-side. Thus, the client clock skew is relative.

Note that all the below timestamps are in UTC.

| Field               | Description      |
| :-------------------| :-----------------------|
| `originalTimestamp` | Time, client-side, when the event occurred at the source.        |
| `sentAt`            | Time, client-side, when the event was sent from the client to RudderStack.       |
| `receivedAt`        | Time when the event is received(ingested) by the RudderStack server.            |
| `timestamp`         | Calculated by RudderStack to account for the client clock skew, if the user does not explicitly specify it in the payload.  |
| `uuid_ts` | Time when RudderStack loads the data into the warehouse. <br /><br />Note that:<br /><br /><ul><li>RudderStack recommends using this timestamp when processing data incrementally within a data warehouse.</li><li>In case of the [Google BigQuery]({{< ref "destinations/warehouse-destinations/bigquery.md" >}}) destination, RudderStack also adds the `loaded_at` field along with `uuid_ts` in the final event payload for [Segment compatibility]({{< ref "user-guides/migration-guides/segment-rudderstack-migration/" >}}). </li> | 

{{< warning >}}
**Important considerations for using timestamps in analysis**

- RudderStack does not recommend using `originalTimestamp` and `sentAt` for analysis as they both reflect client-side clock skew. Likewise, `receivedAt` does not guarantee preservation of the chronological order of events, and should not be used for analysis where chronological order is needed.
- When importing historical events, use the `timestamp` field to preserve the chronological order.
{{< /warning >}}

### SDK sources

If you do not specify the `timestamp` field in the payload for [SDK sources]({{< ref "sources/event-streams/sdks/_index.md" >}}), RudderStack calculates it based on the `originalTimestamp` and `sentAt` to account for the client clock skew.

`sentAt` > `originalTimestamp` is **always true**. However, `timestamp` can be greater or less than the `originalTimestamp`:

**Case 1**: `originalTimestamp` < `receivedAt`

When the client-side time is less than the time registered by RudderStack:

| originalTimestamp       | sentAt                  | receivedAt              | timestamp = receivedAt - (sentAt - originalTimestamp)    |
| :-----------------------| :-----------------------| :------------------| :-----------|
| 2020-04-26 07:00:43.400 | 2020-04-26 07:00:45.124 | 2020-04-26 07:00:45.558 | 2020-04-26 07:00:43.834 |

In this case, `timestamp` will be **greater** than `originalTimestamp`.

**Case 2**: `originalTimestamp` > `receivedAt`

When the client-side time is greater than the time registered by RudderStack:

| originalTimestamp       | sentAt    | receivedAt    | timestamp = receivedAt - (sentAt - originalTimestamp)    |
| :-----------------------| :----------| :-----------------------| :----------------------|
| 2020-04-26 07:00:45.558 | 2020-04-26 07:00:46.124 | 2020-04-26 07:00:43.400 | 2020-04-26 07:00:42.834 |

In this case, `timestamp` will be **less** than `originalTimestamp`.

### HTTP/Webhook-based sources

RudderStack does not consider any clock skew for HTTP/Webhook-based sources and uses the `timestamp` passed in the `timestamp` payload field. 

**Case 1**: When the client-side time is less than the time registered by RudderStack:

| originalTimestamp  | sentAt | receivedAt | timestamp = receivedAt - (sentAt - originalTimestamp)  | timestamp (payload field) |
| :-------| :-----| :-------| :-----| :-------| 
| NA | NA | 2020-04-26 07:00:49.400 | NA | 2020-04-26 07:00:46.400 |

**Case 2**: When the client-side time is greater than the time registered by RudderStack:

| originalTimestamp  | sentAt | receivedAt | timestamp = receivedAt - (sentAt - originalTimestamp)  |  timestamp (payload field) |
| :-------| :-----| :-------| :-----| :-------| 
| NA | NA | 2020-04-26 07:00:43.400 | NA | 2020-04-26 07:00:47.400 |

In the above cases, `timestamp` is the same as specified in the payload. RudderStack sets the `originalTimestamp` as the `currentTime`. You can add a [transformation]({{< ref "transformations/overview.md" >}}) to correct the clock skew.

**Case 3**: If none of the `originalTimestamp`, `sentAt`, `receivedAt`, and `timestamp` fields are passed in the payload:

| originalTimestamp  | sentAt | receivedAt | timestamp = receivedAt - (sentAt - originalTimestamp)  |  timestamp (payload field) |
| :-------| :-----| :-------| :-----| :-------| 
| Set as current time | Set as current time | current time | current time | NA |

RudderStack sets the `originalTimestamp` and `sentAt` fields to the current time and calculates `timestamp` (same as `receivedAt`/current time).

### Destinations

RudderStack gives priority to the `timestamp` field over `originalTimestamp`. Refer to the [destination documentation]({{< ref "destinations/streaming-destinations/_index.md" >}}) for more details.

## Timestamp mapping for Reverse ETL sources

When you map your warehouse columns to destination fields using [JSON mapper]({{< ref "data-pipelines/reverse-etl/developer-guides/json-data-mapping.md" >}}), RudderStack prefers the timestamp to be set in the following event traits/properties (in the exact preference order):

| Event type | JSON key for timestamp |
| :------ | :--------|
| `track` | `properties.timestamp` |
| `identify` | <ol><li>`context.timestamp`</li><li>`context.traits.timestamp`</li><li>`traits.timestamp`</li><li>`timestamp`</li><li>`originalTimestamp`</li></ol> |

{{< info >}}
Note that:
- If the timestamp is not present in any of the outermost timestamp fields, RudderStack takes the timestamp value from the [`originalTimestamp`]({{< ref "event-spec/standard-events/common-fields.md#clock-skew-considerations" >}}) field (at the outermost level in the event payload).
- RudderStack generates the root level `timestamp` field and it changes every time a full sync is triggered.
{{< /info >}}

