Skip to main content

Fingerprint

Server Source code Package

Hashes configurable request fields (IP address, user agent, date, etc.) into a deterministic identifier and stores it on the event. No cookies, no PII stored — the same combination of inputs always produces the same hash.

When to use

Server-side tracking without cookies requires a way to consistently identify a user across requests. The fingerprint transformer creates that identifier from data already available in the request context: IP address, user agent string, and optionally a daily rotation to limit persistence.

Typical use cases:

  • Session continuity: Generate a consistent user.hash across requests from the same client without relying on client-side IDs
  • Cookie-free analytics: Identify returning visitors server-side when no consent has been given for cookies
  • Cross-domain stitching: Combine fields that are consistent across domains into a shared identity signal

Setup

Install the package:

Loading...

Configure in your flow:

Loading...

Configuration

SettingTypeDefaultDescription
fieldsMapping.Value[]requiredFields to include in the hash. Order matters — the same fields in a different order produce a different hash.
outputstring"user.hash"Dot-notation path where the hash is stored on the event.
lengthnumberfull (64 chars)Truncate the SHA-256 hash to this length.

Fields are resolved from { event, ingest } using walkerOS mapping. String values use dot notation ("ingest.ip"). Function values compute dynamically ({ fn: () => new Date().getDate() }).

Daily rotation

Without rotation, the same IP + user agent always produce the same hash — indefinitely. To limit persistence, add a daily rotation field:

Loading...

The hash resets each day, limiting cross-day tracking while maintaining session continuity within a day.

IP anonymization

To avoid including the raw IP in the hash input, transform it before hashing:

Loading...

Result

The hash is stored at the configured output path on the event:

Loading...

If any field is missing (e.g., ingest.ip is undefined), it is treated as an empty string — the transformer never throws.

💡 Need implementation support?
elbwalker offers hands-on support: setup review, measurement planning, destination mapping, and live troubleshooting. Book a 2-hour session (€399)