# SmartVisuals Cohort Retention for Power BI

> SmartVisuals Cohort Retention builds cohort retention triangles from raw events — no DAX, no period table. Four denominators, three retention definitions, survival curves, layer cake and honest handling of unobserved periods.

- Page: https://www.smartvisuals.io/visuals/cohort-retention
- Fields and settings: https://www.smartvisuals.io/visuals/cohort-retention/settings
- Microsoft Marketplace: https://marketplace.microsoft.com/en-us/product/smartvisuals.smartvisuals-cohort?tab=overview
- Package: https://www.smartvisuals.io/downloads/smartvisuals-cohort-retention-1.0.2.0.pbiviz
- Sample report (zipped .pbip): https://www.smartvisuals.io/samples/smartvisuals-cohort-retention-sample-1.0.2.0.zip
- Price: Free tier for every viewer; premium $1.99 per user per month or $19 per user per year on Microsoft Marketplace, with a 30-day free trial. Premium works in edit mode without a licence; unlicensed viewers see the free tier, never a blocked visual.
- Certified by Microsoft: yes
- Version: 1.0.2.0
- GUID (visualType and publicCustomVisuals): `cohortRetention0311AB3EAC64A01680FA8115F2492694`

## What is free

- **No DAX and no period table**: Bind an entity and an event date, nothing else. Works on raw events, or on pre-aggregated data when the model is too large to send entity-level rows.
- **It does not lie**: Unobserved cells are hatched, never zero. Incomplete periods are marked and excluded from averages. Low-base cohorts show their base count instead of a misleading percentage.
- **Four denominators, three definitions**: Cohort base, observed base, previous period, surviving base; classic, rolling and sequential retention — with the active choice named on screen. Calendar or anniversary alignment, day to fiscal-year grain.
- **Three views of one aggregation**: The retention triangle, survival curves per cohort, and a layer cake of active entities over calendar time — the picture that answers whether growth is new business or retention.
- **Built for reports, not demos**: Cross-filtering from any cell, cohort label or period header. Full keyboard navigation with a single tab stop, high contrast support, English and Czech.

## What premium adds

- **Follow the money**: Value retention (net revenue retention), revenue per active entity, and the cumulative lifetime value curve per cohort.
- **Know when acquisition pays off**: Type in your acquisition cost and the visual marks the period each cohort repays it.
- **Compare what matters**: Segments side by side on one colour scale, with significance markers that separate a real gap from noise.
- **Judge against a standard**: Overlay your best, median or first cohort — or a target you type in — and tint every cell by its distance from the benchmark.
- **Read the cause, not just the number**: The age-vs-calendar panel separates "these cohorts are worse" from "that month was bad for everyone", and the insights strip names the best cohort, the worst, and the trend.
- **See past the edge of your data**: Retention projection with a shifted-beta-geometric model for rolling and sequential retention, validated against the published Fader and Hardie reference.

## Fields

| Field | Internal name | Takes | Needed | What it is for |
| --- | --- | --- | --- | --- |
| Entity | `entity` | Column | Optional | The thing that is retained — customer, employee, patient, account. One row per entity-event. |
| Event Date | `eventDate` | Column | Optional | The date of each event. The visual derives the first-event date, the cohort and the period offset from this — no DAX and no period table needed. |
| Cohort Date (Optional) | `cohortDate` | Column | Optional | A model-computed first-event date. Bind it when slicers filter the event table: the derived cohort would otherwise shift with the filter. When bound, it wins over the derived date. |
| Value | `value` | Measure | Optional | Revenue, usage or hours per event. Enables value retention (NRR), ARPU and the LTV curve. |
| Segment | `segment` | Column | Optional | Splits the board into compared segments. An entity belongs to the segment of its first event. |
| As Of Date | `asOf` | Measure | Optional | Pins the observation date. Without it the visual uses the latest event date in the data. |
| Cohort (Pre-Aggregated) | `cohortKey` | Column | Optional | Pre-aggregated mode: the cohort label, one row per cohort and period. |
| Period Index (Pre-Aggregated) | `periodIndex` | Column | Optional | Pre-aggregated mode: the whole-number period offset (0, 1, 2 …). |
| Active Count (Pre-Aggregated) | `activeCount` | Measure | Optional | Pre-aggregated mode: entities active in that cohort and period. |
| Base Count (Pre-Aggregated) | `baseCount` | Measure | Optional | Pre-aggregated mode: the cohort's base. Without it the base is the row at period 0. |

## Format pane

Each card is a key under `visual.objects` in a PBIR visual.json; each setting is a property of it. Toggles take `true`/`false`, choices and text a value in single quotes (`'auto'`), numbers a `D` suffix (`12D`).

### Cohorts (`cohorts`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Cohort & Period Grain | `grain` | `day` (Day), `week` (Week), `month` (Month), `quarter` (Quarter), `year` (Year) |
| Week Starts On | `weekStart` | `1` (Monday (ISO)), `0` (Sunday), `6` (Saturday) |
| Fiscal Year Starts In | `fiscalYearStart` | `1` (January), `2` (February), `3` (March), `4` (April), `5` (May), `6` (June), `7` (July), `8` (August), `9` (September), `10` (October), `11` (November), `12` (December) |
| Newest Cohort on Top | `sortNewestFirst` | On / off |
| Max Cohorts (0 = All) | `maxCohorts` | Number |

### Periods (`periods`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Period Alignment | `alignment` | `calendar` (Calendar), `anniversary` (Anniversary (From First Event)) |
| Period Direction | `direction` | `ltr` (Left to Right), `rtl` (Right to Left) |
| Collapse Later Periods Into One Column | `overflowBucket` | On / off |
| Max Periods (0 = All) | `maxPeriods` | Number |
| First Period Is | `firstPeriodLabel` | `0`, `1` |
| Show Only Periods (e.g. 0,1,7,14,30) | `periodsShown` | Text |

