# Privacy thresholds

PlayerPal analytics never let a partner single out a player or a competitor.
Small groups are hidden, comparisons need enough independent peers, and no
average is published when one partner would dominate it. When a rule hides a
value, the response says so explicitly instead of returning a misleading zero.

[Available]

Watch first. This shows the thresholds below and why each one exists.

<Explainer id="thresholds" />

## Why these rules exist

- **Small groups identify people.** A figure about three players can reveal
  what one of them did. The account floor hides any figure built on too few
  accounts.
- **Thin networks identify competitors.** If a market has two operators,
  "the network minus you" is the other operator. The peer floor requires
  several independent partners.
- **Averages can belong to one partner.** If one operator holds most of a
  market, the market average is in effect that operator's figure. The
  dominance rule suppresses it.
- **Overlapping ranges can be subtracted.** Comparisons use fixed, closed
  periods only, so two requests cannot be differenced to isolate a peer.

## The thresholds

| Rule | Default | Applies to |
|---|---|---|
| Account floor | At least 50 distinct accounts | Own KPIs about players, overview, comparisons, benchmarks |
| Peer floor (comparison) | At least 5 other partners of your type in the rest of the network | Network comparison |
| Peer minimum (benchmark) | At least 6 partners in the peer group: you plus at least 5 others | Benchmarks |
| Dominance | Suppress if one partner holds more than 50% of the measure | Network comparison, benchmarks |
| Dominance, top two | Suppress if the top two partners together hold more than 75% | Network comparison, benchmarks |

These are the defaults. PlayerPal does not run production below these values.

## Own KPIs and the overview

[Available]

The account floor applies to every own KPI that describes players (marked
"Floor: yes" in the [metric dictionary](./metrics.mdx)). KPIs about your own
operations, such as new links or ingest acceptance, have no floor.

- **Each period is tested on its own.** If between 1 and 49 distinct accounts
  are behind a period, that period's value is replaced with a suppressed
  marker. A period with no accounts at all is shown as zero, not suppressed.
- **Totals and previous periods are tested too.** If either total is
  suppressed, the percentage change is empty.
- **Breakdowns drop small rows.** A market, game or counterpart under the
  floor is left out and counted in `suppressed_rows`. It is never folded into
  "Other", so it cannot be recovered by subtraction.
- **The overview** marks every KPI `suppressed` when fewer than 50 players
  were active in the range. Markets under the floor are grouped into "Other",
  and cohorts under the floor are returned without values.
- **Filters** only offer games, markets and counterparts with at least 50
  players.

A suppressed period in an own-KPI series:

```json
{ "period": "2026-09-07", "value": null, "suppressed": true }
```

## Network comparison

[Available]

A comparison is published only when the **rest of the network** (players of
other partners of your type) passes the peer floor, the account floor and the
dominance rule. Your own side must also have at least 50 accounts; if it does
not, the network figures are still shown but your value is withheld.

For cross-partner KPIs (multi-homing, overlap, share of wallet), your own value
describes your players' activity with other partners. It is shown only when
that activity spans at least 5 other partners and is not dominated by one or
two of them.

If a market slice fails a rule, PlayerPal returns the global figure for the
same period and marks it with `"fallback": "global"`. If the global figure
also fails, the network side is suppressed with a reason. Your own value can
still appear when it passes the account floor, because it describes only your
players:

```json
{
  "kpi": "cmp.bet_per_player", "period": "2026-09", "grain": "month",
  "market": null, "fallback": null,
  "you": 45, "network": null, "index": null, "band": null,
  "suppressed": true, "reason": "peer_floor"
}
```

| `reason` | Meaning |
|---|---|
| `peer_floor` | The rest of the network spans fewer than 5 partners of your type |
| `account_floor` | The rest of the network has fewer than 50 accounts |
| `dominance` | One partner holds more than 50% of the measure, or two hold more than 75% |
| `y_floor` | Your own players number fewer than 50; the network is still shown |
| `elsewhere_floor` | Cross-partner KPI: your players' activity elsewhere is too concentrated or too thin |
| `not_computed` | No figures exist for that period yet |

## Benchmarks

[Available]

A benchmark segment is published only when at least 6 partners of your type
are in it, at least 50 accounts are behind it, and no partner dominates it. A
thin market segment falls back to global in the same way as comparisons. When
nothing can be published, `peers` and `band` are `null`, `suppressed` is
`true` and `reason` names the rule.

## What is never published

Even when a segment passes every rule, partners never receive:

- a minimum, a maximum or an exact rank;
- any single partner's value, name or ID;
- an exact network size. Sizes and peer counts are given only as bands:
  `5-9`, `10-24`, `25-99`, `100-999`, `1k-99k` or `100k+`.

Published statistics are limited to p25, p50, p75, the mean and the quartile
band your value falls in.

## Staff access

PlayerPal staff can view a partner's own KPIs without the account floor, for
support. Every such access is recorded with the staff member as the actor.

## Related

  - [Metric dictionary](./metrics.mdx): 
    Which KPIs carry the account floor.
  
  - [Partner analytics](./overview.mdx): 
    Visibility tiers and where to get your figures.
  
  - [Privacy](../trust/privacy.mdx): 
    How PlayerPal works without player personal data.
