# Mouka MRR Dashboard
> A subscription revenue dashboard that looks like a shipped SaaS product.
**Revenue & finance · Light · Tabbed**
A subscription revenue dashboard that looks like a shipped SaaS product. If you want a reference for a polished light theme, start here.
## What makes it work
- Warm cream and coral on white, with the accent colour used sparingly so it still means something when it appears.
- A disciplined type scale: three sizes, and thin section rules instead of card borders.
- The metric tree tab shows how the headline number decomposes. That is hard to do well and rare to see.
- A cohort retention grid and a revenue movement waterfall carry the analysis using built-in charts only.
## The views
Each tab is shown below at full width.
### Overview
### Revenue Movement
### Churn and Retention
### Customers and Segments
### Metric Tree
## See it live
[Open the live dashboard](https://demo4.holistics.io/dashboards/v4/114240-mouka-mrr-dashboard?_pl=c41c810fe2c433595bca17de) to click through it yourself. No Holistics account needed.
## Theme code
The theme this dashboard actually uses, written out as a reusable `PageTheme`. Paste it into a
`.theme.aml` file under **Development > Library > Themes** to reuse it across your own dashboards,
or inline it as a single dashboard's `theme:` property. Chart colour palettes are set
[separately](/docs/admin/dashboard-themes/color-palettes), so they are not included here.
mouka_mrr_theme.theme.aml
```aml
PageTheme mouka_mrr_theme {
background {
bg_color: "#EADFD9"
}
canvas {
border {
border_color: "#E8E0D8"
border_style: "solid"
border_width {
top: 1
left: 1
right: 1
bottom: 1
}
border_radius {
top_left: 12
top_right: 12
bottom_left: 12
bottom_right: 12
}
}
shadow: "md"
opacity: 1
background {
bg_color: "#FBF9F7"
}
}
block {
text {
font_size: 20
font_color: "#4B4340"
font_style: "normal"
font_family: "Plus Jakarta Sans"
font_weight: "normal"
}
label {
font_size: 13
font_color: "#4B4340"
font_style: "normal"
font_family: "Plus Jakarta Sans"
font_weight: "semibold"
}
border {
border_style: "none"
border_width {
top: 0
left: 0
right: 0
bottom: 0
}
}
shadow: "none"
opacity: 1
padding {
top: 0
left: 0
right: 0
bottom: 0
}
background {
bg_color: "transparent"
}
}
viz {
table {
header {
bg_color: "#F2ECE4"
font_size: 16
font_color: "#4B4340"
font_weight: "bold"
}
general {
bg_color: "#FFFFFF"
font_size: 18
font_color: "#374151"
font_family: "Inter"
hover_color: "#F9F5F0"
banding_color: "#FFFFFF"
grid_color: "#F0EAE2"
border_color: "#E8E0D8"
border_width: 1
}
sub_title {
font_size: 16
font_color: "#6B7280"
font_weight: "normal"
}
sub_header {
bg_color: "#F9F5F0"
font_size: 18
font_color: "#897669"
font_weight: "normal"
}
}
}
}
```
The theme is paired with custom CSS, which lives beside it rather than inside it. See
[Custom CSS](/docs/admin/dashboard-themes/custom-css) for where it goes.
Custom CSS
```css
/* ── Fonts ──────────────────────────────────────────────────────── */
@import url('https://fonts.googleapis.com/css2?family=Merriweather:wght@400;700&family=Plus+Jakarta+Sans:wght@400;500;600;700&display=swap');
/* ── Typography hierarchy (H1 > H2 > H3 > H4 > p) ─────────────── */
.dac-text-block h1 {
font-family: 'Merriweather', Georgia, serif !important;
font-size: 48px !important;
font-weight: 700 !important;
color: #312520 !important;
line-height: 1.2 !important;
margin: 0 0 4px 0 !important;
}
.dac-text-block h2 {
font-family: 'Merriweather', sans-serif !important;
font-size: 28px !important;
font-weight: 600 !important;
color: #312520 !important;
line-height: 1.3 !important;
margin: 0 0 4px 0 !important;
}
.dac-text-block h3 {
font-family: 'Merriweather', Georgia, serif !important;
font-size: 28px !important;
font-weight: 600 !important;
color: #CCC0B2 !important;
margin: 0 0 4px 0 !important;
line-height: 1.4 !important;
text-align: left !important;
}
.dac-text-block h4 {
font-family: 'Plus Jakarta Sans', sans-serif !important;
font-size: 24px !important;
font-weight: 600 !important;
color: #312520 !important;
line-height: 1.5 !important;
margin: 0 0 2px 0 !important;
}
.dac-text-block p {
font-family: 'Plus Jakarta Sans', sans-serif !important;
font-size: 14px !important;
font-weight: 400 !important;
color: #6B7280 !important;
line-height: 1.6 !important;
margin: 0 !important;
}
/* ── Text blocks: transparent by default ────────────────────────── */
.dac-text-block {
background: transparent !important;
box-shadow: none !important;
border: none !important;
}
/* ── Viz block labels ───────────────────────────────────────────── */
.dac-viz-block-label {
font-family: 'Plus Jakarta Sans', sans-serif !important;
font-size: 24px !important;
font-weight: 600 !important;
font-style: normal !important;
line-height: 32px;
color: #312520 !important;
letter-spacing: -0.2px !important;
display: flex !important;
align-items: center !important;
padding: 24px 8px 12px 8px !important;
margin-top: 18px;
margin-bottom: 32px;
}
/* ── MetricSheet filter bar ────────────────────────────────────── */
.setting-wrapper {
font-size: 16px !important;
}
.setting-wrapper .truncate.whitespace-pre {
font-size: 16px !important;
color: #CE5531 !important;
font-weight: 600 !important;
}
.setting-wrapper .hui-select-trigger {
font-size: 16px !important;
}
/* ── FilterBlock: inline label + styled value ─────────────────── */
.dm-filter-form {
display: flex !important;
flex-direction: row !important;
align-items: center !important;
gap: 12px !important;
min-height: 48px !important;
border-color: #E8E0D8 !important;
border-radius: 8px !important;
color: #FFFFFF !important;
}
.dm-filter-form > .mb-0.5 {
margin-bottom: 0 !important;
font-size: 16px !important;
white-space: nowrap !important;
}
.dac-ic-block-label {
color: #FFFFFF !important;
font-size: 4px !important;
}
.dm-filter-form,
.dm-filter-form * {
font-size: 16px !important;
}
.dm-filter-form .h-highlightable-input {
font-size: 16px !important;
box-shadow: none !important;
}
.dm-filter-form .hui-select-trigger {
box-shadow: none !important;
}
.dm-filter-form > .flex.min-w-0.flex-1.items-center {
padding-bottom: 16px !important;
}
.dm-filter-form mark.active {
color: #766051 !important;
background-color: #F8F2ED !important;
font-size: 16px !important;
font-weight: 500 !important;
border-radius: 8px !important;
padding: 2px 6px !important;
}
/* ── Empty bg text block — hide text ─────────────────────────── */
#block-t2_empty_bg .inspecta-inspect,
#block-t2_empty_bg .text-content,
#block-t2_empty_bg .text-content * {
color: #FFFFFF !important;
}
/* ── MetricSheet top margin ──────────────────────────────────── */
#block-v_wyca .ag-root-wrapper {
margin-top: 24px !important;
}
/* ── MetricSheet metric name column ───────────────────────────── */
#block-v_wyca .ag-cell-value {
font-weight: 400 !important;
color: #2A2522 !important;
}
#block-v_wyca .text-row {
font-weight: 500 !important;
color: #766051 !important;
}
/* ── MetricSheet title ───────────────────────────────────────── */
#block-v_wyca .metric-sheet-title {
font-weight: 700 !important;
color: #423935 !important;
}
/* ── MetricSheet sparkline colors ──────────────────────────────── */
.sparkline-wrap rect {
stroke: #E1643F !important;
fill: #E1643F !important;
}
.sparkline-wrap path,
.sparkline-wrap line,
.sparkline-wrap polyline,
.sparkline-wrap circle {
stroke: #E1643F !important;
fill: none !important;
}
.sparkline-wrap svg [stroke] {
stroke: #E1643F !important;
}
.sparkline-wrap canvas {
filter: hue-rotate(200deg) saturate(1.5) !important;
}
/* ── KPI Card (MarkdownViz) ─────────────────────────────────────── */
/* [1] LABEL — "TOTAL MRR" top text */
.mrr-title {
font-family: 'Plus Jakarta Sans', sans-serif !important;
font-size: 13px !important; /* label size */
font-weight: 600 !important; /* label weight */
color: #978A81 !important; /* label color */
text-transform: uppercase !important; /* UPPERCASE style */
letter-spacing: 0.08em !important; /* letter spacing */
margin: 0 !important; /* spacing */
}
/* [2] VALUE — "65,830.37" big number */
.mrr-value {
font-family: 'Merriweather', Georgia, serif !important;
font-size: 40px !important; /* value size */
font-weight: 700 !important; /* value weight */
color: #312520 !important; /* value color */
letter-spacing: -0.5px !important; /* tighten spacing */
line-height: 1 !important; /* line height */
margin-top: 8px !important; /* spacing above value */
}
/* [3] FOOTER — row with badge + "vs last month" */
.mrr-footer {
font-family: 'Plus Jakarta Sans', sans-serif !important;
font-size: 16px !important; /* footer text size */
font-weight: 400 !important; /* footer weight */
color: #4B4340 !important; /* "vs last month" color */
margin-top: 10px !important; /* spacing above footer */
}
/* [4] BADGE — colored pill next to "vs last month" */
.mrr-badge {
display: inline-flex !important;
align-items: center !important;
gap: 4px !important;
padding: 3px 10px !important;
border-radius: 6px !important;
font-family: 'Plus Jakarta Sans', sans-serif !important;
font-size: 16px !important;
font-weight: 600 !important;
}
/* [5] SPARKLINE — SVG area chart at bottom */
.mrr-spark {
margin-top: 12px !important; /* spacing above sparkline */
display: block !important;
}
/* ── Chart VizBlock top padding (tab by tab) ────────────────── */
/* Tab 1: Overview */
#block-t1_mrr_time,
#block-t1_waterfall {
padding-top: 32px !important;
}
/* Tab 2: Revenue Movements */
#block-t2_movement,
#block-t2_new_vs_churn,
#block-t2_exp_contr {
padding-top: 32px !important;
}
/* Tab 3: Churn & Retention */
#block-t3_churn_rates,
#block-t3_cust_churn_trend,
#block-t3_nrr_trend,
#block-t3_churn_reason,
#block-t3_cohort,
#block-t3_churned_accounts {
padding-top: 32px !important;
}
/* Tab 4: Customers & Segments */
#block-t4_plan_cards,
#block-t4_mrr_industry,
#block-t4_mrr_region,
#block-t4_concentration {
padding-top: 32px !important;
}
/* Tab 5: Deep Dive */
#block-v_qao4,
#block-v_e2y6 {
padding-top: 32px !important;
}
/* ── Chart top spacing (Vega-Lite svg.marks) ─────────────────── */
svg.marks {
transform: translateY(16px) !important;
}
/* ── Canvas bg override ─────────────────────────────────────────── */
.dac-canvas {
background-color: #FBFAF8 !important;
}
/* ── MRR Movers date filter: white bg + hide link icon ────────── */
#block-f_movers_date .dm-filter-form {
background-color: #FFFFFF !important;
}
#block-f_movers_date .dac-ic-block-label {
display: none !important;
}
/* ── Info Tooltip Icons ──────────────────────────────────────── */
.info-icon-wrap {
position: relative;
display: inline-block;
line-height: 1;
}
.info-icon-wrap .info-icon-btn {
width: 18px;
height: 18px;
cursor: pointer;
opacity: 0.5;
transition: opacity 0.2s ease;
display: block;
}
.info-icon-wrap:hover .info-icon-btn {
opacity: 0.85;
}
.info-icon-wrap .info-tip {
position: absolute;
width: 280px;
background: #FFFFFF;
border: 1px solid #E8E0D8;
border-radius: 12px;
box-shadow: 0 4px 20px rgba(75, 67, 64, 0.12);
padding: 16px 20px;
opacity: 0;
visibility: hidden;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
z-index: 9999;
font-family: 'Plus Jakarta Sans', sans-serif;
}
.info-icon-wrap:hover .info-tip {
opacity: 1;
visibility: visible;
}
.info-icon-wrap .info-tip::after {
content: '';
position: absolute;
width: 0;
height: 0;
}
.info-icon-wrap .info-tip.pos-right {
top: 50%;
left: calc(100% + 10px);
transform: translateY(-50%);
}
.info-icon-wrap:hover .info-tip.pos-right {
left: calc(100% + 14px);
}
.info-icon-wrap .info-tip.pos-right::after {
top: 50%;
left: -6px;
transform: translateY(-50%);
border-top: 6px solid transparent;
border-bottom: 6px solid transparent;
border-right: 6px solid #FFFFFF;
}
.info-icon-wrap .info-tip.pos-left {
top: 50%;
right: calc(100% + 10px);
left: auto;
transform: translateY(-50%);
}
.info-icon-wrap:hover .info-tip.pos-left {
right: calc(100% + 14px);
}
.info-icon-wrap .info-tip.pos-left::after {
top: 50%;
right: -6px;
left: auto;
transform: translateY(-50%);
border-top: 6px solid transparent;
border-bottom: 6px solid transparent;
border-left: 6px solid #FFFFFF;
}
.info-icon-wrap .info-tip.pos-top {
bottom: calc(100% + 10px);
left: 50%;
transform: translateX(-50%);
}
.info-icon-wrap:hover .info-tip.pos-top {
bottom: calc(100% + 14px);
}
.info-icon-wrap .info-tip.pos-top::after {
top: 100%;
left: 50%;
transform: translateX(-50%);
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-top: 6px solid #FFFFFF;
}
.info-icon-wrap .info-tip.pos-bottom {
top: calc(100% + 10px);
left: 50%;
transform: translateX(-50%);
}
.info-icon-wrap:hover .info-tip.pos-bottom {
top: calc(100% + 14px);
}
.info-icon-wrap .info-tip.pos-bottom::after {
bottom: 100%;
left: 50%;
transform: translateX(-50%);
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid #FFFFFF;
}
.info-icon-wrap .info-tip-header {
font-size: 14px;
font-weight: 600;
color: #4B4340;
margin-bottom: 12px;
line-height: 1.3;
}
.info-icon-wrap .info-tip-section {
padding-top: 10px;
margin-top: 10px;
border-top: 1px solid #E8E0D8;
}
.info-icon-wrap .info-tip-section:first-of-type {
padding-top: 0;
margin-top: 0;
border-top: none;
}
.info-icon-wrap .info-tip-label {
font-size: 11px;
font-weight: 600;
color: #978A81;
text-transform: uppercase;
letter-spacing: 0.08em;
margin-bottom: 4px;
line-height: 1;
}
.info-icon-wrap .info-tip-body {
font-size: 13px;
font-weight: 400;
color: #374151;
line-height: 1.5;
}
.info-icon-wrap .info-tip-body code {
font-size: 12px;
background: #F9F5F0;
padding: 1px 5px;
border-radius: 4px;
color: #4B4340;
font-family: 'JetBrains Mono', monospace;
}
```