---
url: https://simpledatalogs.com/docs/guide/boards.md
description: >-
  Build dashboard boards that answer feature questions — how many users, what
  share of users, of those who did A how many did B — from the events your app
  already sends.
---

# Boards

Next to an environment's **Overview** you can add up to 8 **boards**: an emoji, a name and up to 12 widgets. Click **New board**, pick a suggested board, describe one in a sentence or start blank, then **Add widget** or **Ask** for more.

**Add widget** opens on questions such as "What share of users used \_\_\_?" or "Of users who \_\_\_, how many \_\_\_?"; each fills only its blanks from the events you send. The kind tiles sit under **Custom shape**.

Every number comes from your events, never from a model. The assistant only picks widgets; you can edit anything it builds.

## Widget kinds

| Kind | Shows |
|---|---|
| Number | One value and its change: a count, active users, a sum or average, a **reach** or a **rate** |
| Line | A trend over time; up to 4 lines on one chart |
| Stacked bars | A trend split by a property or by log level |
| Top list | The busiest users, devices, days, events or property values |
| Donut | How rows, or users, split across a property's values |
| Recent rows | The newest matching rows |
| Conversion | Of users who did one thing, how many did the next |
| Retention | Of users who started (installed, signed up) in the range, the share back on day 1, 7 and 30 |

"Users" means devices: an app that sends only a device id has one user per device. Send `user_id` too and a conversion can count signed-in users instead.

## Three questions about any feature

A worked example with a real app's events, step by step, is on [Feature discovery](/guide/feature-discovery).

| Question | Widget | Example |
|---|---|---|
| Did users find it? | Number, measure **reach** | 18 % of users swiped the moon |
| How did they get there? | Donut by the event's `source`, counting users | 52 % from the menu, 41 % by shortcut |
| Did it work for them? | Number, measure **rate**, or a conversion | 31 % of feeling-good jams were quit within 5 s |

**Reach** is the users who sent the event as a share of every active user in the range. **Rate** is the share of the event's rows that also meet extra conditions. Both show the percentage, the counts behind it ("412 of 1,084 users") and the change in percentage points against the previous range.

## Conditions

Any widget can keep only rows that meet up to 3 conditions, all of which must hold:

| Op | Means | Value |
|---|---|---|
| `eq`, `neq` | is, is not | text (booleans are `"true"` and `"false"`) |
| `lt`, `lte`, `gt`, `gte` | <, ≤, >, ≥ | a number |

A value that isn't a number never passes a comparison. Any property works, even one that isn't in the breakdowns yet.

Conditions read raw events, so a long range may be refused; the card then asks for a shorter one.

::: tip Send buckets for splits
Splits only list properties with a few values:

* A property can be a split when it has at most 20 distinct values over the last 7 days. One with 21 or more (23 languages, say) is left out of the split lists, but still works in conditions.
* At most 24 event-and-property pairs are offered; the busiest pairs win.

When you want to split by a distance, a length or a long list, send a bucket (`distance_bucket: "1_12_months"`, `language_group: "devanagari"`) next to the raw value, and use the raw value in conditions.
:::

## Conversions

A conversion has 2 to 4 steps, each an event with its own optional conditions. A user counts at a step only after doing the steps before it, in order, within the window: 1 hour, 24 hours (the default) or 7 days from the first step.

Two steps show a percentage; three or four show a funnel with each step's share and the drop between steps. Conversions read raw events, so they cover at most 90 days; on Year or Lifetime they show the last 90 days and say so.

## Retention

"Do users come back after \_\_\_?" builds a retention: the start event (say `app_installed`) and what counts as coming back (any event, or one such as `app_opened`).

* The cohort is everyone whose first start event falls in the dashboard's range.
* Day N is a local day in the project's time zone: a user counts on day 7 when they sent the return event on the seventh day after their start day.
* Each day only counts users whose day N is already over, so a range of the last few days shows day 1 but not day 30 yet.
* The headline is day 7, compared with the previous range.

## Shares

"Which shares bring installs?" counts your app's shared links: shares, links opened and installs from shares, with the sharers who brought the most installs. It needs a `share_id` on the share event, the share page event and `app_installed`; see [Share links and installs](/guide/share-links).

* **The app sends on a share:** the share event, such as `app_shared`, from this environment.
* **Share page tracked in:** this environment, or another environment of the organization (your website project).
* **Share page event:** such as `share_card_view`; leave it empty to skip opens.
* **Rank:** the sharers who brought the most installs, or single shares with their sharer, opens and installs.
* The caption says how many installs were matched by IP address, and how installs changed against the previous range. Installs from shares made before the range show as **Earlier shares**.
* Shares cards read raw events, so they cover at most 90 days (the last 90 on Year or Lifetime). The assistant doesn't write them.

## The widget JSON

The builder and the assistant write the same widget JSON:

```json
{ "kind": "number", "event": "jam_stopped", "measure": "rate",
  "filters": [{ "property": "source", "op": "eq", "value": "feeling_good" }],
  "rate_filters": [{ "property": "duration_s", "op": "lt", "value": 5 }],
  "title": "Feeling-good jams quit within 5 s" }

{ "kind": "line", "series": [
    { "event": null, "measure": "unique", "title": "Active users" },
    { "event": "screenshot_taken", "measure": "count", "title": "Screenshots" } ] }

{ "kind": "conversion",
  "steps": [{ "event": "list_view_opened" }, { "event": "date_picked" }],
  "window": "1h", "by": "$device" }
```

Lines measured differently (a count beside users, or a reach beside a count) get a second axis.

## Limits

8 boards per environment, 12 widgets per board, 3 conditions per list, 4 lines per chart and 4 steps per conversion. Board numbers refresh every minute. Custom dashboards per plan are on [Limits](/reference/limits).
