Cohort Retention

    Cohort retention triangles from raw events. No DAX, no period table.

    Bind an entity and an event date — that is the whole setup. The visual derives cohorts, offsets and denominators for you, and is honest about what is unobserved.

    Certified by Microsoft30-day free trial: choose Buy now on the listingHow licensing works

    Datasheet
    Status
    Available on Microsoft Marketplace
    Certification
    Microsoft Power BI certified. Exports to PowerPoint and PDF, works in email subscriptions and certified-only tenants.
    Price
    $1.99 /user/mo · $19 /user/yr
    Licensing
    Per user, assigned in the Microsoft 365 admin center, with a 30-day free trial. Unlicensed viewers see the free tier, never a blocked visual.
    Data
    Computed inside Power BI. No external calls, no API keys, no telemetry.
    Visuals API
    5.11
    Validation
    226 tests against independent pandas and scipy references
    Works in
    Power BI Desktop, Service, Embedded
    Pl. III  ·  Cohort Retention  ·  the product spotrecorded from the shipped visual
    Cohort retention triangle in Power BI derived from raw events
    Pl. III  ·  Cohort Retention  ·  The triangle, derived from two fields. Unobserved cells are hatched, never zero.rendered from the shipped visual
    What it does

    SmartVisuals Cohort Retention derives the first-event date, the cohort, the period offset and the denominator for you, and it tells you which denominator it used. The five-part DAX recipe that cohort analysis usually needs — a first-event calculated column, a cohort key, a disconnected period table, an offset measure and a future-period guard — becomes unnecessary.

    A cohort table is easy to get wrong in ways that look right. This one is built around not doing that: unobserved cells are hatched, never rendered as zero; incomplete periods are outlined and excluded from averages by default; cohorts with too few entities show their base count instead of a meaningless percentage; and the denominator is named on screen, in a status strip that survives export.

    This is the analysis teams rebuild by hand in a spreadsheet every month. One license replaces the spreadsheet.

    Search all visuals

    Free and premium

    Where the line is, exactly.

    Report authors see the full premium set in edit mode, so you can evaluate every feature on your own data before assigning a single licence. Unlicensed viewers always get a working chart.

    Free tierevery viewer
    • No DAX and no period tableBind 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 lieUnobserved 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 definitionsCohort 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 aggregationThe 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 demosCross-filtering from any cell, cohort label or period header. Full keyboard navigation with a single tab stop, high contrast support, English and Czech.
    Premium$1.99 /user/mo · first month free
    • Follow the moneyValue retention (net revenue retention), revenue per active entity, and the cumulative lifetime value curve per cohort.
    • Know when acquisition pays offType in your acquisition cost and the visual marks the period each cohort repays it.
    • Compare what mattersSegments side by side on one colour scale, with significance markers that separate a real gap from noise.
    • Judge against a standardOverlay 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 numberThe 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 dataRetention projection with a shifted-beta-geometric model for rolling and sequential retention, validated against the published Fader and Hardie reference.

    Cohort retention in Power BI without DAX

    The standard way to build a retention triangle in Power BI is a five-part DAX recipe that has been republished by different authors every year since 2020: a calculated column for each entity's first event, a cohort key, a disconnected period table built with GENERATESERIES, an offset measure combining EOMONTH and SELECTEDVALUE, and a mask for periods that have not happened yet. It works when every part is right, and every asker on the forums gets the same three parts wrong.

    SmartVisuals Cohort Retention removes the recipe. Bind an entity, such as a customer ID or a user ID, and an event date. The visual derives the first-event date, the cohort, the period offset, the denominator and the retention rate, and draws the triangle. If you still need a period table, the visual has failed at its job.

    Three retention definitions, because they are three different questions

    Classic retention counts an entity as active if it had at least one event in exactly that period; it is what e-commerce and SaaS teams usually mean. Rolling retention counts an entity as active in a period if it had an event then or in any later period; it can only go down, and it is what D7 or D30 retention means in mobile and games. Sequential retention requires activity in both the period and the one before it, which is the right frame for renewal and churn chains.

    The visual offers all three and names the active one in its subtitle, not only in the format pane, so a screenshot in a board pack carries its own definition.

    Denominators, named on screen and free forever

    Retention is active entities divided by a denominator, and the denominator is where cohort charts quietly disagree. Cohort base is the classic triangle. Previous period gives period-over-period retention. Surviving base follows the sequential rule for renewal chains, and observed base counts only entities that could still have been seen. All four are available in every tier and the chosen one is written on the chart, because both a wrong denominator and an unlabelled one produce a chart that lies.

    The observation window: where homemade cohort tables lie

    A cohort acquired four months ago has no month-twelve retention yet. A spreadsheet or a DAX matrix reports that as zero, the average for month twelve collapses, and someone concludes retention has crashed. In this visual, unobservable cells are hatched and excluded from every average and from the colour scale. Periods that have started but not finished are outlined, flagged in the tooltip and left out of averages by default. The most recent cohort, which is still recruiting, is flagged the same way.

    Cohorts with too few entities produce meaningless percentages, so a minimum base setting suppresses those cells and shows the base count instead of a rate.

    Date slicers and cohort assignment

    A visual only sees the data the page sends it. Set a date slicer to the last six months and every entity's first event within that window becomes its first event, so the triangle silently becomes something else. No visual can fix this from the inside, so this one makes it visible instead: the header states the derived cohort range, and an optional Cohort Date field lets you bind a model-computed, filter-stable first-event date that always wins.

    From counts to money

    With a value field mapped, the premium tier turns the triangle into net revenue retention, revenue per active entity and a cumulative lifetime-value curve per cohort. Type in an acquisition cost and the visual marks the period in which each cohort pays it back. Segments compare side by side on one colour scale with significance markers that separate a real gap from noise, a benchmark overlay tints every cell by its distance from your best, median or first cohort, and the age-versus-calendar panel separates a weak cohort from a bad month for everyone.

    Beyond the observed window, a shifted-beta-geometric projection, validated against the published Fader and Hardie reference, draws where rolling or sequential retention is heading. The whole engine is tested against independent pandas and scipy implementations, and the test record ships with the visual.

    Large models: pre-aggregated mode

    When the model is too large to send entity-level rows to a visual, switch to pre-aggregated mode and feed cohort-period rows with their counts instead. The triangle, curves and layer cake render the same way. Pre-aggregated rows carry no entity identities, so cells do not cross-filter, the denominator is either cohort base or previous period, and significance markers and retention projection need raw events.

    Use cases

    Where Cohort Retention earns its place.

    Monthly customer retention for a spare-parts business

    A sales operations analyst at Helios Manufacturing maps Customer ID to Entity and Order Date to Event Date, with no DAX and no period table, and keeps Cohorts > Cohort & Period Grain on Month. Periods a cohort has not reached yet are hatched rather than shown as zero, the Period Average Row sits under the triangle, and the status strip names the denominator in use. Low Base > Minimum Base (0 = Off) set to 20 shows the base count instead of a percentage for cohorts too small to trust, and Summaries > Cohort Summary Column set to Half-Life (Periods to Half) adds how many months each cohort takes to lose half its customers.

    Service contract renewals by fiscal quarter

    An aftermarket service manager maps Contract ID to Entity and Service Visit Date to Event Date, sets Cohort & Period Grain to Quarter, and sets Fiscal Year Starts In to April. Under Metric, Retention Definition set to Sequential (Unbroken Chain) counts only contracts active in every quarter since the start, and Denominator set to Surviving Base (Renewal Chain) follows the renewal-chain rule. The chosen denominator is written on the chart, so nobody compares it with a classic triangle by mistake.

    Retention page for the monthly board pack

    A finance analyst turns on Views > Retention Curves and Layer Cake (Active by Cohort over Time), sets Layout to Charts Beside the Triangle, and maps a month-end measure to As Of Date so the observation date does not move with late data. Observation Window > Ignore Last N Periods (Data Lag) set to 1 keeps the half-loaded last month out, and Status Strip > Static Mode (Export-Friendly) keeps the page clean in PDF and PowerPoint exports. If report slicers filter the order table, a model-computed first-order date in Cohort Date (Optional) keeps every customer in their real cohort.

    Net revenue retention and CAC payback (premium)

    A commercial controller adds Revenue to Value and sets Metric to Value Retention % (Premium) to see net revenue retention per cohort, which can exceed 100% when customers expand. Switching to Cumulative Value per Entity — LTV (Premium) and entering an acquisition cost in Value & Cohort Comparison > Payback Target / CAC (0 = Off) marks, in each cohort's row, the first period where cumulative value per customer reaches it. Without a licence, readers see the count-based Retention % triangle instead.

    Distributors versus direct customers (premium)

    A channel manager maps the Segment column (Distributors, Direct) to Segment, and each customer is assigned to the segment of their first order. Value & Cohort Comparison > Segment Comparison (Premium) shows Side-by-Side Boards on one color scale, or Difference Board (A − B) for exactly two segments, and Mark Significant Cohorts (Premium) at Significance Level 0.05 flags the cells that differ from the rest of their period column (pooled two-proportion z-test). Benchmark Curve (Premium) set to Median Cohort adds a dashed reference curve to the curves view.

    Getting started

    From empty canvas to first chart.

    1. 01

      Bind an entity (customer ID, account, user) and an event date. That is the whole setup.

    2. 02

      Pick a denominator and a retention definition — the active choice is always named on screen.

    3. 03

      Add a value field to unlock revenue retention, LTV curves and payback markers (premium).

    4. 04

      Model too large? Switch to pre-aggregated mode and feed cohort-period rows instead.

    Get Cohort Retention

    Two ways in.

    Installation instructions for both paths are on the download page.

    Microsoft Marketplace (recommended)

    Reviewed by Microsoft, updates automatically, licences assigned in the Microsoft 365 admin center.

    Open Microsoft Marketplace

    Direct download (1.0.2.0)

    .pbiviz package, import into Power BI Desktop or Service, does not auto-update. Includes the full free tier; premium features preview in edit mode and are licensed through Microsoft Marketplace.

    Download .pbiviz

    Sample report

    A Power BI project (.pbip, zipped) on Helios Manufacturing data, with Cohort Retention 1.0.2.0 inside. Unzip it and open the .pbip file in Power BI Desktop.

    Download sample
    Accessibility

    Readable and usable for everyone.

    Tab
    Moves focus into the triangle, which is a single tab stop per board, and then on to each line in the retention curves.
    Arrow keys
    Move one cell left, right, up or down in the triangle.
    Home / End
    Jump to the first or last period in the current cohort row.
    Page Up / Page Down
    Move up or down by as many cohorts as fit on screen.
    Enter or Space
    Cross-filters the report to the focused cell, or to the focused cohort line in the curves.
    Ctrl+Enter or Shift+Enter
    Adds the focused cell to the current selection.
    Escape
    Clears the selection.
    • Screen readers

      The triangle is exposed as a grid with row and column headers. Each cell announces its cohort, its period and its value, plus its state when it has one: low base suppressed, partial period, payback reached, projected, not observable yet or no data. The curves, layer cake and age-vs-calendar panels carry descriptive labels, and each curve line is announced with its cohort name.

    • High contrast

      When Windows high contrast is on, the visual switches to the foreground and background colours Power BI provides. The colour scale runs between those two colours and every line and marker is drawn in the foreground colour.

    • Not colour alone

      Unobserved cells are hatched, cells with no data are dotted, partial periods are outlined, projected cells are dashed and italic, payback is marked with a diamond and significance with an up or down triangle, so no state depends on colour.

    • Context menu

      Right-clicking a cell opens the Power BI context menu for that data point; right-clicking empty space opens the general menu.

    • Languages

      The format pane and the text on the visual are available in English and Czech and follow the language of Power BI.

    Release notes

    What changed, and when.

    Updates install automatically from Microsoft Marketplace. Full history.

    1. 1.0.2.0

      First release on Microsoft Marketplace.

      • Retention triangle, survival curves and an active-entity layer cake from raw events: no DAX and no period table.
      • Four denominators and three retention definitions; unobserved cells are hatched and incomplete periods marked, never drawn as zero.
      • Value retention, LTV, payback and segment comparison (premium).
    Questions

    Asked before you did.

    More questions? Write to us or search all the documentation.

    No. The visual derives the first-event date, cohort, period offset and denominator from raw events. The usual five-part DAX recipe becomes unnecessary.

    Two: Entity (customer ID, account, user) and Event Date. Optional fields are Cohort Date (a model-computed first-event date that keeps cohorts stable under date slicers), Value (revenue or usage, for the premium value metrics), Segment (premium comparison) and As Of Date (pins the observation date). For very large models there is a pre-aggregated set instead: Cohort (Pre-Aggregated), Period Index (Pre-Aggregated), Active Count (Pre-Aggregated) and, optionally, Base Count (Pre-Aggregated).

    Unobserved cells are hatched, never rendered as zero — a cohort that has not lived twelve months yet does not report 0 % at month twelve. Incomplete periods are outlined and excluded from averages by default.

    In raw-event mode the visual keeps requesting rows from Power BI in pages of 30,000 until it has the whole event table, up to 1,000,000 rows. Above that, the status strip says the data was truncated, because a partial event table would put entities in the wrong cohort. For larger models, bind a Cohort Date or switch to the pre-aggregated fields, which take up to 30,000 cohort-period rows.

    The triangle, curves and layer cake render the same way, but pre-aggregated rows carry no entity identities. Cells therefore do not cross-filter, the denominator is either cohort base or previous period, and significance markers and retention projection are not available. The status strip names the mode.

    The full free tier, always: the count-based triangle, all four denominators, all three retention definitions, all three views, every theme. Never blocked, never watermarked.

    Value retention (NRR), revenue per active entity, cumulative LTV curves, payback markers, segment comparison with significance testing, benchmarks, the age-vs-calendar panel, the insights strip and sBG retention projection.

    Projection is offered for rolling and sequential retention in raw-event mode. Classic retention can rise again when an entity comes back after a gap, so the shifted-beta-geometric model does not fit it, and the setting only appears for the other two definitions.

    English and Czech. The format pane, tooltips, status strip and labels follow the language set in Power BI.

    No. The visual requests no privileges and makes no external calls; every calculation runs inside your report. Licences are checked by Power BI itself through Microsoft's licence service for visuals, so the visual never contacts a server of its own.

    Use the Report a bug block on the support page, or email hello@smartvisuals.io. A screenshot, the visual's version and a short description of the fields you bound help us reproduce it quickly.
    Troubleshooting

    When it does not look right.

    Found a bug or missing something? Post it on the requests board or vote for what others asked; the developer answers within two business days.

    Cells show hatching instead of numbers
    That is by design: hatched cells are unobserved periods — a cohort that hasn't lived that long yet. Rendering them as 0 % would be wrong, so the visual doesn't.
    A cohort shows its base count instead of a percentage
    Low-base suppression: cohorts with too few entities show "n=…" instead of a meaningless percentage. The threshold is adjustable in the format pane.
    Numbers don't match my spreadsheet
    Check the denominator and the retention definition — the active choice is named in the status strip on the visual. Four denominators × three definitions answer different questions; your spreadsheet most likely uses "cohort base" with "classic" retention.
    A truncation warning appears
    Derive mode pages up to 1,000,000 entity-grain rows. If your model is larger, switch to pre-aggregated mode and feed cohort-period rows instead — the status strip tells you when rows were truncated.
    Fields, settings & AI agents

    What goes in, and every setting.

    The fields Cohort Retention takes, with the GUID and internal names to add it to a report via PBIR or a report-authoring agent. Full catalog (JSON)

    Visual GUID
    cohortRetention0311AB3EAC64A01680FA8115F2492694
    RoleDisplay nameKind
    entityEntityGrouping
    eventDateEvent DateGrouping
    cohortDateCohort Date (Optional)Grouping
    valueValueMeasure
    segmentSegmentGrouping
    asOfAs Of DateMeasure
    cohortKeyCohort (Pre-Aggregated)Grouping
    periodIndexPeriod Index (Pre-Aggregated)Grouping
    activeCountActive Count (Pre-Aggregated)Measure
    baseCountBase Count (Pre-Aggregated)Measure
    Missing something?

    Tell us what is missing.

    A feature you need, a bug you hit, a visual that does not exist yet. Every message reaches the person who builds these visuals, and feature requests shape what ships next. We also build visuals to order.

    Also in the family