### Metric (`metric`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Metric | `metric` | `retentionPct` (Retention %), `activeCount` (Active Entities), `churnPct` (Churn %), `indexToFirst` (Index to First Period (100)), `valueRetentionPct` (Value Retention % (Premium)), `valuePerActive` (Value per Active Entity (Premium)), `cumulativeValuePerEntity` (Cumulative Value per Entity — LTV (Premium)) |
| Retention Definition | `retention` | `classic` (Classic (Active in Period)), `rolling` (Rolling (Active in or After Period)), `sequential` (Sequential (Unbroken Chain)) |
| Denominator | `denominator` | `cohortBase` (Cohort Base), `observedBase` (Observed Base (Elapsed Windows Only)), `previousPeriod` (Previous Period), `survivingBase` (Surviving Base (Renewal Chain)) |
| Active = Value at Least (0 = Any Event) | `activeThreshold` | Number |

### Observation Window (`window`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Ignore Last N Periods (Data Lag) | `ignoreLastPeriods` | Number |
| Unobservable Cells | `unobservableStyle` | `hatch` (Diagonal Hatch), `dim` (Dimmed Blank), `hide` (Hidden) |
| Include Partial Periods in Averages | `includePartialInAverages` | On / off |

### Low Base (`lowBase`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Minimum Base (0 = Off) | `minBase` | Number |
| Show Base Count in Suppressed Cells | `showBaseWhenSuppressed` | On / off |

### Views (`views`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Triangle | `showTriangle` | On / off |
| Retention Curves | `showCurves` | On / off |
| Layer Cake (Active by Cohort over Time) | `showLayerCake` | On / off |
| Layout | `layout` | `below` (Charts Below the Triangle), `beside` (Charts Beside the Triangle) |
| Density | `density` | `comfortable` (Comfortable), `compact` (Compact (More Rows per Tile)) |

### Colors (`colors`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Color Scale Normalization | `normalization` | `global` (Whole Board), `column` (Per Period Column), `row` (Per Cohort Row) |
| Low Color (empty = theme) | `minColor` | Colour |
| High Color (empty = theme) | `maxColor` | Colour |
| Reverse Scale | `reverse` | On / off |
| Scale Midpoint (0 = Automatic) | `midpoint` | Number |
| Color Legend | `showLegend` | On / off |
| Discrete Steps (0 = Continuous) | `discreteSteps` | Number |
| Below Benchmark (empty = theme) | `belowColor` | Colour |
| Above Benchmark (empty = theme) | `aboveColor` | Colour |

### Cells (`cells`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Show Values (Off = Heat Only) | `showValues` | On / off |
| Decimals | `decimals` | Number |
| Show Δ Under Each Value | `deltaVsAverage` | On / off |
| Δ Measured Against | `deltaTarget` | `average` (Period Average), `benchmark` (Benchmark Curve) |
| Font | `fontFamily` | `inter` (Inter), `segoe` (Segoe UI), `arial` (Arial), `georgia` (Georgia) |
| Font Size | `fontSize` | Number |

### Summaries (`summaries`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Cohort Size Column | `showSizeColumn` | On / off |
| Size Column Bar | `sizeBar` | On / off |
| Curve Sparkline per Cohort | `showSparkline` | On / off |
| Period Average Row | `showPeriodAverage` | On / off |
| Cohort Average Column | `showCohortAverage` | On / off |
| Cohort Summary Column | `rowStat` | `none` (None), `halfLife` (Half-Life (Periods to Half)), `auc` (Retained Periods per Entity (Area)) |
| Weight Averages by Base | `weightedAverages` | On / off |

### Status Strip (`statusStrip`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Show Status Strip | `show` | On / off |
| Static Mode (Export-Friendly) | `staticExport` | On / off |

### Value & Cohort Comparison (`analytics`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Benchmark Curve (Premium) | `benchmarkSource` | `none` (None), `best` (Best Cohort), `median` (Median Cohort), `first` (First Cohort), `manual` (Typed Below) |
| Benchmark Values (e.g. 100, 45, 38, 33) | `benchmarkList` | Text |
| Color Cells by Variance vs Benchmark | `benchmarkTint` | On / off |
| Age vs Calendar Panel (Premium) | `showCalendarEffect` | On / off |
| Payback Target / CAC (0 = Off) | `paybackTarget` | Number |
| Segment Comparison (Premium) | `segmentLayout` | `boards` (Side-by-Side Boards), `difference` (Difference Board (A − B)) |
| Mark Significant Cohorts (Premium) | `showSignificance` | On / off |
| Significance Level | `alpha` | Number |
| Insights Strip (Premium) | `showInsights` | On / off |
| Project Future Periods (Premium) | `showProjection` | On / off |
| Project Up To Period | `projectionHorizon` | Number |

### Text Sizes (`text`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Header Font Size (0 = Match Cells) | `headerFontSize` | Number |
| Header Color (empty = theme) | `headerColor` | Colour |
| Segment Title Font Size | `boardTitleFontSize` | Number |
| Status Strip Font Size | `statusFontSize` | Number |
| Insights Font Size | `insightsFontSize` | Number |
| Chart Title Font Size | `chartFontSize` | Number |

### Theme (`theme`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Theme | `selectedTheme` | `smartvisuals` (SmartVisuals), `dark` (Dark), `clean` (Clean (White)), `slate` (Slate) |
| Background Color (empty = theme) | `bgColor` | Colour |
| Transparent Background | `transparentBg` | On / off |
