The full power of TDengine, now free forever for up to 5,000 tags.

Explore More

OPC UA Timestamps: Which Time Should Your Historian Actually Store?

Juno Qiu

October 20, 2026 /

OPC UA can attach more than one time to the same value. Those timestamps answer different questions. Choosing one without defining its meaning can reorder events, hide network delay, or place valid data outside the historian query window.

For most process analysis, use a trustworthy SourceTimestamp as the event time. Preserve a collector receipt timestamp as a separate field when the ingestion path supports it. Use server, request, or receipt time as the primary historian time only when that better matches the application or the source clock cannot be trusted.

SourceTimestamp means time at the source

The OPC UA SourceTimestamp represents the time applied to a value by its data source. The specification says it should describe the last change of the value or status and should be generated as close to the source as possible. Once assigned to that value instance, it does not change as the value passes through another OPC UA server.

This timestamp is usually the best fit for sequence-of-events work, batch analysis, and calculations that depend on when the process changed. It keeps the event on the process timeline even if the message reaches the historian late.

SourceTimestamp is not automatically accurate. A PLC, gateway, or source server may have a drifting clock, a wrong time setting, or poor synchronization with other sites. The timestamp may also be null when the source cannot provide it. Before treating source time as authoritative, compare it with a trusted clock and monitor the offset over time.

ServerTimestamp means time known by the OPC UA server

The ServerTimestamp reflects when the OPC UA server received a value or knew it to be accurate. If one OPC UA server receives values from another, each server applies its own ServerTimestamp while preserving the original SourceTimestamp.

Server time can help diagnose the segment between the source and the server. It may also be useful when the source clock is unavailable but the server clock is controlled. It is not a substitute for source time when the question is exactly when the physical process changed.

The two clocks may not be synchronized. A large difference can mean device clock drift, upstream buffering, an incorrect clock, or real transport delay. Treat the difference as a diagnostic signal, not automatically as latency.

Collection time adds another clock

Many collectors also record when they requested or received a value. These are collector timestamps, not OPC UA DataValue timestamps defined by the standard.

Receipt time answers, “When did this collector see the record?” It supports latency and backlog monitoring. Request time can identify the scheduled collection cycle that produced an observation.

Neither time proves when the process changed. If an outage delays a source event by 20 minutes, stamping it only with receipt time makes the late event look new. This can distort trends and calculations even though the database write itself is successful.

Choose the primary time from the use case

Historian usePreferred primary timeReason
Process trends and batch reconstructionSourceTimestampPreserves the source event timeline
Sequence of events across devicesSourceTimestamp, with synchronized clocksOrdering depends on comparable source clocks
Ingestion latency and pipeline monitoringReceipt timeMeasures when the collector received the record
Regular polling snapshotRequest or receipt time may fitRepresents the observation cycle when source change time is absent or stale
Source with an unreliable clockControlled server or receipt timeAvoids using a known bad source time as the index

If the system can store more than one timestamp, keep source time and receipt time. One supports process meaning; the other supports delivery diagnostics. Server time can add value when the source-to-server segment needs separate analysis.

Names such as source_ts, server_ts, and received_ts make the semantics visible to query authors. Document which field is primary and what happens when it is null or implausible.

Plan for late and out-of-order data

Store-and-forward recovery and server-side history can deliver old source events after newer ones. A historian that uses SourceTimestamp should accept that such records are late or out of arrival order.

This is expected behavior, not necessarily corrupt data. Queries should order by event time. Streaming calculations and windowed aggregates need a policy for late arrivals, such as recalculating prior windows or flagging records for reconciliation.

Also define duplicate handling because reconnect or backfill can resend a record. Point identity, event time, value, quality, and an available event identifier can help distinguish duplicates from legitimate observations.

For more on recovering and validating historical data after network interruptions, see our guide to preventing OPC UA data gaps.

Keep UTC in storage and localize at display time

OPC UA conveys time values in UTC, while the client handles conversion to local time. Keep UTC through collection and historian storage. Convert it only in dashboards, reports, or user interfaces.

Adding a fixed offset before storage creates trouble at daylight-saving transitions and when data spans sites in different zones. It can also hide a clock configuration error. Store the site time zone as metadata if operators need local views, but do not rewrite the event itself as an ambiguous local timestamp.

UTC describes the time scale, not the accuracy of each clock. Monitor clock status and source-to-receipt offset. Flag implausible timestamps rather than silently replacing them.

Mapping OPC UA time in TDengine

The current TDengine TSDB-Enterprise OPC UA connector documentation offers three timestamp choices for a point: origin_ts, request_ts, and received_ts. The selected value becomes the TDengine timestamp column. In CSV mapping, the corresponding columns are the source timestamp, the time taosX issued the request, and the time taosX received the value.

TDengine’s origin_ts is the connector’s original OPC point timestamp. The documentation does not describe request_ts or received_ts as OPC UA ServerTimestamp fields. Keep that product mapping separate from the OPC UA standard’s SourceTimestamp and ServerTimestamp terminology.

For process history in a time-series database, start with origin_ts only after confirming that the source clock is sound. Choose received_ts when ingestion chronology is the intended time axis or when source timestamps are unusable. For polled observations, request_ts may align the row with the collection cycle.

Where the mapping format allows multiple timestamp columns, retain an additional request or receipt timestamp for troubleshooting. Confirm which configured field becomes the primary timestamp, then test late records, equal timestamps, null source times, and clock drift with representative points before rollout.

A five-question timestamp review

  1. Which system owns each timestamp, and is its clock synchronized?
  2. Does the application need process time, observation time, or arrival time?
  3. What happens when source time is null, stale, or implausible?
  4. Can the historian and downstream calculations handle late records?
  5. Can an engineer compare source and receipt time during an outage investigation?

The answer should be part of the historian data contract. Timestamp choice is not a connector default to accept blindly. It determines what every trend, aggregate, and event sequence will mean.

Related Articles