Adds a skill for authoring Tableau Next semantic models (SDMs) on Data 360: build from scratch, add data objects, define joins, enrich with calculated fields and metrics, and make models AI-ready. Smoke-tested against a live Data 360 org: SDM discovery, AI-readiness flip, dimension creation, metric creation, and description backfill all exercised end-to-end.
23 KiB
KPI Formulas & Aggregation Patterns
Business-logic reference for building calculated fields (_clc) and metrics (_mtc) on a Tableau Next semantic model. Provides lookup tables for custom aggregations, composite KPI formulas, and color semantics observed across finance, banking, sales, HR, retail, marketing, procurement, supply-chain, travel, and executive dashboards.
Table of Contents
- Time-Based Aggregation Patterns
- Composite KPI Patterns
- Color Coding Guide
- Palette Usage by Metric Type
- Metric Clarifications
- Industry-Specific KPI Patterns
Time-Based Aggregation Patterns
Native Tableau formulas for time-based business calculations. Replace [Date], [Measure], [Dimension] placeholders with actual field names from your semantic model.
Snapshot & Position Aggregations
| Pattern | Tableau Formula | Business Use Case |
|---|---|---|
| Sum of (last period only) | SUM(IF [Date] = { INCLUDE : MAX([Date]) } THEN [Measure] ELSE NULL END) |
Balance sheets, headcount snapshots, portfolio positions, inventory levels |
| Sum of (first period only) | SUM(IF [Date] = { INCLUDE : MIN([Date]) } THEN [Measure] ELSE NULL END) |
Initial investment positions, opening balances |
| Average of (last period only) | AVG(IF [Date] = { INCLUDE : MAX([Date]) } THEN [Measure] ELSE NULL END) |
Staff demographics at period end, current average values |
| Median of (last period only) | MEDIAN(IF [Date] = { INCLUDE : MAX([Date]) } THEN [Measure] ELSE NULL END) |
Central tendency for period-end snapshots |
| Count Distinct of (last period only) | COUNTD(IF [Date] = { INCLUDE : MAX([Date]) } THEN [Dimension] ELSE NULL END) |
Ending counts of unique items (Active Customers EOP, Open Positions) |
When to use: For metrics that represent a state at a specific point in time rather than cumulative totals. Q1 value = last known value in Q1.
Time-Scaled Aggregations
| Pattern | Tableau Formula | Business Use Case |
|---|---|---|
| Sum of (annualized) | SUM([Measure]) * (12 / COUNTD(DATEPART('month', [Date]))) |
Revenue projections; 1 month × 12, 2 months × 6, 3 months × 4 |
| Sum of (monthly average) | SUM([Measure]) / COUNTD(DATEPART('year', [Date]) + DATEPART('month', [Date])) |
Avg Monthly Inventory, Avg Monthly Assets |
Annualization logic: Extrapolate partial-period values to full year.
Period Range Aggregations
| Pattern | Tableau Formula | Business Use Case |
|---|---|---|
| Sum of (from to) | SUM(IF [Date] >= [FromDate] AND [Date] <= [ToDate] THEN [Measure] END) |
Total Sales During Contract, Revenue in Date Range |
| Average of (from to) | AVG(IF [Date] >= [FromDate] AND [Date] <= [ToDate] THEN [Measure] END) |
Avg Deal Size During Q1-Q3 |
| Min/Max/Median (from to) | Same pattern with MIN, MAX, MEDIAN | Lowest inventory, peak revenue, median ticket |
| Count Distinct (from to) | COUNTD(IF [Date] >= [FromDate] AND [Date] <= [ToDate] THEN [Dimension] END) |
Unique Customers Between Launch-EOY |
When to use: For metrics that need to aggregate data only within a specific date range.
Lifecycle & Cohort Aggregations
| Pattern | Tableau Formula | Business Use Case |
|---|---|---|
| Count Distinct of New | COUNTD(IF [Date] = { FIXED [Dimension] : MIN([Date]) } THEN [Dimension] END) |
New Customers, New Products, New Hires |
| Count Distinct of Ending | COUNTD(IF [Date] = { FIXED [Dimension] : MAX([Date]) } THEN [Dimension] END) |
Lost Customers, Discontinued Products |
| Sum of (for New) | SUM(IF [Date] = { FIXED [Dimension] : MIN([Date]) } THEN [Measure] END) |
Revenue from New Customers only |
| Avg Lifetime of | DATEDIFF('day', { FIXED [Dimension] : MIN([Date]) }, { INCLUDE [Dimension] : MAX([Date]) }) / 365 |
Customer tenure (years), Product lifetime, Employee tenure |
When to use: For cohort analysis, churn tracking, and new/lost item identification.
Time Interval Calculations
| Pattern | Tableau Formula | Business Use Case |
|---|---|---|
| Avg Years between | DATEDIFF('day', [StartDate], [EndDate]) / 365 |
Avg Years to Maturity, Avg Investment Horizon |
| Avg Months between | DATEDIFF('day', [StartDate], [EndDate]) / 365 * 12 |
Avg Months to Close, Loan Duration |
| Avg Days between | DATEDIFF('minute', [StartDate], [EndDate]) / (24 * 60) |
Days to Close, Days Between Booking-Travel |
| Avg Hours between | DATEDIFF('minute', [StartDate], [EndDate]) / 60 |
Avg Response Time |
| Avg Minutes between | DATEDIFF('minute', [StartDate], [EndDate]) |
Avg Call Duration |
| Avg Seconds between | DATEDIFF('second', [StartDate], [EndDate]) |
Avg Page Load Time |
Composite KPI Patterns
Real-world KPI formulas from production dashboards (finance, banking, sales).
Financial Statement Patterns
Income Statement (Profit & Loss)
| Pattern | Formula | Example |
|---|---|---|
| Gross Profit | Revenues - Cost of Revenues | KPI1 - KPI2 where KPI1=Total Revenues, KPI2=COGS |
| Gross Margin % | Gross Profit / Revenues | (Revenues - COGS) / Revenues |
| Operating Income | Gross Profit - (OpEx + Depreciation) | KPI2 - (KPI4 + KPI12) |
| Operating Income % | Operating Income / Revenues | Operating Income / Total Revenues |
| Net Income | Operating Income - (Interests + Taxes) | KPI13 - KPI15 |
Tableau Implementation:
<kpi-simple name='KPI1' aggregation='SUM' canonical-attribute='IF STARTSWITH(UPPER(Dim2),"REVENUES") THEN Value END' />
<kpi-simple name='KPI11' aggregation='SUM' canonical-attribute='IF STARTSWITH(UPPER(Dim2),"COST OF REVENUES") THEN Value END' />
<kpi-composite name='KPI2' caption='Gross Profit' kpi1-name='KPI1' calculation='-' kpi2-name='KPI11' />
Balance Sheet
| Pattern | Formula | Example |
|---|---|---|
| Working Capital | Current Assets - Current Liabilities | KPI17 - KPI18 using snapshot aggregation |
| Total Assets | Current Assets + Non-Current Assets | Sum all asset categories with snapshot aggregation |
| Total Equity | Total Assets - Total Liabilities | KPI21 - KPI22 |
| Current Ratio | Current Assets / Current Liabilities | KPI17 / KPI18 |
| Quick Ratio | (Cash + AR) / Current Liabilities | KPI24 / KPI18 |
| Debt to Equity | Total Liabilities / Total Equity | KPI22 / KPI7 |
Critical: Use snapshot aggregation (SUM(IF [Date] = MAX([Date]) THEN ... END)) for balance sheet accounts.
Banking & Wealth Management Patterns
Assets under Management (AuM)
| Pattern | Formula | Business Meaning |
|---|---|---|
| Net New Money (NNM) | Inflows - Outflows | zn(Inflows) + zn(Outflows) (Outflows are negative) |
| AuM Balance | Last period AuM (snapshot) | Use snapshot aggregation: SUM(IF [Date] = { INCLUDE : MAX([Date]) } THEN [AuM] END) |
| AuM per Client | Total AuM / Nb of Clients | KPI3 / KPI6 |
| Return on Assets % | Annualized Income / Avg Monthly AuM | SUM(Income)*12/COUNTD(Month) / (SUM(AuM)/COUNTD(Month)) |
| New Clients | Count new occurrences | COUNTD(IF [Date] = { FIXED [Client] : MIN([Date]) } THEN [Client] END) |
| Lost Clients | Count ending occurrences | COUNTD(IF [Date] = { FIXED [Client] : MAX([Date]) } THEN [Client] END) |
| Client Asset & Liabilities (CAL) | AuM + Lending Stock | KPI3 + KPI17 |
| Net New Lending (NNL) | Lending Inflows + Lending Outflows | KPI21 + KPI23 |
Lending & Loans
| Pattern | Formula | Business Meaning |
|---|---|---|
| Total Revenue | Interests + Fees | KPI2 + KPI4 (monthly totals) |
| Revenue Rate % | (Interests + Fees) / Loan Amortization | KPI11 / KPI3 |
| Delinquent Loans Rate % | Delinquent Count / Total Active Loans | KPI14 / KPI5 |
| Default Rate % | Defaulted Count / Total Active Loans | KPI15 / KPI5 |
| Client Liabilities (EOP) | Outstanding balance at period end | SUM(IF [Date] = { INCLUDE : MAX([Date]) } THEN [ClientLiabilities] END) |
Sales & Travel Patterns
| Pattern | Formula | Example |
|---|---|---|
| Average Spend per Customer | Total Amount / Count Distinct Customers | KPI1 / KPI7 |
| Share of Metric | AVG(IF condition THEN 1 ELSE 0 END) | AVG(if upper(Dim11)="Y" then 1 else 0 end) for "% Online" |
| Over-pricing % | (Actual - Lowest) / Lowest | (TicketAmount - LowestFare) / LowestFare |
| Days Between Events | DATEDIFF('minute', [Date1], [Date2]) / (24 * 60) |
Days between booking and travel |
| Tickets per Traveler | Total Tickets / Distinct Travelers | KPI5 / KPI7 |
Supply Chain Patterns
| Pattern | Formula | Business Meaning |
|---|---|---|
| Product Demand Index | Integer scale 1-5 (Low to High) | Direct measure, no calculation |
| Logistics Reliability | Integer scale 1-5 | Direct measure, use MEDIAN or AVG |
| Inflation Impact | Integer scale 1-5 | Direct measure for risk scoring |
Usage Notes
Aggregation Selection Criteria
- Snapshot metrics (balance sheet, headcount, inventory): Use
SUM(IF [Date] = MAX([Date]) THEN ... END) - Flow metrics (revenue, expenses, transactions): Use standard
SUM,AVG,COUNT - New/lost tracking: Use
COUNTD(IF [Date] = { FIXED [Dim] : MIN/MAX([Date]) } THEN [Dim] END) - Time-between calculations: Use
DATEDIFF('day', [Start], [End])with appropriate unit - Annualized projections: Use
SUM([Measure]) * (12 / COUNTD(Month)) - Period-constrained aggregations: Use
SUM(IF [Date] >= [From] AND [Date] <= [To] THEN ... END)
Cross-References
- See metric-design.md for Tableau Next semantic metric patterns
- See field-types.md for calculated measurement vs dimension guidance
- See tableau-functions.md for Tableau expression functions
Metric Clarifications
Before implementing a KPI, determine which variant matches the business question. Many pattern names suggest lifetime or strategic metrics, but the formula may be period-specific.
Period vs Lifetime Metrics
| Type | When to Use | Formula Pattern | Example |
|---|---|---|---|
| Period | "Revenue per customer this month" | SUM(Measure) / COUNTD(Dimension) |
Total Sales / Active Customers |
| Lifetime | "Total value of a customer over their entire relationship" | { FIXED [Dimension]: SUM(Measure) } |
{ FIXED [Customer]: SUM([Revenue]) } |
Rule: If the metric name includes "Lifetime," "LTV," "CLV," or "Total Value," use an LOD expression to aggregate at the entity level first, then average or sum as needed.
Simple vs Fully-Loaded Costs
| Type | When to Use | Example |
|---|---|---|
| Simple | Quick operational view | CAC = Marketing Spend / New Customers |
| Fully-Loaded | Strategic investment decisions | CAC = (Marketing + Sales salaries + Overhead + Tools) / New Customers |
Rule: Document which cost components are included. "CAC" without qualification typically means marketing-only; "fully-loaded CAC" includes sales and overhead.
Snapshot vs Flow Metrics
| Type | When to Use | Aggregation | Example |
|---|---|---|---|
| Snapshot | State at a point in time | SUM(IF [Date] = MAX([Date]) THEN ... END) |
MRR, Headcount (EOP), Inventory |
| Flow | Activity over a period | SUM, COUNT |
Revenue, Orders, New Customers |
Rule: Use snapshot aggregation for balance-sheet style metrics; use SUM/COUNT for income-statement style metrics.
Attribution Models
For marketing metrics (ROAS, CPA, Conversion Rate), clarify:
- Total: All revenue in period ÷ ad spend (simple, may over-attribute)
- Attributed: Revenue/conversions filtered to ad-sourced customers only (requires attribution dimension)
Industry-Specific KPI Patterns
Business formulas extracted from 61 production dashboard templates across multiple industries.
Sales & E-Commerce
Customer Lifetime Value (CLV) Patterns
Real CLV answers: "How much total revenue will this customer generate over their entire relationship?" Use these patterns when the user asks for CLV, LTV, or Customer Lifetime Value.
| Pattern | Formula | Business Use Case |
|---|---|---|
| CLV per Customer | { FIXED [Customer]: SUM([Revenue]) } |
Total revenue per customer over entire history |
| Average CLV | AVG([CLV per Customer]) |
Portfolio average lifetime value |
| Predictive CLV | AOV × Purchase Frequency × Customer Lifespan | Forward-looking estimate; use DATEDIFF('day', { FIXED [Customer] : MIN([Date]) }, { INCLUDE [Customer] : MAX([Date]) }) / 365 for lifespan |
| Cohort CLV | SUM([CLV per Customer]) where Customer in cohort |
Total value of a cohort |
When to use each: CLV per Customer is the base calc field; Average CLV for KPI cards; Predictive CLV when you need forward-looking estimates without full history.
Period Metrics (not lifetime):
| Pattern | Formula | Business Use Case |
|---|---|---|
| Sales per Customer | Total Sales / Active Customers | KPI1 / KPI2 - Average customer spend in period; for lifetime value, see CLV patterns above |
| New Customers | COUNTD(IF [Date] = { FIXED [Customer] : MIN([Date]) } THEN [Customer] END) |
Count first-time customers in period |
| Sales Margin % | Total Margin / Total Sales | KPI4 / KPI1 - Profitability percentage |
| Sales Costs % | (Sales - Margin) / Sales | KPI9 / KPI1 - Cost ratio |
| Average Selling Price | Total Sales / Total Quantity | KPI1 / KPI5 - Price per unit |
| Gross Discount % | (Volume at List Price - Sales Incl VAT) / Volume at List Price | Discount effectiveness |
| Net Discount % | (Volume at List Price - Sales Excl VAT) / Volume at List Price | After-tax discount |
| VAT Amount | Sales Incl VAT - Sales Excl VAT | Tax calculation |
E-Commerce Specific:
| Pattern | Formula | Business Use Case |
|---|---|---|
| Customer Acquisition Cost (CAC) | Marketing Costs / New Customers | SUM(IF [Date] = { FIXED [Customer] : MIN([Date]) } THEN [MarketingCosts] END) / COUNTD(IF [Date] = { FIXED [Customer] : MIN([Date]) } THEN [Customer] END) |
| CLV/CAC Ratio | Average CLV / CAC | Profitability of acquisition; CLV = { FIXED [Customer]: SUM([Revenue]) } averaged (see CLV patterns above) |
| Conversion Rate | Orders / Visits | Visitor-to-customer conversion |
| Average Order Value (AOV) | Total Revenue / Number of Orders | Revenue per transaction |
| Cart Abandonment % | (Carts Created - Orders) / Carts Created | Lost sales opportunity |
Recurring Revenue (SaaS/Subscription)
| Pattern | Formula | Business Use Case |
|---|---|---|
| MRR (Monthly Recurring Revenue) | SUM(IF [Date] = { INCLUDE : MAX([Date]) } THEN [MonthlyRecurringRevenue] END) |
Snapshot at period end |
| ARR (Annual Recurring Revenue) | SUM(IF [Date] = { INCLUDE : MAX([Date]) } THEN 12 * [MonthlyRecurringRevenue] END) |
Annualized recurring revenue |
| Total Revenue | SUM(ZN(OneTimeFee) + ZN(MonthlyRecurringRevenue)) | Recurring + one-time fees |
| Recurring Revenue % | Period Recurring Revenue / Total Revenue | KPI5 / KPI1 - Subscription mix |
| Contract Duration (months) | DATEDIFF('day', [StartDate], [EndDate]) / 365 * 12 |
Average contract length |
| Revenue per Account | Total Revenue / Active Accounts | KPI1 / KPI2 - Period metric; for account lifetime value, use { FIXED [Account]: SUM([Revenue]) } |
| New Active Accounts | COUNTD(IF [Date] = { FIXED [Account] : MIN([Date]) } THEN [Account] END) |
First-time contracts |
Key Insight: Use snapshot aggregation for MRR/ARR (last period value), not SUM.
Retail & Inventory
| Pattern | Formula | Business Use Case |
|---|---|---|
| Sales per Store | Total Sales / Active Stores | KPI1 / KPI7 - Store productivity |
| Distinct Products Sold | COUNTD(Product) | Catalog depth |
| Average Inventory Value | SUM(On-Hand Amount) / COUNTD(Date) | Average inventory holding |
| Total On-Hand Inventory | SUM(IF [Date] = { INCLUDE : MAX([Date]) } THEN [OnHandAmount] END) |
Snapshot inventory value |
| Inventory Turnover | (Days in Year × Total Sales) / Total On-Hand Inventory | (DAYSinYEAR * KPI1) / KPI101 - Turns per year; higher = faster sell-through |
| Days Sales of Inventory (DSI) | Total On-Hand Inventory / (Total Sales / 365) | Days to sell current inventory; use Inventory / Daily Sales for correct time dimension |
| Average Selling Price | Total Sales / Total Sales Units | KPI1 / KPI50 - Price per unit |
| Out-of-Stock Positions | SUM(IF On-Hand Units = 0 THEN 1 END) | Count of stockouts |
| Out-of-Stocks % | Out-of-Stock Positions / Inventory Positions | KPI13 / KPI14 - Stockout rate |
Procurement & Supply Chain
| Pattern | Formula | Business Use Case |
|---|---|---|
| Spend per Vendor | Total Spend / Active Vendors | KPI1 / KPI2 - Vendor concentration |
| New Vendor # | COUNTD(IF [Date] = { FIXED [Vendor] : MIN([Date]) } THEN [Vendor] END) |
First-time suppliers |
| Average Buying Price | Purchasing Volume / Total Purchase Quantity | KPI1 / KPI5 - Unit cost |
| Spend Under Management (SuM) | SUM(IF [Date] >= [StartDate] AND [Date] <= [EndDate] THEN [Amount] END) |
Contracted spend in period |
| Ongoing Contracts | COUNTD(IF [Date] >= [StartDate] AND [Date] <= [EndDate] THEN [Contract] END) |
Active contracts during period |
| Active Suppliers | COUNTD(IF [Date] >= [StartDate] AND [Date] <= [EndDate] THEN [Supplier] END) |
Suppliers with active contracts |
| Avg Contract Size | Spend Under Management / Ongoing Contracts | KPI1 / KPI2 - Contract value |
Digital Marketing & Advertising
Google Analytics:
| Pattern | Formula | Business Use Case |
|---|---|---|
| Bounce Rate % | Bounced Sessions / Total Sessions | Single-page visits |
| Pages per Session | Total Pageviews / Total Sessions | Engagement depth |
| Avg Session Duration | DATEDIFF('second', [SessionStart], [SessionEnd]) |
Time on site |
| Conversion Rate % | Goal Completions / Total Sessions | Success rate |
| Cost per Click (CPC) | Total Ad Spend / Total Clicks | Click efficiency |
| Click-Through Rate (CTR) % | Clicks / Impressions | Ad engagement |
Google/Facebook/Twitter Ads:
| Pattern | Formula | Business Use Case |
|---|---|---|
| Cost per Acquisition (CPA) | Total Spend / Conversions | KPI1 / KPI3 - Conversion cost |
| Return on Ad Spend (ROAS) | Revenue / Ad Spend | KPI4 / KPI1 - Total period revenue ÷ ad spend; for attributed ROAS, filter revenue to ad-sourced conversions |
| CPM (Cost per 1000 Impressions) | (Total Spend / Impressions) × 1000 | Reach cost |
| Conversion Rate % | Conversions / Clicks | Click-to-conversion rate |
| Quality Score | (CTR × Relevance × Landing Page Experience) | Ad platform ranking |
| Cost per Lead (CPL) | Total Spend / Leads Generated | Lead acquisition cost |
Email Marketing:
| Pattern | Formula | Business Use Case |
|---|---|---|
| Open Rate % | Emails Opened / Emails Delivered | Email engagement |
| Click Rate % | Clicks / Emails Delivered | Link engagement |
| Click-to-Open Rate (CTOR) % | Clicks / Opens | Engaged reader action |
| Unsubscribe Rate % | Unsubscribes / Emails Delivered | List health |
| Bounce Rate % | Bounced Emails / Total Emails Sent | Deliverability |
| Conversion Rate % | Conversions / Emails Delivered | Campaign effectiveness |
Sales Performance & Quotas
| Pattern | Formula | Business Use Case |
|---|---|---|
| Sales vs Quota | Total Sales - Total Quota | KPI1 - KPI2 - Variance amount |
| Quota Attainment % | Total Sales / Total Quota | KPI1 / KPI2 - Achievement rate |
| Market Share % | Our Sales / Total Market Size | KPI2 / KPI1 - Competitive position |
RFM Analysis (Customer Segmentation)
Recency, Frequency, Monetary analysis - Template focuses on segmentation visualizations rather than formulas. Primary KPIs:
- Total Sales: SUM(SalesAmount)
- Active Customers #: COUNTD(Customer)
Segmentation happens in visualization layer using FIXED LOD calculations on last purchase date, purchase count, and average spend.
Advanced Aggregation Use Cases by Industry
Finance: Balance Sheet Accounts
- Use: Snapshot aggregation for all asset/liability accounts
- Why: Balance sheets are snapshots at period end, not cumulative totals
- Formula:
SUM(IF [Date] = { INCLUDE : MAX([Date]) } THEN [Measure] END)
Banking: Portfolio Positions
- Use: Snapshot aggregation for AuM, Lending Stock
- Why: Account balances are point-in-time values
- Pattern:
COUNTD(IF [Date] = { FIXED [Client] : MIN/MAX([Date]) } THEN [Client] END)for client churn
Sales: New/Lost Customer Tracking
- Use:
COUNTD(IF [Date] = { FIXED [Customer] : MIN([Date]) } THEN [Customer] END)for new customers - Why: First transaction ever per customer
- Pattern: New Customers = first transaction in period
Retail: Inventory Management
- Use: Snapshot aggregation for on-hand inventory,
SUMfor sales - Why: Inventory is snapshot; sales are cumulative
- Pattern: Inventory Turnover = (Annual Sales) / (Average Inventory)
Recurring Revenue: MRR/ARR
- Use: Snapshot aggregation for MRR (not SUM!)
- Why: MRR is the recurring revenue at period end, not summed across days
- Formula:
SUM(IF [Date] = { INCLUDE : MAX([Date]) } THEN [MonthlyRecurringRevenue] END)
Procurement: Contract Duration
- Use:
SUM(IF [Date] >= [From] AND [Date] <= [To] THEN [Amount] END)for active contracts - Why: Only count/sum contracts active between start/end dates
- Pattern: Spend Under Management = contracts overlapping the analysis period
Digital Marketing: Time-Based Metrics
- Use:
DATEDIFF('second', [Start], [End])for session duration, response time - Why: Native time difference calculations
- Pattern: Avg Session Duration =
DATEDIFF('second', [SessionStart], [SessionEnd])
Coverage: 61 production dashboard templates across Finance (P&L, Balance Sheet, Cash Flow), Banking (AuM, Lending, Loans), Sales (Basic, Expert, Margin, Discount/VAT, RFM, Market Share), Recurring Revenue (SaaS/Subscription), Retail (Sales, Inventory), E-Commerce, Digital Marketing (Google Analytics, Google Ads, Facebook Ads, Twitter Ads, Email Marketing), Procurement (Spend Analytics, Purchasing, Contracts), Supply Chain, Travel, and CEO Cockpits.