# private_click

> Whether the browser supports WebKit's Private Click Measurement, read from a link element that is never attached to the page.

Source: https://whiskerjs.com/signals/private-click/ (last updated 2026-10-26)

**private_click at a glance (from the library code, signalsVersion 9)**

| Field | Value |
| --- | --- |
| Component name | `private_click` |
| In the visitorId | yes |
| structuredId group | [browser (engine and build)](https://whiskerjs.com/docs/identifiers/#structuredid) |
| Hashing | plain value; a digest only when longer than 128 characters or not printable ASCII |
| Excluded under | no browser class |
| Inner timeout | 1000 ms |
| Added in | [signalsVersion 2](https://whiskerjs.com/whats-new/) |

> **In plain words:**
>
> Apple’s WebKit engine has a privacy-preserving way to measure ad clicks, called Private Click Measurement. Browsers that support it give every link element an extra property. WhiskerJS checks whether that property exists on a fresh link that it never shows. It tells WebKit browsers that support the feature apart from all others.

## What it reads

The `attributionSourceId` property (or its lower-case form `attributionsourceid`) of a new `<a>` element.

## How the technique works

1. One `<a>` element is created with `document.createElement('a')`. It gets no `href` and is never attached to the document.
2. The property is read. If it is `undefined` or `null`, the value is `none`; otherwise it is the property’s value as a string (for a fresh element usually `0`).

## Why it helps

Only WebKit builds with the feature have the property, so the value splits browsers into two groups along an engine and version line. It adds little within a group but is very stable, which is why it is in the visitorId’s `browser` group.

For your server it is also a consistency check: a result that claims to be Safari (by user agent or [`vendor`](https://whiskerjs.com/signals/vendor/)) but has `none` here, or a Chromium user agent with a WebKit attribution value, deserves a closer look. Combine it with [`apple_pay`](https://whiskerjs.com/signals/apple-pay/), the other WebKit-only signal in the group.

## Stability

Very stable: it changes only if the browser adds or removes the feature in an update.

## Browser support and what blocks it

- [Safari on macOS](https://whiskerjs.com/browsers/safari-macos/) and [Safari on iOS](https://whiskerjs.com/browsers/safari-ios/): the property exists when the WebKit build has the feature. Other iOS browsers share WebKit, but whether they expose it can depend on how they embed it.
- Chromium browsers ([Chrome](https://whiskerjs.com/browsers/chrome-desktop/), [Edge](https://whiskerjs.com/browsers/edge/), [Brave](https://whiskerjs.com/browsers/brave/)) and [Firefox](https://whiskerjs.com/browsers/firefox/): `none`.

No browser class excludes it.

## Privacy

The value is a feature flag of the browser build. The element is never attached, so no click attribution data is created, read or sent.

## How WhiskerJS handles noise and failures

| Status | ruleId | When |
| --- | --- | --- |
| `ok` |   | `none` or the property value |
| `unavailable` | `no_document` | no `document` or no `createElement` |
| `blocked` | `threw`, `security_error` | creating the element throws |
| `excluded` | `caller_excluded` | you excluded it |
| `timed_out` | `timeout`, `aborted` | budget or abort |

Never hashed in practice (the value is short ASCII).

## Example value

In the container test, headless Chromium and Firefox reported `none` and headless WebKit reported `0`: the property existed on the fresh link.

## Questions and answers

### Does private_click measure clicks or ads?

No. It creates one link element without an address, reads one property and throws the element away. It never attaches it, never clicks it and never sends anything.

### Why is the value none in Chrome?

Private Click Measurement is a WebKit feature. Browsers without it have no attributionSourceId property, so the component reports none, which is an ok value.

## Related pages

- [apple_pay](https://whiskerjs.com/signals/apple-pay/): The other WebKit-only signal in the browser group.
- [Private Click Measurement](https://whiskerjs.com/glossary/#private-click-measurement): What the feature is.
- [Safari and every iOS browser](https://whiskerjs.com/browsers/safari-ios/): WebKit on iPhone and iPad.
