Click Tracking
Generates: Events (Log Records)
Captures every tap on View and Compose elements, including dead clicks (taps that hit nothing) and rage clicks (rapid repeated taps in the same area).
Setup
Click instrumentations is enabled and configured from the Pulse dashboard — it cannot be enabled from initialize(). The remote config controls:
| Setting | Description |
|---|---|
captureContext | Whether to extract a human-readable label (app.click.context) from the tapped element |
| Rage click — time window | Duration (ms) in which repeated taps are grouped into a rage cluster |
| Rage click — threshold | Minimum number of taps to qualify as a rage click |
| Rage click — radius | Area (dp) within which taps are considered the same target |
What Gets Tracked
| Attribute | Description | Always Present |
|---|---|---|
app.screen.coordinate.x/y | Tap pixel coordinates | ✅ |
app.screen.coordinate.nx/ny | Normalized coordinates (0–1) | ✅ |
app.widget.name | View class name or Compose test tag | ✅ |
app.widget.id | View resource ID or Compose element ID | ⚠️ If available |
app.click.context | Human-readable label | ⚠️ If captureContext enabled |
app.click.type | GOOD (hit target) or DEAD (hit empty space) | ✅ |
app.click.is_rage | true if part of a rage cluster | ✅ |
app.click.rage_count | Number of taps in the rage cluster | ⚠️ If rage |
device.screen.width/height | Viewport dimensions | ✅ |
Click Types
| Type | Description |
|---|---|
GOOD | Tap successfully hit an interactive element |
DEAD | Tap landed on empty space with no target |
| Rage | Rapid repeated taps in the same area — indicates frustration |
Improving Label Quality
app.click.context is populated when the SDK can extract a human-readable label from the tapped element. Without labels, you only get coordinates and widget IDs.
View-based UI
- TextView — label is read from
textautomatically. - Buttons / other views — set
android:contentDescription:
<Button
android:id="@+id/add_btn"
android:contentDescription="Add to Cart"
... />
Or in code:
view.contentDescription = "Add to Cart"
Jetpack Compose
Material3 composables often store text in child nodes. Add semantics explicitly for reliable labels:
Button(
onClick = { ... },
modifier = Modifier.semantics { contentDescription = "Add to Cart" },
) {
Text("Add to Cart")
}