Fingerprint to BigQuery
This server flow turns raw request signals into a privacy-friendly identifier before events reach BigQuery. The Express source extracts the client IP and user agent, the fingerprint transformer hashes them into user.hash, and the GCP destination writes the events to a table. The ingest keys (ip, userAgent) must match the fingerprint fields (ingest.ip, ingest.userAgent) exactly, or the hash is computed over empty strings.
{
"version": 4,
"flows": {
"default": {
"config": {
"platform": "server",
"bundle": {
"packages": {
"@walkeros/collector": {},
"@walkeros/server-source-express": {},
"@walkeros/server-transformer-fingerprint": {},
"@walkeros/server-destination-gcp": {}
}
}
},
"sources": {
"express": {
"package": "@walkeros/server-source-express",
"config": {
"settings": { "port": 8080 },
"ingest": {
"map": {
"ip": { "key": "ip" },
"userAgent": { "key": "headers.user-agent" }
}
}
}
}
},
"transformers": {
"fingerprint": {
"package": "@walkeros/server-transformer-fingerprint",
"config": {
"settings": {
"fields": ["ingest.ip", "ingest.userAgent"],
"output": "user.hash",
"length": 16
}
}
}
},
"destinations": {
"bigquery": {
"package": "@walkeros/server-destination-gcp",
"import": "destinationBigQuery",
"config": {
"settings": {
"projectId": "my-analytics-project",
"datasetId": "events",
"tableId": "raw_events"
}
}
}
},
"collector": { "run": true }
}
}
}Run it
Save the config as flow.json and push an event through the built flow with the destination mocked. Nothing is written to BigQuery:
npx walkeros push flow.json -e '{"name":"page view"}' --simulate destination.bigqueryYou should see:
success: true
Duration: 42msWhat you get
In production every event lands as one row in your table, using the standard walkerOS schema (name, entity, action, timestamp, user, and more). The destination receives an appendRows call, and the user column carries the hash in place of a raw IP or user agent (from the package's examples):
['appendRows', [{
"name": "page view",
"entity": "page",
"action": "view",
"user": "{\"hash\":\"158f99cc06e33fd6\"}",
...
}]]Add a daily rotation field to the fingerprint fields (see the transformer page) so the hash resets each day instead of persisting indefinitely.
Next steps
- Fingerprint transformer: Rotation, IP anonymization, and hash fields
- GCP destination: BigQuery table setup and mapping