{"metrics":[{"name":"MRR (Monthly Recurring Revenue)","slug":"mrr-monthly-recurring-revenue","definition":"The total predictable revenue from active subscriptions, normalized to a monthly value.","formulas":["MRR = Sum of (Monthly subscription value for all active customers)","MRR contribution = Annual Contract Value / 12"],"benchmarks":null,"insight":"The current run rate of your recurring revenue engine.","commonMistakes":["Including one-time fees (setup, professional services)","Including usage/consumption revenue that isn't guaranteed","Double-counting customers during plan changes","Not normalizing annual contracts to monthly","Treating MRR as an accounting figure"],"sources":["Baremetrics: MRR Definition: https://baremetrics.com/academy/saas-calculate-mrr","Maxio: Monthly Recurring Revenue Defined: https://www.maxio.com/saaspedia/monthly-recurring-revenue-defined-for-a-saas-business","ChurnZero: Monthly Recurring Revenue: https://churnzero.com/churnopedia/monthly-recurring-revenue-mrr/"],"department":"Core","category":"Revenue Metrics","aliases":["MRR"],"rawMarkdown":"### MRR (Monthly Recurring Revenue)\n\n**Definition:** The total predictable revenue from active subscriptions, normalized to a monthly value.\n\n**Formula:**\n```\nMRR = Sum of (Monthly subscription value for all active customers)\n```\n\nFor annual contracts:\n```\nMRR contribution = Annual Contract Value / 12\n```\n\n**Include:**\n- Recurring subscription fees\n- Expansion and upgrade revenue\n- Discounts (use discounted amount, not list price)\n\n**Exclude:**\n- One-time fees (setup, implementation, professional services)\n- Trial accounts and free users\n- Variable/usage-based fees (unless contractually guaranteed)\n- Non-recurring charges\n\nUsage with no commitment behind it is reported as [Consumption Revenue](finance.md#consumption-revenue).\n\n**Inputs:**\n- Active customer list\n- Subscription/contract value for each customer\n- Contract term (monthly/annual)\n\nMRR is reported per plan (by plan id and plan name) and per customer segment.\n\n**What it tells you:** The current run rate of your recurring revenue engine.\n\n**Important:** MRR is a business insights metric, not a GAAP/FASB accounting term. It is representative of, but not identical to, recognized revenue.\n\n**Common mistakes:**\n- Including one-time fees (setup, professional services)\n- Including usage/consumption revenue that isn't guaranteed\n- Double-counting customers during plan changes\n- Not normalizing annual contracts to monthly\n- Treating MRR as an accounting figure\n\n**Related metrics:** ARR, MRR Growth Rate, New MRR, Expansion MRR, Churned MRR\n\n**Sources:**\n- [Baremetrics: MRR Definition](https://baremetrics.com/academy/saas-calculate-mrr)\n- [Maxio: Monthly Recurring Revenue Defined](https://www.maxio.com/saaspedia/monthly-recurring-revenue-defined-for-a-saas-business)\n- [ChurnZero: Monthly Recurring Revenue](https://churnzero.com/churnopedia/monthly-recurring-revenue-mrr/)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"ARR (Annual Recurring Revenue)","slug":"arr-annual-recurring-revenue","definition":"The annualized value of recurring revenue. ARR represents the yearly run rate of subscription revenue.","formulas":["ARR = MRR × 12","ARR-O = (MRR − TTM_Pricing_Adjustment_MRR − TTM_Recontracting_MRR) × 12","ARR-M = MRR × 12","ARR-M = ARR-O + TTM_Pricing_Adjustment_MRR × 12 + TTM_Recontracting_MRR × 12"],"benchmarks":null,"insight":"The scale of the business on an annual basis. Used for valuation, planning and investor reporting.","commonMistakes":["Calculating from annual contracts directly without normalizing (leads to timing mismatches)","Treating ARR as cash (it's a run rate, not collected revenue)","Mixing definitions without declaring which one you're using"],"sources":["SaaS Metrics Standards Board: ARR: https://www.saasmetricsboard.com/annual-recurring-revenue","ChartMogul: ARR Definition: https://chartmogul.com/saas-metrics/arr/","Maxio: Annual Recurring Revenue: https://www.maxio.com/saaspedia/arr"],"department":"Core","category":"Revenue Metrics","aliases":["ARR"],"rawMarkdown":"### ARR (Annual Recurring Revenue)\n\n**Definition:** The annualized value of recurring revenue. ARR represents the yearly run rate of subscription revenue.\n\n**Note:** ARR is used to mean two things in the industry:\n1. **Annualized Run Rate** = MRR × 12 (common for monthly-billing companies)\n2. **Annual Recurring Revenue** = Sum of annualized contract values (common for annual-contract companies)\n\nBoth are valid. The GASP Standard uses **MRR × 12** for consistency across business models.\n\n**Formula:**\n```\nARR = MRR × 12\n```\n\n**Include:** Same inclusions/exclusions as MRR, annualized.\n\n**Industry equivalents:** Committed ARR, CARR (Committed Annual Recurring Revenue), Baseline ARR and CMRR (Committed Monthly Recurring Revenue, annualised). GASP's ARR includes contractual commitments and leaves uncommitted usage out, which is what each of these names describes. Consumption companies that report usage inside ARR are reporting [ARR Including Usage Run-Rate](finance.md#arr-including-usage-run-rate), which the GASP Standard names separately.\n\nARR is reported per customer segment.\n\n**What it tells you:** The scale of the business on an annual basis. Used for valuation, planning and investor reporting.\n\n**Common mistakes:**\n- Calculating from annual contracts directly without normalizing (leads to timing mismatches)\n- Treating ARR as cash (it's a run rate, not collected revenue)\n- Mixing definitions without declaring which one you're using\n\n**Sources:**\n- [SaaS Metrics Standards Board: ARR](https://www.saasmetricsboard.com/annual-recurring-revenue)\n- [ChartMogul: ARR Definition](https://chartmogul.com/saas-metrics/arr/)\n- [Maxio: Annual Recurring Revenue](https://www.maxio.com/saaspedia/arr)\n\n#### Operating Form: ARR-O\n\nARR-O measures organic recurring revenue by excluding MRR changes that come from mechanical pricing or contract restructuring rather than genuine customer expansion.\n\n**CEL Source:** `Revenue_Event`, `Amendment_Event`\n**ATL Inclusion:** All `expansion_classification` values **except** `pricing_adjustment` and `recontracting`\n\n**Formula:**\n```\nARR-O = (MRR − TTM_Pricing_Adjustment_MRR − TTM_Recontracting_MRR) × 12\n```\nWhere TTM_Pricing_Adjustment_MRR and TTM_Recontracting_MRR are the MRR changes tagged with `expansion_classification` `pricing_adjustment` or `recontracting` in the trailing 12 months, counted for customers active at period end. MRR is the period-end MRR used by ARR-M. ARR-O is therefore a trailing twelve month measure. Stripping price rises out of ARR is a GASP construct rather than an industry convention; where price and volume are separated elsewhere, it is a growth decomposition over the period.\n\n**What it tells you:** The run rate of revenue that customers created by adopting and expanding, with price rises and recontracting taken out. It is the part of ARR most likely to last.\n\n#### Market Form: ARR-M\n\nARR-M is total reported ARR including all sources of recurring revenue change. This is the number investors see and public comparables use.\n\n**CEL Source:** `Revenue_Event`, `Amendment_Event`\n**ATL Inclusion:** All `expansion_classification` values included\n\n**Formula:**\n```\nARR-M = MRR × 12\n```\nAll MRR sources included.\n\n**What it tells you:** The scale of the business as reported to the market. The number used in valuation multiples and investor benchmarks.\n\n#### Bridge: ARR-O ↔ ARR-M\n\n**Reconciliation:**\n```\nARR-M = ARR-O + TTM_Pricing_Adjustment_MRR × 12 + TTM_Recontracting_MRR × 12\n```\n\n**Diagnostic:** The delta (ARR-M − ARR-O) is the **Durability Gap.** Because ARR-O subtracts only the trailing 12 months of tagged MRR change for customers active at period end, the Durability Gap is a trailing-year growth decomposition: it shows how much of reported ARR growth came from pricing and contract changes rather than organic customer expansion. A growing gap means ARR growth that may not last. KeyBanc tracks it implicitly in its annual SaaS survey. Public SaaS companies report total ARR (ARR-M), while internal planning teams strip out pricing actions to see the growth the product earned.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":{"operating":{"label":"ARR-O","description":"ARR-O measures organic recurring revenue by excluding MRR changes that come from mechanical pricing or contract restructuring rather than genuine customer expansion.","celSource":"`Revenue_Event`, `Amendment_Event`","atlInclusion":"All `expansion_classification` values **except** `pricing_adjustment` and `recontracting`","formula":"ARR-O = (MRR − TTM_Pricing_Adjustment_MRR − TTM_Recontracting_MRR) × 12","insight":"The run rate of revenue that customers created by adopting and expanding, with price rises and recontracting taken out. It is the part of ARR most likely to last."},"market":{"label":"ARR-M","description":"ARR-M is total reported ARR including all sources of recurring revenue change. This is the number investors see and public comparables use.","celSource":"`Revenue_Event`, `Amendment_Event`","atlInclusion":"All `expansion_classification` values included","formula":"ARR-M = MRR × 12","insight":"The scale of the business as reported to the market. The number used in valuation multiples and investor benchmarks."},"bridge":{"reconciliation":"ARR-M = ARR-O + TTM_Pricing_Adjustment_MRR × 12 + TTM_Recontracting_MRR × 12","diagnostic":"The delta (ARR-M − ARR-O) is the **Durability Gap.** Because ARR-O subtracts only the trailing 12 months of tagged MRR change for customers active at period end, the Durability Gap is a trailing-year growth decomposition: it shows how much of reported ARR growth came from pricing and contract changes rather than organic customer expansion. A growing gap means ARR growth that may not last. KeyBanc tracks it implicitly in its annual SaaS survey. Public SaaS companies report total ARR (ARR-M), while internal planning teams strip out pricing actions to see the growth the product earned.\n\n---"}},"dualLensNote":null},{"name":"ARPA (Average Revenue Per Account)","slug":"arpa-average-revenue-per-account","definition":"Average monthly recurring revenue per customer.","formulas":["ARPA = MRR / Active Customers"],"benchmarks":null,"insight":"The average value of a customer on a monthly basis. Used in LTV and CAC Payback calculations.","commonMistakes":null,"sources":[],"department":"Core","category":"Revenue Metrics","aliases":["ARPA"],"rawMarkdown":"### ARPA (Average Revenue Per Account)\n\n**Definition:** Average monthly recurring revenue per customer.\n\n**Formula:**\n```\nARPA = MRR / Active Customers\n```\n\nARPA is reported per customer segment.\n\n**What it tells you:** The average value of a customer on a monthly basis. Used in LTV and CAC Payback calculations.\n\n**Note:** Some companies use ARPU (Average Revenue Per User) for user-based pricing. ARPA is account-level; ARPU is user-level.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"MRR Growth Rate","slug":"mrr-growth-rate","definition":"The month-over-month percentage change in MRR.","formulas":["MRR Growth Rate = (MRR this month - MRR last month) / MRR last month × 100"],"benchmarks":"- Early stage (pre-$1M ARR): 15-20% MoM\n- Growth stage ($1M-$10M ARR): 5-10% MoM\n- Scale stage ($10M+ ARR): 2-5% MoM","insight":"The velocity of revenue growth.","commonMistakes":null,"sources":[],"department":"Core","category":"Revenue Metrics","aliases":["MRR"],"rawMarkdown":"### MRR Growth Rate\n\n**Definition:** The month-over-month percentage change in MRR.\n\n**Formula:**\n```\nMRR Growth Rate = (MRR this month - MRR last month) / MRR last month × 100\n```\n\n**Benchmarks:**\n- Early stage (pre-$1M ARR): 15-20% MoM\n- Growth stage ($1M-$10M ARR): 5-10% MoM\n- Scale stage ($10M+ ARR): 2-5% MoM\n\n**What it tells you:** The velocity of revenue growth.\n\n**Sources:** [Baremetrics](https://baremetrics.com/academy/saas-calculate-mrr), [Chargebee](https://www.chargebee.com/resources/glossaries/what-is-net-mrr-growth/)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"New MRR","slug":"new-mrr","definition":"MRR generated from brand new customers acquired in the period.","formulas":["New MRR = Sum of (first month MRR from customers acquired this period)"],"benchmarks":null,"insight":"The output of your acquisition engine.","commonMistakes":null,"sources":[],"department":"Core","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### New MRR\n\n**Definition:** MRR generated from brand new customers acquired in the period.\n\n**Formula:**\n```\nNew MRR = Sum of (first month MRR from customers acquired this period)\n```\n\n**Example:** 5 new customers × $60/month plan = $300 New MRR\n\nNew MRR is reported per customer segment.\n\n**What it tells you:** The output of your acquisition engine.\n\n**Sources:** [Drivetrain](https://www.drivetrain.ai/strategic-finance-glossary/mrr-in-saas), [SaaS Academy](https://www.saasacademy.com/blog/what-is-mrr)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Expansion MRR","slug":"expansion-mrr","definition":"Additional MRR from existing customers through upgrades, add-ons, seat increases or price increases.","formulas":["Expansion MRR = Sum of (MRR increase from existing customers this period)"],"benchmarks":null,"insight":"How much revenue you grow from customers you already have, which usually costs far less than winning new ones.","commonMistakes":null,"sources":[],"department":"Core","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Expansion MRR\n\n**Definition:** Additional MRR from existing customers through upgrades, add-ons, seat increases or price increases.\n\n**Formula:**\n```\nExpansion MRR = Sum of (MRR increase from existing customers this period)\n```\n\n**Includes:** Upsells, cross-sells, add-ons, seat expansion, plan upgrades\n\nExpansion MRR is reported per customer segment.\n\n**What it tells you:** How much revenue you grow from customers you already have, which usually costs far less than winning new ones.\n\n**Key insight:** Expansion MRR rate should exceed churn rate for negative net churn.\n\n**Sources:** [Wall Street Prep](https://www.wallstreetprep.com/knowledge/expansion-revenue-mrr/), [Drivetrain](https://www.drivetrain.ai/strategic-finance-glossary/mrr-in-saas)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Churned MRR","slug":"churned-mrr","definition":"MRR lost from customers who cancelled their subscriptions.","formulas":["Churned MRR = Sum of (MRR from customers who churned this period)"],"benchmarks":null,"insight":"The leakage in your revenue bucket from customer attrition.","commonMistakes":null,"sources":[],"department":"Core","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Churned MRR\n\n**Definition:** MRR lost from customers who cancelled their subscriptions.\n\n**Formula:**\n```\nChurned MRR = Sum of (MRR from customers who churned this period)\n```\n\nChurned MRR is reported per customer segment.\n\n**What it tells you:** The leakage in your revenue bucket from customer attrition.\n\n**Sources:** [Drivetrain](https://www.drivetrain.ai/strategic-finance-glossary/mrr-in-saas), [Baremetrics](https://baremetrics.com/academy/saas-calculate-mrr)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Contraction MRR","slug":"contraction-mrr","definition":"MRR reduction from existing customers who downgraded but didn't churn.","formulas":["Contraction MRR = Sum of (MRR decrease from existing customers who remain active)"],"benchmarks":null,"insight":"Revenue pressure from customers reducing usage/commitment.","commonMistakes":null,"sources":[],"department":"Core","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Contraction MRR\n\n**Definition:** MRR reduction from existing customers who downgraded but didn't churn.\n\n**Formula:**\n```\nContraction MRR = Sum of (MRR decrease from existing customers who remain active)\n```\n\n**Includes:** Plan downgrades, removed seats, dropped add-ons\n\nContraction MRR is reported per customer segment.\n\n**What it tells you:** Revenue pressure from customers reducing usage/commitment.\n\n**Sources:** [Drivetrain](https://www.drivetrain.ai/strategic-finance-glossary/mrr-in-saas), [SaaS Academy](https://www.saasacademy.com/blog/what-is-mrr)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Reactivation MRR","slug":"reactivation-mrr","definition":"MRR regained from customers who had churned and signed up again in the period.","formulas":["Reactivation MRR = Sum of (first month MRR from previously churned customers who returned this period)"],"benchmarks":null,"insight":"How much lost revenue comes back. A rising share of net new MRR from reactivation usually means churn was recoverable (billing failures, seasonal pauses) rather than lost for good.","commonMistakes":null,"sources":[],"department":"Core","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Reactivation MRR\n\n**Definition:** MRR regained from customers who had churned and signed up again in the period.\n\n**Formula:**\n```\nReactivation MRR = Sum of (first month MRR from previously churned customers who returned this period)\n```\n\n**Also known as:** Resurrected MRR, Win-back MRR, Reactivated MRR\n\nA reactivation is the `reactivation` event in the [Commercial Event Ledger](../cel.md): the customer's status was `churned` and a new subscription starts. It is counted apart from New MRR, so win-back and acquisition can be judged on their own, and apart from Expansion MRR, which only existing customers generate.\n\nReactivation MRR is reported per customer segment.\n\n**What it tells you:** How much lost revenue comes back. A rising share of net new MRR from reactivation usually means churn was recoverable (billing failures, seasonal pauses) rather than lost for good.\n\n**Dual-lens note:** Net Revenue Retention (NRR) in its Market form counts reactivation of customers who were in the period-start cohort; the Operating form leaves it out, as [NRR](#net-revenue-retention-nrr) sets out.\n\n**Sources:** [ChartMogul](https://chartmogul.com/blog/mrr-movements/), [Baremetrics](https://baremetrics.com/academy/saas-calculate-mrr)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Carry MRR","slug":"carry-mrr","definition":"The part of beginning MRR that existing customers kept paying in the period: beginning MRR less churned and contraction MRR, before any expansion.","formulas":["Carry MRR = Beginning MRR - Churned MRR - Contraction MRR"],"benchmarks":null,"insight":"How much of last period's revenue base is still in place. Carry MRR is Gross Revenue Retention (GRR) in dollar terms: divide it by beginning MRR and you get GRR.","commonMistakes":null,"sources":[],"department":"Core","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Carry MRR\n\n**Definition:** The part of beginning MRR that existing customers kept paying in the period: beginning MRR less churned and contraction MRR, before any expansion.\n\n**Formula:**\n```\nCarry MRR = Beginning MRR - Churned MRR - Contraction MRR\n```\n\n**Also known as:** Base MRR, Retained MRR, Renewal MRR\n\n**What it tells you:** How much of last period's revenue base is still in place. Carry MRR is Gross Revenue Retention (GRR) in dollar terms: divide it by beginning MRR and you get GRR.\n\n**Key insight:** If carry is declining while expansion masks it, you have a retention problem hiding behind growth.\n\n**Sources:** [Baremetrics](https://baremetrics.com/academy/saas-calculate-mrr), [ChartMogul](https://chartmogul.com/blog/mrr-movements/)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Net New MRR","slug":"net-new-mrr","definition":"The net change in MRR after accounting for all movements.","formulas":["Net New MRR = New MRR + Expansion MRR + Reactivation MRR - Churned MRR - Contraction MRR"],"benchmarks":null,"insight":"Whether MRR grew or shrank over the period and by how much, after every movement is counted.","commonMistakes":null,"sources":[],"department":"Core","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Net New MRR\n\n**Definition:** The net change in MRR after accounting for all movements.\n\n**Formula:**\n```\nNet New MRR = New MRR + Expansion MRR + Reactivation MRR - Churned MRR - Contraction MRR\n```\n\n**Example:**\n$50,000 starting + $2,500 new + $5,000 expansion + $300 reactivation - $1,000 churned - $500 contraction = $56,300 ending\n\nEnding MRR = Carry MRR + New MRR + Expansion MRR + Reactivation MRR, so the five movements and Carry MRR always reconcile to the period-end MRR.\n\n**What it tells you:** Whether MRR grew or shrank over the period and by how much, after every movement is counted.\n\n**Sources:** [Baremetrics](https://baremetrics.com/academy/saas-calculate-mrr), [Chargebee](https://www.chargebee.com/resources/glossaries/what-is-net-mrr-growth/)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Bundle Pricing and MRR Allocation","slug":"bundle-pricing-and-mrr-allocation","definition":"When a subscription is sold as a bundle (a single SKU containing multiple products, features or services at one price), individual line items within the bundle have no explicit price. MRR must still be allocated to each component for accurate reporting of expansion, contraction and churn at the item level.","formulas":["Item MRR = (Item SSP / Sum of all item SSPs) × Bundle Price"],"benchmarks":null,"insight":null,"commonMistakes":["Allocating equally across items regardless of value","Using cost as a proxy for value (low-cost items may have high customer value)","Not updating SSPs when standalone pricing changes","Treating the entire bundle as a single unit (hides component-level movements)"],"sources":["Stripe: Standalone Selling Prices: https://docs.stripe.com/revenue-recognition/standalone-selling-price","Chargebee: Standalone Selling Price: https://www.chargebee.com/docs/revrec/revenue-recognition/standalone-selling-price","Zuora: Fair Value / SSP in Multiple-Element Arrangements: https://www.zuora.com/resource/fair-value-standalone-selling-price-multiple-element-arrangements-revpro/","Maxio: SaaS Revenue Recognition and ASC 606: https://www.maxio.com/blog/saas-revenue-recognition-asc-606"],"department":"Core","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Bundle Pricing and MRR Allocation\n\n**Definition:** When a subscription is sold as a bundle (a single SKU containing multiple products, features or services at one price), individual line items within the bundle have no explicit price. MRR must still be allocated to each component for accurate reporting of expansion, contraction and churn at the item level.\n\n**The problem:** A customer pays $500/month for a \"Growth Bundle\" containing CRM, Analytics and Support. If they later remove Analytics, what was Analytics worth? Without allocation, you can't measure contraction MRR or product-level revenue.\n\n**Industry standard method: Relative Standalone Selling Price (SSP)**\n\nThis is the method prescribed by ASC 606 / IFRS 15 for revenue recognition and used by Stripe, Zuora and Chargebee for bundle allocation:\n\n```\nItem MRR = (Item SSP / Sum of all item SSPs) × Bundle Price\n```\n\n**Steps:**\n1. **Determine standalone selling price (SSP)** for each item. The price you would charge if the item were sold individually\n2. **Calculate the allocation ratio.** Each item's SSP as a percentage of the total SSPs\n3. **Apply the ratio to the bundle price.** This gives each item its allocated MRR\n\n**Example:**\n\n| Item | Standalone Price | Allocation % | Allocated MRR |\n|------|-----------------|--------------|---------------|\n| CRM | $300/mo | 50% | $250 |\n| Analytics | $200/mo | 33% | $167 |\n| Support | $100/mo | 17% | $83 |\n| **Total SSP** | **$600/mo** | **100%** | **$500** |\n\nThe bundle discount ($100) is distributed proportionally across all items.\n\n**When SSP is not observable:** If an item has never been sold individually, ASC 606 provides three estimation methods:\n- **Adjusted market assessment.** Estimate what the market would pay\n- **Expected cost plus margin.** Cost to deliver + target margin\n- **Residual approach.** Allocate known SSPs first, remainder to the unknown item (use only when SSP is highly variable or uncertain)\n\n**What this enables:**\n- Accurate contraction/expansion MRR when bundle components change\n- Product-level revenue attribution\n- Meaningful churn analysis per product line\n- Consistent reporting between finance (ASC 606) and operations (MRR)\n\n**Common mistakes:**\n- Allocating equally across items regardless of value\n- Using cost as a proxy for value (low-cost items may have high customer value)\n- Not updating SSPs when standalone pricing changes\n- Treating the entire bundle as a single unit (hides component-level movements)\n\n**Note:** MRR allocation for operational reporting should align with your ASC 606 / IFRS 15 revenue allocation where possible. Divergence between operational MRR and recognised revenue creates reconciliation problems.\n\n**Sources:**\n- [Stripe: Standalone Selling Prices](https://docs.stripe.com/revenue-recognition/standalone-selling-price)\n- [Chargebee: Standalone Selling Price](https://www.chargebee.com/docs/revrec/revenue-recognition/standalone-selling-price)\n- [Zuora: Fair Value / SSP in Multiple-Element Arrangements](https://www.zuora.com/resource/fair-value-standalone-selling-price-multiple-element-arrangements-revpro/)\n- [Maxio: SaaS Revenue Recognition and ASC 606](https://www.maxio.com/blog/saas-revenue-recognition-asc-606)\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Total Customers","slug":"total-customers","definition":"The number of active customers at the end of the period.","formulas":["Total Customers = Count of customers with customer_status = active at period end"],"benchmarks":null,"insight":"The size of the base. Watch it beside MRR, since a base growing faster than MRR means ARPA is falling.","commonMistakes":null,"sources":[],"department":"Core","category":"Customer Count Metrics","aliases":[],"rawMarkdown":"### Total Customers\n\n**Definition:** The number of active customers at the end of the period.\n\n**Formula:**\n```\nTotal Customers = Count of customers with customer_status = active at period end\n```\n\n**Also known as:** Customer Count, Active Customers, Logos\n\n**Counting:** One customer is one billing entity, whatever its number of users, seats or subscriptions (see [Customer](../definitions.md#customer)). Trial and free accounts are not customers until they pay.\n\nTotal Customers is reported per customer segment.\n\n**What it tells you:** The size of the base. Watch it beside MRR, since a base growing faster than MRR means ARPA is falling.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"New Customers","slug":"new-customers","definition":"The number of customers acquired in the period: customers whose first paid subscription started in the period.","formulas":["New Customers = Count of customers with a new revenue event in the period"],"benchmarks":null,"insight":"The output of the acquisition engine in logos rather than dollars. New Customers x ACV equals New MRR x 12, so when the two trends part, deal size has moved.","commonMistakes":null,"sources":[],"department":"Core","category":"Customer Count Metrics","aliases":[],"rawMarkdown":"### New Customers\n\n**Definition:** The number of customers acquired in the period: customers whose first paid subscription started in the period.\n\n**Formula:**\n```\nNew Customers = Count of customers with a new revenue event in the period\n```\n\n**Also known as:** New Logos, Logo Acquisitions, Gross Adds\n\n**Not:** Reactivated customers, who return through a `reactivation` event and are counted in Reactivation MRR; expansion of an existing customer, however large.\n\nNew Customers is reported per customer segment.\n\n**What it tells you:** The output of the acquisition engine in logos rather than dollars. New Customers x ACV equals New MRR x 12, so when the two trends part, deal size has moved.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Churned Customers","slug":"churned-customers","definition":"The number of customers lost in the period: customers whose last active subscription ended.","formulas":["Churned Customers = Count of customers with a churn event in the period"],"benchmarks":null,"insight":"The numerator of [Logo Churn Rate](#logo-churn-rate-customer-churn). Logo churn concentrated in one segment shows here before it moves the blended rate.","commonMistakes":null,"sources":[],"department":"Core","category":"Customer Count Metrics","aliases":[],"rawMarkdown":"### Churned Customers\n\n**Definition:** The number of customers lost in the period: customers whose last active subscription ended.\n\n**Formula:**\n```\nChurned Customers = Count of customers with a churn event in the period\n```\n\n**Also known as:** Lost Logos, Logo Churn (count)\n\n**Not:** Customers who downgraded but kept at least one active subscription (contraction).\n\nChurned Customers is reported per customer segment.\n\n**What it tells you:** The numerator of [Logo Churn Rate](#logo-churn-rate-customer-churn). Logo churn concentrated in one segment shows here before it moves the blended rate.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Net Revenue Retention (NRR)","slug":"net-revenue-retention-nrr","definition":"The percentage of revenue retained from existing customers over a period, including expansion, contraction and churn. Also known as Net Dollar Retention (NDR).","formulas":["NRR = MRR of cohort today / MRR of same cohort 12 months ago × 100","NRR = (Beginning MRR + Expansion MRR - Contraction MRR - Churned MRR) / Beginning MRR × 100","NRR-O = MRR of cohort today (organic only) / MRR of same cohort 12 months ago × 100","NRR-M = MRR of cohort today (all expansion types and cohort reactivation) / MRR of same cohort 12 months ago × 100","NRR-M = (Beginning MRR + All Expansion MRR + Cohort Reactivation MRR − Contraction MRR − Churned MRR) / Beginning MRR × 100","NRR-M ≈ NRR-O + Reactivation + Cross-Module + New Buying Centre + Pricing Adjustment + Recontracting expansion"],"benchmarks":"- Below 90%: Leaky bucket. Growth requires constant new acquisition.\n- 90-100%: Stable. You keep what you have.\n- 100-110%: Good. Existing customers grow. (Median for VC-backed SaaS: 101-106%)\n- 110-120%: Great. Strong expansion motion.\n- 120%+: Exceptional. Top quartile performance.","insight":"Whether the customers you had a year ago are paying you more or less today. Above 100%, the existing base grows on its own and new customers add on top; below it, new sales first have to replace what the base lost.","commonMistakes":["Calculating over inconsistent time periods","Including new customer revenue (that's not NRR)","Excluding small customers or segments","Confusing with Gross Revenue Retention (GRR)"],"sources":["SaaS Metrics Standards Board: NRR: https://www.saasmetricsboard.com/net-revenue-retention","Wall Street Prep: Net Revenue Retention: https://www.wallstreetprep.com/knowledge/net-revenue-retention-nrr/","ChurnZero: Net Revenue Retention: https://churnzero.com/churnopedia/net-revenue-retention/"],"department":"Core","category":"Retention Metrics","aliases":["NRR","NDR"],"rawMarkdown":"### Net Revenue Retention (NRR)\n\n**Definition:** The percentage of revenue retained from existing customers over a period, including expansion, contraction and churn. Also known as Net Dollar Retention (NDR).\n\n**Calculation Methods:**\n\nTwo methods are widely used. The **cohort method is preferred** because it keeps customers acquired during the period out by construction. The GASP Standard gets the same protection by running the formula method over the customers active at period start.\n\n**1. Cohort Method (Preferred):**\nCompare the MRR of a specific group of customers from one year ago to the MRR of those same customers today. New customers acquired during the period are excluded.\n\n```\nNRR = MRR of cohort today / MRR of same cohort 12 months ago × 100\n```\n\n**2. Formula Method:**\n```\nNRR = (Beginning MRR + Expansion MRR - Contraction MRR - Churned MRR) / Beginning MRR × 100\n```\n\n**Time period:** The GASP Standard measures NRR over the **trailing 12 months**, which smooths seasonality and is the basis boards and investors expect.\n\n**Annualization:** If calculating over a shorter period, annualize by raising to the appropriate power:\n- Monthly NRR annualized: `(Monthly NRR / 100) ^ 12 × 100`\n- Quarterly NRR annualized: `(Quarterly NRR / 100) ^ 4 × 100`\n\n**Does NOT include:** New customer revenue. NRR measures existing customer behavior only.\n\n**Benchmarks (per KeyBanc 2024, SaaS Capital 2025):**\n- Below 90%: Leaky bucket. Growth requires constant new acquisition.\n- 90-100%: Stable. You keep what you have.\n- 100-110%: Good. Existing customers grow. (Median for VC-backed SaaS: 101-106%)\n- 110-120%: Great. Strong expansion motion.\n- 120%+: Exceptional. Top quartile performance.\n\n**Segment-specific benchmarks (per SaaS Capital 2025):**\n- SMB-focused: 90-105% typical\n- Mid-market: 105-115% typical\n- Enterprise: 115-125% typical\n\nNRR is reported per customer segment, each snapshot and event counting in the segment it carries.\n\n**Usage and consumption:** NRR already includes realised usage: overage above a commitment is expansion tagged `usage_realisation`, and for a customer on a prepaid commitment the commitment sits in the MRR base. Pay-as-you-go customers have no MRR and sit outside the cohort, as Snowflake keeps its on-demand customers outside its NRR. The retention of consumption revenue itself is [Consumption Net Revenue Retention](finance.md#consumption-net-revenue-retention), a separate basis reported under its own name.\n\n**What it tells you:** Whether the customers you had a year ago are paying you more or less today. Above 100%, the existing base grows on its own and new customers add on top; below it, new sales first have to replace what the base lost.\n\n**Common mistakes:**\n- Calculating over inconsistent time periods\n- Including new customer revenue (that's not NRR)\n- Excluding small customers or segments\n- Confusing with Gross Revenue Retention (GRR)\n\n**Sources:**\n- [SaaS Metrics Standards Board: NRR](https://www.saasmetricsboard.com/net-revenue-retention)\n- [Wall Street Prep: Net Revenue Retention](https://www.wallstreetprep.com/knowledge/net-revenue-retention-nrr/)\n- [ChurnZero: Net Revenue Retention](https://churnzero.com/churnopedia/net-revenue-retention/)\n\n#### Operating Form: Cohort NRR (NRR-O)\n\nNRR-O uses the cohort method and includes only organic expansion: growth on the same product and usage realisation. It excludes expansion from new modules, new buying centres, reactivation, recontracting and pricing actions.\n\n**CEL Source:** `Revenue_Event`\n**ATL Inclusion:**\n- `lifecycle_attribution` ∈ (`retention`, `expansion`)\n- `expansion_classification` ∈ (`same_product`, `usage_realisation`)\n- Excludes: `expansion_classification` ∈ (`new_module`, `new_buying_centre`, `pricing_adjustment`, `recontracting`) and `lifecycle_attribution` = `reactivation`\n\n**Formula:**\n```\nNRR-O = MRR of cohort today (organic only) / MRR of same cohort 12 months ago × 100\n```\n\n**What it tells you:** Whether customers expand because the product gives them more value, with cross-sell, reactivation and pricing taken out. It is the closest NRR gets to a product-market fit signal.\n\n#### Market Form: Account NRR (NRR-M)\n\nNRR-M uses the cohort method over the customers active at period start, the same construction public SaaS companies report and investors benchmark (Bessemer, KeyBanc). It includes all six `expansion_classification` values plus reactivation of cohort customers. A customer who churned before the window and returns inside it is new business, not retention. A customer who churns and returns inside the window is in the cohort, so that reactivation counts.\n\n**CEL Source:** `Revenue_Event`\n**ATL Inclusion:**\n- All `expansion_classification` values included (`same_product`, `new_module`, `new_buying_centre`, `pricing_adjustment`, `recontracting`, `usage_realisation`)\n- `event_type` = `reactivation` included for customers in the period-start cohort\n- Excluded: `lifecycle_attribution` = `acquisition`; reactivation of customers who had already churned before period start (new business)\n\n**Formula:**\n```\nNRR-M = MRR of cohort today (all expansion types and cohort reactivation) / MRR of same cohort 12 months ago × 100\n```\nEquivalently, as the formula method over the same cohort:\n```\nNRR-M = (Beginning MRR + All Expansion MRR + Cohort Reactivation MRR − Contraction MRR − Churned MRR) / Beginning MRR × 100\n```\n\n**What it tells you:** The total revenue retention and expansion picture that investors use for benchmarking and valuation.\n\n#### Bridge: NRR-O ↔ NRR-M\n\n**Reconciliation:**\n```\nNRR-M ≈ NRR-O + Reactivation + Cross-Module + New Buying Centre + Pricing Adjustment + Recontracting expansion\n```\n(Expressed as percentage-point contributions to the NRR rate.)\n\n**Diagnostic:** The delta (NRR-M − NRR-O) is the **Expansion Integrity Gap.** It shows how much of reported NRR comes from commercial motion (cross-sell, reactivation, pricing) rather than organic product expansion. A wide gap means NRR depends on sales execution more than product-led growth. That can be a sound strategy. The board should still know which one drives retention. SaaS Metrics Standards Board recommends the cohort method. Public SaaS companies report cohort-based NRR (NRR-M), so both forms use the cohort method and differ only in which expansion counts.\n\n---","signalType":"outcome","signalTypeSecondary":"efficiency","dualLens":{"operating":{"label":"Cohort NRR (NRR-O)","description":"NRR-O uses the cohort method and includes only organic expansion: growth on the same product and usage realisation. It excludes expansion from new modules, new buying centres, reactivation, recontracting and pricing actions.","celSource":"`Revenue_Event`","atlInclusion":"- `lifecycle_attribution` ∈ (`retention`, `expansion`)\n- `expansion_classification` ∈ (`same_product`, `usage_realisation`)\n- Excludes: `expansion_classification` ∈ (`new_module`, `new_buying_centre`, `pricing_adjustment`, `recontracting`) and `lifecycle_attribution` = `reactivation`","formula":"NRR-O = MRR of cohort today (organic only) / MRR of same cohort 12 months ago × 100","insight":"Whether customers expand because the product gives them more value, with cross-sell, reactivation and pricing taken out. It is the closest NRR gets to a product-market fit signal."},"market":{"label":"Account NRR (NRR-M)","description":"NRR-M uses the cohort method over the customers active at period start, the same construction public SaaS companies report and investors benchmark (Bessemer, KeyBanc). It includes all six `expansion_classification` values plus reactivation of cohort customers. A customer who churned before the window and returns inside it is new business, not retention. A customer who churns and returns inside the window is in the cohort, so that reactivation counts.","celSource":"`Revenue_Event`","atlInclusion":"- All `expansion_classification` values included (`same_product`, `new_module`, `new_buying_centre`, `pricing_adjustment`, `recontracting`, `usage_realisation`)\n- `event_type` = `reactivation` included for customers in the period-start cohort\n- Excluded: `lifecycle_attribution` = `acquisition`; reactivation of customers who had already churned before period start (new business)","formula":"NRR-M = MRR of cohort today (all expansion types and cohort reactivation) / MRR of same cohort 12 months ago × 100","insight":"The total revenue retention and expansion picture that investors use for benchmarking and valuation."},"bridge":{"reconciliation":"NRR-M ≈ NRR-O + Reactivation + Cross-Module + New Buying Centre + Pricing Adjustment + Recontracting expansion","diagnostic":"The delta (NRR-M − NRR-O) is the **Expansion Integrity Gap.** It shows how much of reported NRR comes from commercial motion (cross-sell, reactivation, pricing) rather than organic product expansion. A wide gap means NRR depends on sales execution more than product-led growth. That can be a sound strategy. The board should still know which one drives retention. SaaS Metrics Standards Board recommends the cohort method. Public SaaS companies report cohort-based NRR (NRR-M), so both forms use the cohort method and differ only in which expansion counts.\n\n---"}},"dualLensNote":null},{"name":"Gross Revenue Retention (GRR)","slug":"gross-revenue-retention-grr","definition":"The percentage of revenue retained from existing customers, excluding expansion revenue. Also known as Gross Dollar Retention.","formulas":["GRR = (Beginning MRR - Contraction MRR - Churned MRR) / Beginning MRR × 100","GRR = Sum of min(Beginning MRR, Current MRR) per customer / Beginning MRR × 100"],"benchmarks":"- Below 80%: Severe retention problem\n- 80-85%: Below average for most segments\n- 85-90%: Average for SMB-focused businesses (Median for bootstrapped SaaS: 92%)\n- 90-95%: Good, typical for mid-market\n- 95%+: Excellent, typical for enterprise (90th percentile: 98%)","insight":"The baseline health of your customer relationships, independent of upsell. Investors examine GRR alongside NRR because strong expansion can mask high churn.","commonMistakes":null,"sources":["SaaS Metrics Standards Board: GRR: https://www.saasmetricsboard.com/gross-revenue-retention","Wall Street Prep: Gross Revenue Retention: https://www.wallstreetprep.com/knowledge/gross-revenue-retention/","ChartMogul: GRR: https://chartmogul.com/saas-metrics/grr/"],"department":"Core","category":"Retention Metrics","aliases":["GRR"],"rawMarkdown":"### Gross Revenue Retention (GRR)\n\n**Definition:** The percentage of revenue retained from existing customers, excluding expansion revenue. Also known as Gross Dollar Retention.\n\n**Calculation Methods:**\n\nTwo methods are widely used. The GASP Standard uses the **formula method** as canonical. Both run over the customers active at the start of the period.\n\n**1. Formula Method (Canonical):**\n```\nGRR = (Beginning MRR - Contraction MRR - Churned MRR) / Beginning MRR × 100\n```\n\n**2. Cohort Method (Alternative):**\nCompare the MRR of a cohort, using the lesser of beginning MRR or current MRR for each customer (this mathematically eliminates expansion while capturing shrinkage and churn).\n\n```\nGRR = Sum of min(Beginning MRR, Current MRR) per customer / Beginning MRR × 100\n```\n\n**Why they differ:** The cohort method nets each customer's movements within the period, so a customer who contracts and then expands back to their starting MRR shows no loss. The formula method counts every contraction and churn event as it happens, so it is equal to or lower than the cohort method. The formula method is canonical because it reads the same contraction and churn events as Net Revenue Retention (NRR), keeping the two retention rates on one basis. It also needs no per-customer end-of-period snapshot. Report the cohort method as a labelled alternative.\n\n**Time period:** Typically measured annually.\n\n**Annualization:** If calculating over a shorter period, annualize by raising to the appropriate power:\n- Monthly GRR annualized: `(Monthly GRR / 100) ^ 12 × 100`\n- Quarterly GRR annualized: `(Quarterly GRR / 100) ^ 4 × 100`\n\n**Critical:** GRR **cannot exceed 100%**. Unlike NRR, it does not include upsells, cross-sells or expansion. Maximum GRR = 100% (zero churn).\n\n**Benchmarks (per SaaS Capital 2025):**\n- Below 80%: Severe retention problem\n- 80-85%: Below average for most segments\n- 85-90%: Average for SMB-focused businesses (Median for bootstrapped SaaS: 92%)\n- 90-95%: Good, typical for mid-market\n- 95%+: Excellent, typical for enterprise (90th percentile: 98%)\n\n**Segment-specific (per SaaS Capital 2025):**\n- SMB: 85%+ is good\n- Mid-market/Enterprise: 90%+ is good\n- High ACV Enterprise: 95%+ expected\n\nGRR is reported per customer segment, each snapshot and event counting in the segment it carries.\n\n**Usage and consumption:** GRR runs on the same MRR base as NRR, so a prepaid commitment counts in it. Pay-as-you-go customers have no MRR and sit outside the cohort, as Snowflake keeps its on-demand customers outside its NRR. The consumption-revenue basis is [Consumption Net Revenue Retention](finance.md#consumption-net-revenue-retention).\n\n**What it tells you:** The baseline health of your customer relationships, independent of upsell. Investors examine GRR alongside NRR because strong expansion can mask high churn.\n\n**Sources:**\n- [SaaS Metrics Standards Board: GRR](https://www.saasmetricsboard.com/gross-revenue-retention)\n- [Wall Street Prep: Gross Revenue Retention](https://www.wallstreetprep.com/knowledge/gross-revenue-retention/)\n- [ChartMogul: GRR](https://chartmogul.com/saas-metrics/grr/)\n\n#### Dual-Lens Note\n\nGRR measures revenue retained from existing customers and leaves expansion out. The Operating and Market forms of other metrics differ in which expansion classifications they count, so GRR has nothing to filter. One calculation serves internal planning and investor reporting.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":"GRR measures revenue retained from existing customers and leaves expansion out. The Operating and Market forms of other metrics differ in which expansion classifications they count, so GRR has nothing to filter. One calculation serves internal planning and investor reporting."},{"name":"Logo Churn Rate (Customer Churn)","slug":"logo-churn-rate-customer-churn","definition":"The percentage of customers lost in a period. Also called customer churn or logo churn.","formulas":["Logo Churn Rate = Customers lost in period / Customers at start of period × 100"],"benchmarks":"- <1%: Good for established SaaS\n- 1-2%: Acceptable\n- 2-3%: Concerning\n- >3%: Requires attention","insight":"How many customers are leaving, regardless of their value. Important for understanding customer experience separate from revenue impact.","commonMistakes":null,"sources":["ChartMogul: Customer Churn: https://chartmogul.com/saas-metrics/customer-churn/","ChurnZero: Churn Rate: https://churnzero.com/churnopedia/churn-rate/","Maxio: Calculating Churn: https://www.maxio.com/saaspedia/calculating-churn-in-a-saas-business"],"department":"Core","category":"Retention Metrics","aliases":[],"rawMarkdown":"### Logo Churn Rate (Customer Churn)\n\n**Definition:** The percentage of customers lost in a period. Also called customer churn or logo churn.\n\n**Formula:**\n```\nLogo Churn Rate = Customers lost in period / Customers at start of period × 100\n```\n\n**Time period:** Monthly or annual basis. Always specify which.\n\n**Benchmarks (Monthly, per OpenView/High Alpha 2024):**\n- <1%: Good for established SaaS\n- 1-2%: Acceptable\n- 2-3%: Concerning\n- >3%: Requires attention\n\n**Benchmarks (Annual):**\n- <5%: Excellent\n- 5-7%: Good\n- 7-10%: Average\n- >10%: High churn\n\n**By segment (per SaaS Capital 2025):**\n- SMB: Higher churn is normal (3-5% monthly). SMB churn is ~8x higher than enterprise.\n- Mid-market: 1-2% monthly typical\n- Enterprise: <1% monthly expected\n\nLogo Churn Rate is reported per customer segment.\n\n**What it tells you:** How many customers are leaving, regardless of their value. Important for understanding customer experience separate from revenue impact.\n\n**Logo vs Revenue Churn:** Logo churn counts customers equally. Revenue churn weights by value. Losing a few high-value customers may show low logo churn but high revenue churn.\n\n**Sources:**\n- [ChartMogul: Customer Churn](https://chartmogul.com/saas-metrics/customer-churn/)\n- [ChurnZero: Churn Rate](https://churnzero.com/churnopedia/churn-rate/)\n- [Maxio: Calculating Churn](https://www.maxio.com/saaspedia/calculating-churn-in-a-saas-business)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Revenue Churn Rate","slug":"revenue-churn-rate","definition":"The percentage of MRR lost to churn and contraction in a period. Also called MRR Churn Rate.","formulas":["Revenue Churn Rate = (Churned MRR + Contraction MRR) / Beginning MRR × 100"],"benchmarks":"- <2%: Good\n- 2-5%: Average\n- >5%: High (average annual churn ~4.9% for B2B SaaS)\n\nRevenue Churn Rate is reported per customer segment.","insight":"The revenue impact of churn. If revenue churn is lower than logo churn, you're losing smaller customers (often acceptable). If higher, you're losing larger customers (concerning).","commonMistakes":null,"sources":["Wall Street Prep: Revenue Churn: https://www.wallstreetprep.com/knowledge/revenue-churn-mrr/","ChartMogul: Revenue Churn: https://chartmogul.com/saas-metrics/revenue-churn/","Maxio: MRR Churn: https://www.maxio.com/saaspedia/mrr-churn"],"department":"Core","category":"Retention Metrics","aliases":[],"rawMarkdown":"### Revenue Churn Rate\n\n**Definition:** The percentage of MRR lost to churn and contraction in a period. Also called MRR Churn Rate.\n\n**Formula:**\n```\nRevenue Churn Rate = (Churned MRR + Contraction MRR) / Beginning MRR × 100\n```\n\nThis is gross revenue churn: it measures losses only, without netting against expansion. It is the canonical formula because it isolates the leakage.\n\n**Note:** \"Net Revenue Churn\" (which subtracts expansion) can be calculated but conflates two distinct dynamics. Use NRR for the net view instead.\n\n**Benchmarks (Monthly, per OpenView 2024):**\n- <2%: Good\n- 2-5%: Average\n- >5%: High (average annual churn ~4.9% for B2B SaaS)\n\nRevenue Churn Rate is reported per customer segment.\n\n**What it tells you:** The revenue impact of churn. If revenue churn is lower than logo churn, you're losing smaller customers (often acceptable). If higher, you're losing larger customers (concerning).\n\n**Sources:**\n- [Wall Street Prep: Revenue Churn](https://www.wallstreetprep.com/knowledge/revenue-churn-mrr/)\n- [ChartMogul: Revenue Churn](https://chartmogul.com/saas-metrics/revenue-churn/)\n- [Maxio: MRR Churn](https://www.maxio.com/saaspedia/mrr-churn)\n\n#### Dual-Lens: Revenue Churn (Churn-O) and Logo Churn (Churn-M)\n\nRevenue Churn Rate and Logo Churn Rate (defined above) are the Operating and Market forms of the same underlying phenomenon: customer attrition.\n\n**Operating Form: Revenue Churn Rate (Churn-O)**\n\nMRR-weighted churn captures the economic impact of attrition. The formula is defined above: `(Churned MRR + Contraction MRR) / Beginning MRR × 100`.\n\n**CEL Source:** `Revenue_Event` where `event_type` ∈ (`churn`, `contraction`)\n\n**What it tells you:** The economic damage of attrition, which is why it is the operating form. Losing a $50K customer hits harder than losing a $500 customer.\n\n**Market Form: Logo Churn Rate (Churn-M)**\n\nCustomer-count churn treats every logo equally. The formula is defined in the Logo Churn Rate section above: `Customers lost / Customers at start × 100`.\n\n**CEL Source:** `Revenue_Event` where `event_type` = `churn` (full churn only. Contraction is not logo churn)\n\n**What it tells you:** How many customers leave, counted the simple way investors benchmark, which is why it is the market form.\n\n**Bridge:** Revenue Churn and Logo Churn are not additive. One measures dollars, the other measures logos. The diagnostic compares the two signals:\n- **Churn-O high, Churn-M low →** Losing few but high-value customers (concentration risk)\n- **Churn-M high, Churn-O low →** Losing many small customers (long-tail churn)\n- Read the pattern by customer segment to see where retention work should go.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":{"operating":{"label":"Revenue Churn Rate (Churn-O)","description":"MRR-weighted churn captures the economic impact of attrition. The formula is defined above: `(Churned MRR + Contraction MRR) / Beginning MRR × 100`.","celSource":"`Revenue_Event` where `event_type` ∈ (`churn`, `contraction`)","atlInclusion":"","formula":"(Churned MRR + Contraction MRR) / Beginning MRR × 100","insight":"The economic damage of attrition, which is why it is the operating form. Losing a $50K customer hits harder than losing a $500 customer."},"market":{"label":"Logo Churn Rate (Churn-M)","description":"Customer-count churn treats every logo equally. The formula is defined in the Logo Churn Rate section above: `Customers lost / Customers at start × 100`.","celSource":"`Revenue_Event` where `event_type` = `churn` (full churn only. Contraction is not logo churn)","atlInclusion":"","formula":"Customers lost / Customers at start × 100","insight":"How many customers leave, counted the simple way investors benchmark, which is why it is the market form."},"bridge":{"reconciliation":null,"diagnostic":"Revenue Churn and Logo Churn are not additive. One measures dollars, the other measures logos. The diagnostic compares the two signals:\n- **Churn-O high, Churn-M low →** Losing few but high-value customers (concentration risk)\n- **Churn-M high, Churn-O low →** Losing many small customers (long-tail churn)\n- Read the pattern by customer segment to see where retention work should go.\n\n---"}},"dualLensNote":null},{"name":"NPS (Net Promoter Score)","slug":"nps-net-promoter-score","definition":"A measure of customer loyalty based on likelihood to recommend.","formulas":["NPS = % Promoters - % Detractors"],"benchmarks":"- Below 0: More detractors than promoters\n- 0-30: Average (B2B SaaS average: 36-41)\n- 30-50: Good\n- 50-70: Excellent (top performers)\n- 70+: World class","insight":"A leading indicator of retention and growth. A falling NPS often shows churn risk before it reaches the revenue metrics, early enough to act. Bain & Company research links NPS to organic growth through referrals and reduced churn.","commonMistakes":["Low response rates (<20% makes data unreliable)","Survey fatigue from over-asking","Not closing the loop with detractors","Comparing across industries (benchmarks vary significantly)"],"sources":["Bain & Company: Measuring Your Net Promoter Score: https://www.netpromotersystem.com/about/measuring-your-net-promoter-score/","Wikipedia: Net Promoter Score: https://en.wikipedia.org/wiki/Net_promoter_score","Qualtrics: Net Promoter Score Guide: https://www.qualtrics.com/en-au/experience-management/customer/net-promoter-score/"],"department":"Core","category":"Retention Metrics","aliases":["NPS"],"rawMarkdown":"### NPS (Net Promoter Score)\n\n**Definition:** A measure of customer loyalty based on likelihood to recommend.\n\n**Origin:** Developed by Fred Reichheld, Bain & Company and Satmetrix (2003). Based on Harvard Business Review article \"The One Number You Need to Grow.\"\n\n**The Question:**\n\"How likely are you to recommend [product/company] to a friend or colleague?\" (0-10 scale)\n\n**Customer Categories:**\n| Category | Score | Behavior |\n|----------|-------|----------|\n| Promoters | 9-10 | Loyal, enthusiastic, will refer, drive growth |\n| Passives | 7-8 | Satisfied but vulnerable, may switch to competitors |\n| Detractors | 0-6 | Unhappy, high churn, 80%+ of negative word-of-mouth |\n\n**Formula:**\n```\nNPS = % Promoters - % Detractors\n```\n\nPassives are not included in the calculation.\n\n**Score Range:** -100 to +100\n\n**Benchmarks (per Bain & Company, CustomerGauge 2025):**\n- Below 0: More detractors than promoters\n- 0-30: Average (B2B SaaS average: 36-41)\n- 30-50: Good\n- 50-70: Excellent (top performers)\n- 70+: World class\n\n**What it tells you:** A leading indicator of retention and growth. A falling NPS often shows churn risk before it reaches the revenue metrics, early enough to act. Bain & Company research links NPS to organic growth through referrals and reduced churn.\n\n**Common mistakes:**\n- Low response rates (<20% makes data unreliable)\n- Survey fatigue from over-asking\n- Not closing the loop with detractors\n- Comparing across industries (benchmarks vary significantly)\n\n**Sources:**\n- [Bain & Company: Measuring Your Net Promoter Score](https://www.netpromotersystem.com/about/measuring-your-net-promoter-score/)\n- [Wikipedia: Net Promoter Score](https://en.wikipedia.org/wiki/Net_promoter_score)\n- [Qualtrics: Net Promoter Score Guide](https://www.qualtrics.com/en-au/experience-management/customer/net-promoter-score/)\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"CAC (Customer Acquisition Cost)","slug":"cac-customer-acquisition-cost","definition":"The total cost to acquire a new customer.","formulas":["CAC = (Sales + Marketing spend in period) / New customers acquired in period","CAC-O = Total Cost (Acquisition + Activation lifecycle) / New Customers Acquired","CAC-M = S&M Spend / New Customers Acquired","CAC-O = CAC-M + Implementation_Cost_per_Customer + Onboarding_Cost_per_Customer"],"benchmarks":"- SMB SaaS: $300-$1,000\n- Mid-market: $1,000-$5,000\n- Enterprise: $5,000-$50,000+\n- Target LTV:CAC ratio: 3:1 or higher (see LTV:CAC Ratio)","insight":"The investment required to acquire each customer.","commonMistakes":["Excluding salaries (they're a real cost)","Using wrong time period (customers acquired may not align with spend timing)","Including Customer Success costs","Mixing paid and organic (calculate separately for channel efficiency)"],"sources":["Wall Street Prep: Customer Acquisition Cost: https://www.wallstreetprep.com/knowledge/customer-acquisition-cost-cac/","Maxio: CAC Customer Acquisition Cost: https://www.maxio.com/saaspedia/cac-customer-acquisition-cost","Paddle: Customer Acquisition Cost: https://www.paddle.com/resources/customer-acquisition-cost"],"department":"Core","category":"Efficiency Metrics","aliases":["CAC"],"rawMarkdown":"### CAC (Customer Acquisition Cost)\n\n**Definition:** The total cost to acquire a new customer.\n\n**Formula:**\n```\nCAC = (Sales + Marketing spend in period) / New customers acquired in period\n```\n\n**Include:**\n- Sales salaries and commissions (for new customer acquisition)\n- Marketing salaries\n- Advertising spend\n- Marketing tools and software\n- Events and content costs\n- Trial/POC hosting costs\n\n**Exclude:**\n- Customer Success costs (retention, not acquisition)\n- Costs for existing customer expansion\n- General overhead (unless investor requires)\n\n**Allocation:** If a salesperson splits time between new and existing customers (e.g., 70/30), allocate only the acquisition portion (70%) to CAC.\n\n**By cost centre:** CAC can also be reported per cost centre, over all new customers: each row divides that centre's acquisition spend by every new customer in the period, so the rows sum to CAC.\n\n**Timing:** For long sales cycles, consider lagged CAC: spend from 60-90 days ago / customers acquired today.\n\n**What it tells you:** The investment required to acquire each customer.\n\n**Benchmarks (per First Page Sage 2025):**\n- SMB SaaS: $300-$1,000\n- Mid-market: $1,000-$5,000\n- Enterprise: $5,000-$50,000+\n- Target LTV:CAC ratio: 3:1 or higher (see LTV:CAC Ratio)\n\n**Common mistakes:**\n- Excluding salaries (they're a real cost)\n- Using wrong time period (customers acquired may not align with spend timing)\n- Including Customer Success costs\n- Mixing paid and organic (calculate separately for channel efficiency)\n\n**Sources:**\n- [Wall Street Prep: Customer Acquisition Cost](https://www.wallstreetprep.com/knowledge/customer-acquisition-cost-cac/)\n- [Maxio: CAC Customer Acquisition Cost](https://www.maxio.com/saaspedia/cac-customer-acquisition-cost)\n- [Paddle: Customer Acquisition Cost](https://www.paddle.com/resources/customer-acquisition-cost)\n\n#### Operating Form: Fully Loaded CAC (CAC-O)\n\nCAC-O includes all costs to make a customer productive: go-to-market spend plus implementation and onboarding. It is the full cost of turning a prospect into a customer who generates revenue. Implementation support during a trial or proof of concept is an activation cost: tag it `cost_function` = `implementation` and it counts in CAC-O and in the Activation Delta, outside the main CAC Include list.\n\n**CEL Source:** `Cost_Event`\n**ATL Inclusion:** `cost_function` ∈ (`gtm`, `implementation`, `onboarding`), the acquisition and activation lifecycle costs\n\n**Formula:**\n```\nCAC-O = Total Cost (Acquisition + Activation lifecycle) / New Customers Acquired\n```\n\n**What it tells you:** The full investment required to get a customer generating value. It is the CAC to use in unit economics.\n\n#### Market Form: GTM CAC (CAC-M)\n\nCAC-M includes only go-to-market costs: sales and marketing spend. This matches the investor-comparable CAC used by KeyBanc, Benchmarkit and public SaaS benchmarks.\n\n**CEL Source:** `Cost_Event`\n**ATL Inclusion:** `cost_function` = `gtm` (all sales and marketing spend, the S&M basis investors use)\n\n**Formula:**\n```\nCAC-M = S&M Spend / New Customers Acquired\n```\n\n**What it tells you:** The market-comparable acquisition cost used in LTV:CAC ratios and investor benchmarks.\n\n#### Bridge: CAC-O ↔ CAC-M\n\n**Reconciliation:**\n```\nCAC-O = CAC-M + Implementation_Cost_per_Customer + Onboarding_Cost_per_Customer\n```\n\n**Diagnostic:** The delta (CAC-O − CAC-M) is the **Activation Delta:** the cost of making customers productive, which S&M-based benchmarks leave out. A large Activation Delta means investor-comparable CAC understates what acquisition really costs. Implementation complexity, onboarding duration and services intensity drive it. SaaS Metrics Standards Board defines the Blended CAC Ratio as S&M-only (CAC-M). SaaS Capital and a16z recommend tracking fully loaded CAC (CAC-O) alongside for unit economics.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":{"operating":{"label":"Fully Loaded CAC (CAC-O)","description":"CAC-O includes all costs to make a customer productive: go-to-market spend plus implementation and onboarding. It is the full cost of turning a prospect into a customer who generates revenue. Implementation support during a trial or proof of concept is an activation cost: tag it `cost_function` = `implementation` and it counts in CAC-O and in the Activation Delta, outside the main CAC Include list.","celSource":"`Cost_Event`","atlInclusion":"`cost_function` ∈ (`gtm`, `implementation`, `onboarding`), the acquisition and activation lifecycle costs","formula":"CAC-O = Total Cost (Acquisition + Activation lifecycle) / New Customers Acquired","insight":"The full investment required to get a customer generating value. It is the CAC to use in unit economics."},"market":{"label":"GTM CAC (CAC-M)","description":"CAC-M includes only go-to-market costs: sales and marketing spend. This matches the investor-comparable CAC used by KeyBanc, Benchmarkit and public SaaS benchmarks.","celSource":"`Cost_Event`","atlInclusion":"`cost_function` = `gtm` (all sales and marketing spend, the S&M basis investors use)","formula":"CAC-M = S&M Spend / New Customers Acquired","insight":"The market-comparable acquisition cost used in LTV:CAC ratios and investor benchmarks."},"bridge":{"reconciliation":"CAC-O = CAC-M + Implementation_Cost_per_Customer + Onboarding_Cost_per_Customer","diagnostic":"The delta (CAC-O − CAC-M) is the **Activation Delta:** the cost of making customers productive, which S&M-based benchmarks leave out. A large Activation Delta means investor-comparable CAC understates what acquisition really costs. Implementation complexity, onboarding duration and services intensity drive it. SaaS Metrics Standards Board defines the Blended CAC Ratio as S&M-only (CAC-M). SaaS Capital and a16z recommend tracking fully loaded CAC (CAC-O) alongside for unit economics.\n\n---"}},"dualLensNote":null},{"name":"LTV (Customer Lifetime Value)","slug":"ltv-customer-lifetime-value","definition":"The gross profit expected from a customer over their lifetime. Also known as CLV (Customer Lifetime Value) or CLTV.","formulas":["LTV = (ARPA × Gross Margin) / Revenue Churn Rate","LTV-O = (ARPA × Contribution Margin) / Revenue Churn Rate","LTV-M = (ARPA × Gross Margin) / Revenue Churn Rate","LTV-M − LTV-O = Variable Service Costs per Customer × Customer Lifetime"],"benchmarks":null,"insight":"The upper bound of what you should spend to acquire a customer.","commonMistakes":null,"sources":["ChartMogul: Customer Lifetime Value: https://chartmogul.com/saas-metrics/ltv/","Baremetrics: Calculating LTV: https://baremetrics.com/academy/saas-calculating-ltv","Wall Street Prep: Customer Lifetime Value: https://www.wallstreetprep.com/knowledge/lifetime-value-ltv/"],"department":"Core","category":"Efficiency Metrics","aliases":["LTV","CLV","CLTV"],"rawMarkdown":"### LTV (Customer Lifetime Value)\n\n**Definition:** The gross profit expected from a customer over their lifetime. Also known as CLV (Customer Lifetime Value) or CLTV.\n\n**Formula:**\n```\nLTV = (ARPA × Gross Margin) / Revenue Churn Rate\n```\n\nWhere:\n- **ARPA** = Average Revenue Per Account (monthly)\n- **Gross Margin** = typically 70-85% for SaaS\n- **Revenue Churn Rate** = monthly churn rate\n\n**Why gross margin is included:** LTV measures profit contribution, not just revenue. Using gross margin reflects what you actually retain after delivery costs. This is the canonical formula.\n\n**What it tells you:** The upper bound of what you should spend to acquire a customer.\n\n**Limitations:**\n- Basic formula is optimistic (assumes linear churn)\n- Doesn't account for expansion revenue (understates for high-NRR companies)\n- Requires sufficient sample size for accuracy\n- Consider applying 0.75x discount for conservatism\n\n**Sources:**\n- [ChartMogul: Customer Lifetime Value](https://chartmogul.com/saas-metrics/ltv/)\n- [Baremetrics: Calculating LTV](https://baremetrics.com/academy/saas-calculating-ltv)\n- [Wall Street Prep: Customer Lifetime Value](https://www.wallstreetprep.com/knowledge/lifetime-value-ltv/)\n\n#### Operating Form: Contribution LTV (LTV-O)\n\nLTV-O uses contribution margin: revenue minus every variable cost, including implementation, onboarding, support and customer success. It is the profit a customer contributes over their lifetime.\n\n**CEL Source:** `Revenue_Event`, `Cost_Event`\n**ATL Inclusion for costs:** All variable `cost_function` values per customer\n\n**Formula:**\n```\nLTV-O = (ARPA × Contribution Margin) / Revenue Churn Rate\n```\nWhere Contribution Margin = Revenue − COGS − Implementation − Onboarding − Support − Success Engineering costs.\n\n**What it tells you:** The realistic lifetime profit from a customer after all variable delivery costs. The number to use for pricing and unit economics decisions.\n\n#### Market Form: Gross Margin LTV (LTV-M)\n\nLTV-M uses SaaS gross margin, revenue minus COGS only. This is the formula already defined above and matches investor benchmarks (the 3:1 LTV:CAC threshold uses this form).\n\n**CEL Source:** `Revenue_Event`, `Cost_Event`\n**ATL Inclusion for costs:** `cost_function` = `infrastructure` only (COGS)\n\n**Formula:**\n```\nLTV-M = (ARPA × Gross Margin) / Revenue Churn Rate\n```\n\n**What it tells you:** The investor-comparable lifetime value. The number used in LTV:CAC ratios reported to the board and in fundraising materials.\n\n**Note:** The formula defined above in this section is LTV-M. The Operating Form (LTV-O) substitutes Contribution Margin for Gross Margin.\n\n#### Bridge: LTV-O ↔ LTV-M\n\n**Reconciliation:**\n```\nLTV-M − LTV-O = Variable Service Costs per Customer × Customer Lifetime\n```\nThe gap is the lifetime profit consumed by variable service costs (implementation, onboarding, support, CS).\n\n**Diagnostic:** The delta (LTV-M − LTV-O) is the **Contribution Leakage.** Large leakage means the business model depends on services that erode unit economics. It points to services that could be productised or onboarding that could be self-serve. The canonical LTV formula in investor contexts uses gross margin (LTV-M). This is what a16z, Bessemer and SaaS Capital reference. Contribution margin LTV (LTV-O) is recommended by growth equity investors for deeper unit economics analysis.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":{"operating":{"label":"Contribution LTV (LTV-O)","description":"LTV-O uses contribution margin: revenue minus every variable cost, including implementation, onboarding, support and customer success. It is the profit a customer contributes over their lifetime.","celSource":"`Revenue_Event`, `Cost_Event`","atlInclusion":"All variable `cost_function` values per customer","formula":"LTV-O = (ARPA × Contribution Margin) / Revenue Churn Rate","insight":"The realistic lifetime profit from a customer after all variable delivery costs. The number to use for pricing and unit economics decisions."},"market":{"label":"Gross Margin LTV (LTV-M)","description":"LTV-M uses SaaS gross margin, revenue minus COGS only. This is the formula already defined above and matches investor benchmarks (the 3:1 LTV:CAC threshold uses this form).","celSource":"`Revenue_Event`, `Cost_Event`","atlInclusion":"`cost_function` = `infrastructure` only (COGS)","formula":"LTV-M = (ARPA × Gross Margin) / Revenue Churn Rate","insight":"The investor-comparable lifetime value. The number used in LTV:CAC ratios reported to the board and in fundraising materials."},"bridge":{"reconciliation":"LTV-M − LTV-O = Variable Service Costs per Customer × Customer Lifetime","diagnostic":"The delta (LTV-M − LTV-O) is the **Contribution Leakage.** Large leakage means the business model depends on services that erode unit economics. It points to services that could be productised or onboarding that could be self-serve. The canonical LTV formula in investor contexts uses gross margin (LTV-M). This is what a16z, Bessemer and SaaS Capital reference. Contribution margin LTV (LTV-O) is recommended by growth equity investors for deeper unit economics analysis.\n\n---"}},"dualLensNote":null},{"name":"LTV:CAC Ratio","slug":"ltvcac-ratio","definition":"The ratio of customer lifetime value to acquisition cost. Measures the return on investment from sales and marketing spend.","formulas":["LTV:CAC = LTV / CAC","LTV:CAC-O = LTV-O / CAC-O","LTV:CAC-M = LTV-M / CAC-M","LTV:CAC-O = LTV:CAC-M × (LTV-O / LTV-M) × (CAC-M / CAC-O)"],"benchmarks":"- Below 1:1: Losing money on every customer\n- 1:1 to 2:1: Breaking even or marginal, concerning to investors\n- 3:1 to 4:1: Industry standard, healthy sustainable growth (Median B2B SaaS: 3.2:1)\n- 4:1 to 5:1: Strong business model\n- Above 5:1: Under-investing in growth; could be growing faster","insight":"Unit economics health. Are customers worth more than they cost to acquire?","commonMistakes":null,"sources":["Wall Street Prep: LTV/CAC Ratio: https://www.wallstreetprep.com/knowledge/ltv-cac-ratio/","SaaS Capital: LTV/CAC Benchmarks: https://www.saas-capital.com/blog-posts/ltv-to-cac-ratio/","Corporate Finance Institute: LTV/CAC: https://corporatefinanceinstitute.com/resources/valuation/ltv-cac-ratio/"],"department":"Core","category":"Efficiency Metrics","aliases":[],"rawMarkdown":"### LTV:CAC Ratio\n\n**Definition:** The ratio of customer lifetime value to acquisition cost. Measures the return on investment from sales and marketing spend.\n\n**Formula:**\n```\nLTV:CAC = LTV / CAC\n```\n\nExpress as ratio (e.g., \"3:1\" or \"3.0x\").\n\n**Benchmarks (per Optifai 2025, Wall Street Prep):**\n- Below 1:1: Losing money on every customer\n- 1:1 to 2:1: Breaking even or marginal, concerning to investors\n- 3:1 to 4:1: Industry standard, healthy sustainable growth (Median B2B SaaS: 3.2:1)\n- 4:1 to 5:1: Strong business model\n- Above 5:1: Under-investing in growth; could be growing faster\n\n**What it tells you:** Unit economics health. Are customers worth more than they cost to acquire?\n\n**Important:** Higher is not always better. A very high ratio (5:1+) suggests you're leaving growth on the table by not investing enough in acquisition.\n\n**Sources:**\n- [Wall Street Prep: LTV/CAC Ratio](https://www.wallstreetprep.com/knowledge/ltv-cac-ratio/)\n- [SaaS Capital: LTV/CAC Benchmarks](https://www.saas-capital.com/blog-posts/ltv-to-cac-ratio/)\n- [Corporate Finance Institute: LTV/CAC](https://corporatefinanceinstitute.com/resources/valuation/ltv-cac-ratio/)\n\n#### Operating Form: Contribution LTV:CAC (LTV:CAC-O)\n\nLTV:CAC-O divides Contribution LTV by Fully Loaded CAC. Both sides carry the cost of making a customer productive: the numerator loses the variable service costs over the lifetime and the denominator gains implementation and onboarding.\n\n**CEL Source:** `Revenue_Event`, `Cost_Event`\n**ATL Inclusion for costs:** LTV-O margin costs (`infrastructure`, `support`, `success_engineering`, `implementation`, `onboarding`); CAC-O costs (`gtm`, `implementation`, `onboarding`)\n\n**Formula:**\n```\nLTV:CAC-O = LTV-O / CAC-O\n```\n\n**What it tells you:** The return on acquisition spend after every variable cost of acquiring and serving a customer. The ratio to use for pricing, packaging and services investment decisions.\n\n#### Market Form: Gross Margin LTV:CAC (LTV:CAC-M)\n\nLTV:CAC-M divides Gross Margin LTV by GTM CAC. This is the ratio investors benchmark and the form the 3:1 threshold above assumes.\n\n**CEL Source:** `Revenue_Event`, `Cost_Event`\n**ATL Inclusion for costs:** LTV-M margin costs (`infrastructure` only); CAC-M costs (`gtm` only)\n\n**Formula:**\n```\nLTV:CAC-M = LTV-M / CAC-M\n```\n\n**What it tells you:** The investor-comparable unit economics ratio reported to the board and in fundraising materials.\n\n#### Bridge: LTV:CAC-O ↔ LTV:CAC-M\n\n**Reconciliation:**\n```\nLTV:CAC-O = LTV:CAC-M × (LTV-O / LTV-M) × (CAC-M / CAC-O)\n```\nThe two factors are the Contribution Leakage on the LTV side and the Activation Delta on the CAC side.\n\n**Diagnostic:** The gap between LTV:CAC-M and LTV:CAC-O shows how much of the headline ratio depends on human delivery costs that S&M-based benchmarks leave out. A business at 3:1 on the market form and well under 2:1 on the operating form is buying growth with services effort. Report LTV:CAC-M for comparability and manage to LTV:CAC-O.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":{"operating":{"label":"Contribution LTV:CAC (LTV:CAC-O)","description":"LTV:CAC-O divides Contribution LTV by Fully Loaded CAC. Both sides carry the cost of making a customer productive: the numerator loses the variable service costs over the lifetime and the denominator gains implementation and onboarding.","celSource":"`Revenue_Event`, `Cost_Event`","atlInclusion":"LTV-O margin costs (`infrastructure`, `support`, `success_engineering`, `implementation`, `onboarding`); CAC-O costs (`gtm`, `implementation`, `onboarding`)","formula":"LTV:CAC-O = LTV-O / CAC-O","insight":"The return on acquisition spend after every variable cost of acquiring and serving a customer. The ratio to use for pricing, packaging and services investment decisions."},"market":{"label":"Gross Margin LTV:CAC (LTV:CAC-M)","description":"LTV:CAC-M divides Gross Margin LTV by GTM CAC. This is the ratio investors benchmark and the form the 3:1 threshold above assumes.","celSource":"`Revenue_Event`, `Cost_Event`","atlInclusion":"LTV-M margin costs (`infrastructure` only); CAC-M costs (`gtm` only)","formula":"LTV:CAC-M = LTV-M / CAC-M","insight":"The investor-comparable unit economics ratio reported to the board and in fundraising materials."},"bridge":{"reconciliation":"LTV:CAC-O = LTV:CAC-M × (LTV-O / LTV-M) × (CAC-M / CAC-O)","diagnostic":"The gap between LTV:CAC-M and LTV:CAC-O shows how much of the headline ratio depends on human delivery costs that S&M-based benchmarks leave out. A business at 3:1 on the market form and well under 2:1 on the operating form is buying growth with services effort. Report LTV:CAC-M for comparability and manage to LTV:CAC-O.\n\n---"}},"dualLensNote":null},{"name":"CAC Payback Period","slug":"cac-payback-period","definition":"The number of months required to recover the cost of acquiring a customer. Also called \"Months to Recover CAC\" or \"Time to Recover CAC.\"","formulas":["CAC Payback = CAC / (ARPA × Gross Margin)","CAC Payback-O = CAC-O / (ARPA × GM-O)","CAC Payback-M = CAC-M / (ARPA × GM-M)","CAC Payback-O = CAC Payback-M × (CAC-O / CAC-M) × (GM-M / GM-O)"],"benchmarks":"- Under 12 months: Good, investor-friendly target (best-in-class)\n- 12-18 months: Acceptable (Median 2024: 18-20 months)\n- 18-24 months: Concerning for most segments\n- Over 24 months: Requires attention","insight":"How many months of gross profit a new customer takes to repay what it cost to win. Payback sets how much cash growth ties up, so it limits how fast a company can grow on its own money.","commonMistakes":null,"sources":["Wall Street Prep: CAC Payback Period: https://www.wallstreetprep.com/knowledge/cac-payback-period/","Maxio: CAC Payback: https://www.maxio.com/saaspedia/cac-payback","Corporate Finance Institute: CAC Payback Period: https://corporatefinanceinstitute.com/resources/valuation/cac-payback-period/"],"department":"Core","category":"Efficiency Metrics","aliases":["CAC"],"rawMarkdown":"### CAC Payback Period\n\n**Definition:** The number of months required to recover the cost of acquiring a customer. Also called \"Months to Recover CAC\" or \"Time to Recover CAC.\"\n\n**Formula:**\n```\nCAC Payback = CAC / (ARPA × Gross Margin)\n```\n\nResult in months.\n\n**Why include Gross Margin:** Using gross margin (not just revenue) reflects actual profit recovery. Without it, payback appears shorter than reality.\n\n**Benchmarks (per Benchmarkit 2025, KeyBanc 2024):**\n- Under 12 months: Good, investor-friendly target (best-in-class)\n- 12-18 months: Acceptable (Median 2024: 18-20 months)\n- 18-24 months: Concerning for most segments\n- Over 24 months: Requires attention\n\n**By segment:**\n- SMB: 8-12 months typical\n- Mid-market: 14-18 months typical\n- Enterprise: 18-24 months typical (longer sales cycles)\n\n**What it tells you:** How many months of gross profit a new customer takes to repay what it cost to win. Payback sets how much cash growth ties up, so it limits how fast a company can grow on its own money.\n\n**Sources:**\n- [Wall Street Prep: CAC Payback Period](https://www.wallstreetprep.com/knowledge/cac-payback-period/)\n- [Maxio: CAC Payback](https://www.maxio.com/saaspedia/cac-payback)\n- [Corporate Finance Institute: CAC Payback Period](https://corporatefinanceinstitute.com/resources/valuation/cac-payback-period/)\n\n#### Operating Form: Fully Loaded CAC Payback (CAC Payback-O)\n\nCAC Payback-O recovers Fully Loaded CAC from contribution margin. Implementation and onboarding cost raise the amount to recover and variable service costs lower the monthly margin that recovers it.\n\n**CEL Source:** `Revenue_Event`, `Cost_Event`\n**ATL Inclusion for costs:** CAC-O costs (`gtm`, `implementation`, `onboarding`); GM-O costs (`infrastructure`, `support`, `success_engineering`, `implementation`, `onboarding`)\n\n**Formula:**\n```\nCAC Payback-O = CAC-O / (ARPA × GM-O)\n```\n\n**What it tells you:** How long a customer really takes to pay back everything spent to win and activate it. The number for cash planning.\n\n#### Market Form: GTM CAC Payback (CAC Payback-M)\n\nCAC Payback-M recovers GTM CAC from SaaS gross margin. It matches the payback period Benchmarkit and KeyBanc report and the benchmarks above.\n\n**CEL Source:** `Revenue_Event`, `Cost_Event`\n**ATL Inclusion for costs:** CAC-M costs (`gtm` only); GM-M costs (`infrastructure` only)\n\n**Formula:**\n```\nCAC Payback-M = CAC-M / (ARPA × GM-M)\n```\n\n**What it tells you:** The investor-comparable payback period used in benchmarks and board reporting.\n\n#### Bridge: CAC Payback-O ↔ CAC Payback-M\n\n**Reconciliation:**\n```\nCAC Payback-O = CAC Payback-M × (CAC-O / CAC-M) × (GM-M / GM-O)\n```\nARPA is the same in both forms, so the gap comes from the Activation Delta and the Services Drag alone.\n\n**Diagnostic:** A payback that looks healthy on the market form and runs months longer on the operating form means activation and service costs are tying up cash the S&M view does not show. The ratio CAC-O / CAC-M isolates the acquisition side; GM-M / GM-O isolates the delivery side.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":{"operating":{"label":"Fully Loaded CAC Payback (CAC Payback-O)","description":"CAC Payback-O recovers Fully Loaded CAC from contribution margin. Implementation and onboarding cost raise the amount to recover and variable service costs lower the monthly margin that recovers it.","celSource":"`Revenue_Event`, `Cost_Event`","atlInclusion":"CAC-O costs (`gtm`, `implementation`, `onboarding`); GM-O costs (`infrastructure`, `support`, `success_engineering`, `implementation`, `onboarding`)","formula":"CAC Payback-O = CAC-O / (ARPA × GM-O)","insight":"How long a customer really takes to pay back everything spent to win and activate it. The number for cash planning."},"market":{"label":"GTM CAC Payback (CAC Payback-M)","description":"CAC Payback-M recovers GTM CAC from SaaS gross margin. It matches the payback period Benchmarkit and KeyBanc report and the benchmarks above.","celSource":"`Revenue_Event`, `Cost_Event`","atlInclusion":"CAC-M costs (`gtm` only); GM-M costs (`infrastructure` only)","formula":"CAC Payback-M = CAC-M / (ARPA × GM-M)","insight":"The investor-comparable payback period used in benchmarks and board reporting."},"bridge":{"reconciliation":"CAC Payback-O = CAC Payback-M × (CAC-O / CAC-M) × (GM-M / GM-O)","diagnostic":"A payback that looks healthy on the market form and runs months longer on the operating form means activation and service costs are tying up cash the S&M view does not show. The ratio CAC-O / CAC-M isolates the acquisition side; GM-M / GM-O isolates the delivery side.\n\n---"}},"dualLensNote":null},{"name":"Gross Margin","slug":"gross-margin","definition":"Revenue minus cost of goods sold (COGS), as a percentage of revenue. Measures profitability after direct delivery costs.","formulas":["Gross Margin = (Revenue (GAAP) - COGS) / Revenue (GAAP) × 100","GM-O = (Revenue − COGS − Support − CS − Implementation − Onboarding) / Revenue × 100","GM-M = (Revenue − COGS) / Revenue × 100","GM-M = GM-O + (Support + CS + Implementation + Onboarding costs) / Revenue × 100"],"benchmarks":"- Below 60%: Low, may indicate infrastructure-heavy or services-heavy business\n- 60-70%: Moderate (Seed/Series A acceptable while scaling)\n- 70-80%: Good, typical for SaaS (Most VCs require 70%+ for investment)\n- 75-80%: Series B+ expected, attractive to investors\n- 80-85%: Best-in-class (commands valuation premium)","insight":"How much of each dollar of revenue is available after delivery costs. Higher margins = more scalable business.","commonMistakes":null,"sources":["The SaaS CFO: How to Calculate SaaS Gross Margin: https://www.thesaascfo.com/how-to-calculate-saas-gross-margin/","CloudZero: SaaS Gross Margin: https://www.cloudzero.com/blog/saas-gross-margin/","Drivetrain: SaaS Gross Margin: https://www.drivetrain.ai/strategic-finance-glossary/saas-gross-margin"],"department":"Core","category":"Efficiency Metrics","aliases":[],"rawMarkdown":"### Gross Margin\n\n**Definition:** Revenue minus cost of goods sold (COGS), as a percentage of revenue. Measures profitability after direct delivery costs.\n\n**Formula:**\n```\nGross Margin = (Revenue (GAAP) - COGS) / Revenue (GAAP) × 100\n```\n\n**Note:** Use GAAP-recognized revenue, not MRR/ARR. Gross Margin is a financial statement metric.\n\n**Include in COGS** (ATL `cost_function` = `infrastructure`):\n- Hosting/infrastructure costs (AWS, Azure, etc.)\n- DevOps team costs that keep the service running\n- Payment processing fees\n- Third-party software for product delivery\n- Capitalized software amortization\n\n**Exclude from COGS:**\n- Customer Support and Customer Success teams (`cost_function` = `support`, `success_engineering`). These are subtracted in the Operating Form below, not in COGS.\n- Implementation and onboarding (`cost_function` = `implementation`, `onboarding`). Also Operating Form.\n- Sales & Marketing expenses (`gtm`)\n- R&D (product development)\n- G&A overhead\n\n**COGS Test:** \"Can customers still access and use the application if I don't pay this expense?\" If no, include in COGS.\n\n**Fully burdened:** COGS teams include all costs: wages, bonuses, payroll taxes, benefits, travel, training, internal tools.\n\nThe canonical Gross Margin is the Market Form (GM-M) below. Companies that allocate Support and CS to COGS in their financial statements should report that figure as GM-O (contribution margin), which is where those costs belong in GASP.\n\n**Benchmarks (per CloudZero 2025, industry surveys):**\n- Below 60%: Low, may indicate infrastructure-heavy or services-heavy business\n- 60-70%: Moderate (Seed/Series A acceptable while scaling)\n- 70-80%: Good, typical for SaaS (Most VCs require 70%+ for investment)\n- 75-80%: Series B+ expected, attractive to investors\n- 80-85%: Best-in-class (commands valuation premium)\n\n**What it tells you:** How much of each dollar of revenue is available after delivery costs. Higher margins = more scalable business.\n\n**Sources:**\n- [The SaaS CFO: How to Calculate SaaS Gross Margin](https://www.thesaascfo.com/how-to-calculate-saas-gross-margin/)\n- [CloudZero: SaaS Gross Margin](https://www.cloudzero.com/blog/saas-gross-margin/)\n- [Drivetrain: SaaS Gross Margin](https://www.drivetrain.ai/strategic-finance-glossary/saas-gross-margin)\n\n#### Operating Form: Contribution Margin (GM-O)\n\nContribution Margin is revenue minus every variable cost of serving customers. It shows what each customer earns after the costs that grow with the customer base.\n\n**CEL Source:** `Revenue_Event`, `Cost_Event`\n**ATL Inclusion for costs:** `cost_function` ∈ (`infrastructure`, `support`, `success_engineering`, `implementation`, `onboarding`)\n\n**Formula:**\n```\nGM-O = (Revenue − COGS − Support − CS − Implementation − Onboarding) / Revenue × 100\n```\nTypical range: 50-70% for SaaS.\n\n**What it tells you:** How much profit each customer generates after every variable delivery cost, which is why it is the operating form.\n\n#### Market Form: SaaS Gross Margin (GM-M)\n\nSaaS Gross Margin is revenue minus COGS only (hosting, infrastructure and payment processing). It matches financial statement reporting and investor benchmarks.\n\n**CEL Source:** `Revenue_Event`, `Cost_Event`\n**ATL Inclusion for costs:** `cost_function` = `infrastructure`\n\n**Formula:**\n```\nGM-M = (Revenue − COGS) / Revenue × 100\n```\nTypical range: 70-85% for SaaS.\n\n**What it tells you:** The market-comparable gross margin that investors expect at 70%+ for SaaS businesses.\n\n**Note:** The canonical Gross Margin above equals GM-M. GM-O subtracts the human delivery costs (Support, CS, Implementation, Onboarding) that some companies allocate to COGS in their statements; GASP keeps them out of COGS so the two forms reconcile exactly through the bridge below.\n\n#### Bridge: GM-O ↔ GM-M\n\n**Reconciliation:**\n```\nGM-M = GM-O + (Support + CS + Implementation + Onboarding costs) / Revenue × 100\n```\n\n**Diagnostic:** The delta (GM-M − GM-O) is the **Services Drag:** the cost of running a customer operation that depends on people. A delta that declines over time points to more automation and self-serve adoption. SaaS Capital 2025 guidance on COGS allocation supports both approaches. VCs typically expect 70%+ SaaS gross margin (GM-M) while internal teams should track contribution margin (GM-O) for pricing and unit economics.\n\n---","signalType":"outcome","signalTypeSecondary":"efficiency","dualLens":{"operating":{"label":"Contribution Margin (GM-O)","description":"Contribution Margin is revenue minus every variable cost of serving customers. It shows what each customer earns after the costs that grow with the customer base.","celSource":"`Revenue_Event`, `Cost_Event`","atlInclusion":"`cost_function` ∈ (`infrastructure`, `support`, `success_engineering`, `implementation`, `onboarding`)","formula":"GM-O = (Revenue − COGS − Support − CS − Implementation − Onboarding) / Revenue × 100","insight":"How much profit each customer generates after every variable delivery cost, which is why it is the operating form."},"market":{"label":"SaaS Gross Margin (GM-M)","description":"SaaS Gross Margin is revenue minus COGS only (hosting, infrastructure and payment processing). It matches financial statement reporting and investor benchmarks.","celSource":"`Revenue_Event`, `Cost_Event`","atlInclusion":"`cost_function` = `infrastructure`","formula":"GM-M = (Revenue − COGS) / Revenue × 100","insight":"The market-comparable gross margin that investors expect at 70%+ for SaaS businesses."},"bridge":{"reconciliation":"GM-M = GM-O + (Support + CS + Implementation + Onboarding costs) / Revenue × 100","diagnostic":"The delta (GM-M − GM-O) is the **Services Drag:** the cost of running a customer operation that depends on people. A delta that declines over time points to more automation and self-serve adoption. SaaS Capital 2025 guidance on COGS allocation supports both approaches. VCs typically expect 70%+ SaaS gross margin (GM-M) while internal teams should track contribution margin (GM-O) for pricing and unit economics.\n\n---"}},"dualLensNote":null},{"name":"Rule of 40","slug":"rule-of-40","definition":"A heuristic that balances growth and profitability. A healthy SaaS company's growth rate plus profit margin should equal 40% or more.","formulas":["Rule of 40 = ARR Growth Rate (YoY %) + EBITDA Margin (%)"],"benchmarks":"- Below 20: Struggling (Median public SaaS Q1 2025: 12-15%)\n- 20-40: Developing (Median mid-2024: 34%)\n- 40+: Healthy balance of growth and profitability\n- 60+: Elite (top quartile: 45%+ growth component)","insight":"Whether you're balancing growth and profitability appropriately. You can grow fast and lose money, or grow slow and be profitable, but the sum should hit 40.","commonMistakes":null,"sources":["Wall Street Prep: Rule of 40: https://www.wallstreetprep.com/knowledge/rule-of-40/","The SaaS CFO: Rule of 40: https://www.thesaascfo.com/rule-of-40-saas/","Corporate Finance Institute: Rule of 40: https://corporatefinanceinstitute.com/resources/valuation/rule-of-40/"],"department":"Core","category":"Efficiency Metrics","aliases":[],"rawMarkdown":"### Rule of 40\n\n**Definition:** A heuristic that balances growth and profitability. A healthy SaaS company's growth rate plus profit margin should equal 40% or more.\n\n**Formula:**\n```\nRule of 40 = ARR Growth Rate (YoY %) + EBITDA Margin (%)\n```\n\nWhere:\n- **ARR Growth Rate** = (Current ARR - ARR 12 months ago) / ARR 12 months ago × 100\n- **EBITDA Margin** = EBITDA / Revenue (GAAP) × 100\n\n**Component definitions:**\n- **ARR Growth Rate:** Year-over-year percentage change in ARR. Use ARR (not MRR or GAAP revenue) for consistency with SaaS valuation standards.\n- **EBITDA Margin:** EBITDA as a percentage of GAAP revenue. EBITDA is the most common choice; FCF margin is an acceptable alternative but must be disclosed.\n\n**Origin:** Coined by Brad Feld (2015), heard from a late-stage investor.\n\n**Applicability:** Use when company reaches ~$1M MRR / $12M ARR. Not meaningful for early-stage startups.\n\n**Examples of hitting 40%:**\n- 60% growth + (-20%) margin = 40% (high growth, investing)\n- 20% growth + 20% margin = 40% (balanced)\n- 5% growth + 35% margin = 40% (mature, profitable)\n\n**Benchmarks (per McKinsey, Meritech Capital 2024):**\n- Below 20: Struggling (Median public SaaS Q1 2025: 12-15%)\n- 20-40: Developing (Median mid-2024: 34%)\n- 40+: Healthy balance of growth and profitability\n- 60+: Elite (top quartile: 45%+ growth component)\n\n**What it tells you:** Whether you're balancing growth and profitability appropriately. You can grow fast and lose money, or grow slow and be profitable, but the sum should hit 40.\n\n**Limitations:**\n- The \"40\" is arbitrary, not scientifically derived\n- Should not be used as pass/fail\n- Context matters (vertical vs horizontal, market conditions)\n\n**Sources:**\n- [Wall Street Prep: Rule of 40](https://www.wallstreetprep.com/knowledge/rule-of-40/)\n- [The SaaS CFO: Rule of 40](https://www.thesaascfo.com/rule-of-40-saas/)\n- [Corporate Finance Institute: Rule of 40](https://corporatefinanceinstitute.com/resources/valuation/rule-of-40/)\n\n#### Dual-Lens Note\n\nThe Rule of 40 is a composite metric. Its dual-lens behaviour is inherited from its inputs:\n\n- **Rule of 40-O** = ARR-O Growth Rate + Contribution Margin (GM-O)\n- **Rule of 40-M** = ARR-M Growth Rate + EBITDA Margin\n\nA company with 30% ARR growth and heavy implementation costs might report Rule of 40-M = 45 (healthy) while Rule of 40-O = 32 (below threshold). The gap shows whether the balance of growth and profitability holds once delivery costs are counted. No separate O/M inclusion rules are needed. Use the ARR and Gross Margin forms defined above.\n\n---","signalType":"outcome","signalTypeSecondary":"efficiency","dualLens":null,"dualLensNote":"The Rule of 40 is a composite metric. Its dual-lens behaviour is inherited from its inputs:\n\n- **Rule of 40-O** = ARR-O Growth Rate + Contribution Margin (GM-O)\n- **Rule of 40-M** = ARR-M Growth Rate + EBITDA Margin\n\nA company with 30% ARR growth and heavy implementation costs might report Rule of 40-M = 45 (healthy) while Rule of 40-O = 32 (below threshold). The gap shows whether the balance of growth and profitability holds once delivery costs are counted. No separate O/M inclusion rules are needed. Use the ARR and Gross Margin forms defined above."},{"name":"Net Revenue Retention (NRR)","slug":"net-revenue-retention-nrr","definition":"The percentage of revenue retained from existing customers over a period, including expansion, contraction and churn. Also known as Net Dollar Retention (NDR).","formulas":["NRR = MRR of cohort today / MRR of same cohort 12 months ago × 100","NRR = (Beginning MRR + Expansion MRR - Contraction MRR - Churned MRR) / Beginning MRR × 100","NRR-O = MRR of cohort today (organic only) / MRR of same cohort 12 months ago × 100","NRR-M = MRR of cohort today (all expansion types and cohort reactivation) / MRR of same cohort 12 months ago × 100","NRR-M = (Beginning MRR + All Expansion MRR + Cohort Reactivation MRR − Contraction MRR − Churned MRR) / Beginning MRR × 100","NRR-M ≈ NRR-O + Reactivation + Cross-Module + New Buying Centre + Pricing Adjustment + Recontracting expansion"],"benchmarks":"- Below 90%: Leaky bucket. Growth requires constant new acquisition.\n- 90-100%: Stable. You keep what you have.\n- 100-110%: Good. Existing customers grow. (Median for VC-backed SaaS: 101-106%)\n- 110-120%: Great. Strong expansion motion.\n- 120%+: Exceptional. Top quartile performance.","insight":"Whether the customers you had a year ago are paying you more or less today. Above 100%, the existing base grows on its own and new customers add on top; below it, new sales first have to replace what the base lost.","commonMistakes":["Calculating over inconsistent time periods","Including new customer revenue (that's not NRR)","Excluding small customers or segments","Confusing with Gross Revenue Retention (GRR)"],"sources":["SaaS Metrics Standards Board: NRR: https://www.saasmetricsboard.com/net-revenue-retention","Wall Street Prep: Net Revenue Retention: https://www.wallstreetprep.com/knowledge/net-revenue-retention-nrr/","ChurnZero: Net Revenue Retention: https://churnzero.com/churnopedia/net-revenue-retention/"],"department":"Customer Success","category":"Retention Metrics","aliases":["NRR","NDR"],"rawMarkdown":"### Net Revenue Retention (NRR)\n\nSee [Core Metrics](core.md#net-revenue-retention-nrr) for full definition.\n\nCustomer Success owns NRR as the primary outcome metric.\n\n---","signalType":"outcome","signalTypeSecondary":"efficiency","dualLens":null,"dualLensNote":null},{"name":"Gross Revenue Retention (GRR)","slug":"gross-revenue-retention-grr","definition":"The percentage of revenue retained from existing customers, excluding expansion revenue. Also known as Gross Dollar Retention.","formulas":["GRR = (Beginning MRR - Contraction MRR - Churned MRR) / Beginning MRR × 100","GRR = Sum of min(Beginning MRR, Current MRR) per customer / Beginning MRR × 100"],"benchmarks":"- Below 80%: Severe retention problem\n- 80-85%: Below average for most segments\n- 85-90%: Average for SMB-focused businesses (Median for bootstrapped SaaS: 92%)\n- 90-95%: Good, typical for mid-market\n- 95%+: Excellent, typical for enterprise (90th percentile: 98%)","insight":"The baseline health of your customer relationships, independent of upsell. Investors examine GRR alongside NRR because strong expansion can mask high churn.","commonMistakes":null,"sources":["SaaS Metrics Standards Board: GRR: https://www.saasmetricsboard.com/gross-revenue-retention","Wall Street Prep: Gross Revenue Retention: https://www.wallstreetprep.com/knowledge/gross-revenue-retention/","ChartMogul: GRR: https://chartmogul.com/saas-metrics/grr/"],"department":"Customer Success","category":"Retention Metrics","aliases":["GRR"],"rawMarkdown":"### Gross Revenue Retention (GRR)\n\nSee [Core Metrics](core.md#gross-revenue-retention-grr) for full definition.\n\nGRR shows retention with expansion taken out.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Logo Retention Rate","slug":"logo-retention-rate","definition":"The percentage of customers retained over a period.","formulas":["Logo Retention Rate = (Customers at end - New customers) / Customers at start × 100","Logo Retention Rate = 100% - Logo Churn Rate"],"benchmarks":null,"insight":"How many customer relationships you keep, whatever each one is worth.","commonMistakes":null,"sources":[],"department":"Customer Success","category":"Retention Metrics","aliases":[],"rawMarkdown":"### Logo Retention Rate\n\n**Definition:** The percentage of customers retained over a period.\n\n**Formula:**\n```\nLogo Retention Rate = (Customers at end - New customers) / Customers at start × 100\n```\n\nOr simply:\n```\nLogo Retention Rate = 100% - Logo Churn Rate\n```\n\nLogo Retention Rate is reported per customer segment.\n\n**What it tells you:** How many customer relationships you keep, whatever each one is worth.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Customer Health Score","slug":"customer-health-score","definition":"A composite score predicting likelihood of retention or churn.","formulas":["Health Score (per account) = Weighted average of health indicators, scaled 0 to 100\nHealth Score (portfolio) = Average health score of active customers at period end"],"benchmarks":null,"insight":"Which customers need attention before they churn.","commonMistakes":null,"sources":["Gainsight: Customer Health Score: https://www.gainsight.com/blog/customer-health-score/","Vitally: Customer Health Score Guide: https://www.vitally.io/post/how-to-create-a-customer-health-score-with-four-metrics","Custify: Customer Health Score Guide: https://www.custify.com/blog/customer-health-score-guide/"],"department":"Customer Success","category":"Health Metrics","aliases":[],"rawMarkdown":"### Customer Health Score\n\n**Definition:** A composite score predicting likelihood of retention or churn.\n\n**Formula:**\n```\nHealth Score (per account) = Weighted average of health indicators, scaled 0 to 100\nHealth Score (portfolio) = Average health score of active customers at period end\n```\n\nThe per-account composite is built upstream and lands on the customer record as one score from 0 to 100. The portfolio Health Score is the average of that score across active customers, reported for the whole base and per customer segment.\n\n**Core indicators (choose 5-10):**\n| Indicator | Typical Weight | What it measures |\n|-----------|----------------|------------------|\n| Product usage frequency | 25-35% | Are they using it regularly? |\n| Feature adoption depth | 15-25% | Are they using key features? |\n| Support sentiment | 10-20% | Are support interactions positive? |\n| Engagement/responsiveness | 10-15% | Do they respond to outreach? |\n| Contract/renewal status | 5-15% | How long until renewal? |\n| Payment health | 5-10% | Do they pay on time? |\n| Onboarding completion | 5-10% | Did they fully onboard? |\n\n**Important:** Weights should be customized based on correlation with actual churn in your business. Usage and adoption typically carry the most weight. Segment customers (by size, industry, lifecycle stage) for more accurate scoring.\n\n**Reference weighting (a starting point, not canon):** for a team building its first score. The weights are yours: replace them once you can test each signal against your own churn.\n\n| Signal group | Reference weight | What it covers |\n|--------------|------------------|----------------|\n| Usage | 35% | Frequency and depth of product use, including adoption of key features |\n| Engagement | 25% | Responsiveness to outreach, QBR attendance and an engaged executive sponsor |\n| Support | 20% | Ticket volume trend, escalations and support sentiment |\n| Commercial | 20% | Payment health, renewal status and expansion or contraction history |\n\n**Scoring:**\n- 0-40: At risk (red)\n- 40-70: Needs attention (yellow)\n- 70-100: Healthy (green)\n\n**What it tells you:** Which customers need attention before they churn.\n\n**Industry adoption:** Only ~42% of CS teams track health scores, despite evidence that AI-enhanced scoring can predict churn 3-6 months in advance with 85%+ accuracy.\n\n**Sources:**\n- [Gainsight: Customer Health Score](https://www.gainsight.com/blog/customer-health-score/)\n- [Vitally: Customer Health Score Guide](https://www.vitally.io/post/how-to-create-a-customer-health-score-with-four-metrics)\n- [Custify: Customer Health Score Guide](https://www.custify.com/blog/customer-health-score-guide/)\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Health Score Coverage","slug":"health-score-coverage","definition":"The percentage of active customers that have a health score.","formulas":["Health Score Coverage = Customers with health score / Total customers × 100"],"benchmarks":null,"insight":"Whether you have visibility into customer health.","commonMistakes":null,"sources":[],"department":"Customer Success","category":"Health Metrics","aliases":[],"rawMarkdown":"### Health Score Coverage\n\n**Definition:** The percentage of active customers that have a health score.\n\n**Formula:**\n```\nHealth Score Coverage = Customers with health score / Total customers × 100\n```\n\nHealth Score Coverage is reported per customer segment.\n\n**Target:** 100% of managed accounts, or all accounts above a revenue threshold.\n\n**What it tells you:** Whether you have visibility into customer health.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"At-Risk Customer Rate","slug":"at-risk-customer-rate","definition":"The percentage of customers flagged as at-risk.","formulas":["At-Risk Rate = Customers with health score < 40 / Total scored customers × 100"],"benchmarks":"- Below 5%: Healthy portfolio\n- 5-10%: Normal, requires attention\n- 10-20%: Elevated risk\n- Above 20%: Portfolio in trouble","insight":null,"commonMistakes":null,"sources":[],"department":"Customer Success","category":"Health Metrics","aliases":[],"rawMarkdown":"### At-Risk Customer Rate\n\n**Definition:** The percentage of customers flagged as at-risk.\n\n**Formula:**\n```\nAt-Risk Rate = Customers with health score < 40 / Total scored customers × 100\n```\n\nAt-Risk Customer Rate is reported per customer segment.\n\n**Variant `entered_at_risk`:** the share of customers active at period start that entered the `at_risk` state in the period. The move into `state_category = 'at_risk'` is a leading indicator of churn, which this variant counts as it happens.\n\n**Benchmarks:**\n- Below 5%: Healthy portfolio\n- 5-10%: Normal, requires attention\n- 10-20%: Elevated risk\n- Above 20%: Portfolio in trouble\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Quarterly Business Review (QBR) Completion Rate","slug":"quarterly-business-review-qbr-completion-rate","definition":"The percentage of eligible accounts that completed a QBR.","formulas":["QBR Completion = Accounts with a completed QBR / Accounts due a QBR × 100"],"benchmarks":null,"insight":"Whether you are keeping up the regular reviews that strategic relationships run on.","commonMistakes":null,"sources":[],"department":"Customer Success","category":"Engagement Metrics","aliases":["QBR"],"rawMarkdown":"### Quarterly Business Review (QBR) Completion Rate\n\n**Definition:** The percentage of eligible accounts that completed a QBR.\n\n**Formula:**\n```\nQBR Completion = Accounts with a completed QBR / Accounts due a QBR × 100\n```\n\nA QBR counts as completed when it is held in the period. Eligible accounts are those due a QBR in the period.\n\n**Target:** 90%+ for enterprise/strategic accounts\n\n**What it tells you:** Whether you are keeping up the regular reviews that strategic relationships run on.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Executive Sponsor Coverage","slug":"executive-sponsor-coverage","definition":"The percentage of active accounts with an engaged contact whose role is executive sponsor.","formulas":["Exec Sponsor Coverage = Accounts with an engaged executive sponsor contact / Active accounts × 100"],"benchmarks":null,"insight":"Whether you have a senior relationship at each account. Accounts with an engaged sponsor tend to hold up better at renewal.","commonMistakes":null,"sources":[],"department":"Customer Success","category":"Engagement Metrics","aliases":[],"rawMarkdown":"### Executive Sponsor Coverage\n\n**Definition:** The percentage of active accounts with an engaged contact whose role is executive sponsor.\n\n**Formula:**\n```\nExec Sponsor Coverage = Accounts with an engaged executive sponsor contact / Active accounts × 100\n```\n\n**Population:** Contacts come from the contact dataset (one row per named person at an account, with a role and an engaged flag). An account counts once however many sponsors it has. Restrict to managed accounts by filtering the denominator.\n\n**What it tells you:** Whether you have a senior relationship at each account. Accounts with an engaged sponsor tend to hold up better at renewal.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Contact Coverage","slug":"contact-coverage","definition":"Average number of engaged contacts per active account.","formulas":["Contact Coverage = Engaged contacts / Active accounts"],"benchmarks":null,"insight":"Whether accounts depend on a single contact. An account with several engaged contacts is less likely to churn when one person leaves.","commonMistakes":null,"sources":[],"department":"Customer Success","category":"Engagement Metrics","aliases":[],"rawMarkdown":"### Contact Coverage\n\n**Definition:** Average number of engaged contacts per active account.\n\n**Formula:**\n```\nContact Coverage = Engaged contacts / Active accounts\n```\n\n**Population:** Engaged contacts are rows of the contact dataset with the engaged flag set at period end (engaged means activity in the last 90 days, however the CRM defines activity). The denominator is active accounts, so an account with no contacts pulls the average down rather than disappearing from it.\n\n**Target:** 3+ contacts per account\n\n**What it tells you:** Whether accounts depend on a single contact. An account with several engaged contacts is less likely to churn when one person leaves.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Expansion Revenue Rate","slug":"expansion-revenue-rate","definition":"Expansion MRR as a percentage of beginning MRR.","formulas":["Expansion Rate = Expansion MRR / Beginning MRR × 100"],"benchmarks":"- Below 10%: Limited expansion motion\n- 10-20%: Moderate, typical for early-stage\n- 20-30%: Strong, solid benchmark for growth stage\n- 30-40%: Excellent, typical at $15M+ ARR\n- 40%+: Exceptional, common in usage-based or high-ARPA models","insight":"How fast existing customers grow their spend. As companies mature, expansion becomes the largest source of growth.","commonMistakes":null,"sources":["Ordway: New vs Expansion ARR: https://ordwaylabs.com/blog/new-versus-expansion-arr/","High Alpha: 2025 SaaS Benchmarks: https://www.highalpha.com/saas-benchmarks","ChartMogul: SaaS Benchmarks Report: https://chartmogul.com/reports/saas-benchmarks-report/"],"department":"Customer Success","category":"Expansion Metrics","aliases":[],"rawMarkdown":"### Expansion Revenue Rate\n\n**Definition:** Expansion MRR as a percentage of beginning MRR.\n\n**Formula:**\n```\nExpansion Rate = Expansion MRR / Beginning MRR × 100\n```\n\n**Benchmarks:**\n- Below 10%: Limited expansion motion\n- 10-20%: Moderate, typical for early-stage\n- 20-30%: Strong, solid benchmark for growth stage\n- 30-40%: Excellent, typical at $15M+ ARR\n- 40%+: Exceptional, common in usage-based or high-ARPA models\n\n**By company stage:**\n- Early stage (<$1M ARR): ~10% from expansion (90% new customers)\n- Growth stage ($1M-$20M ARR): 20-30% from expansion\n- Scale stage ($20M+ ARR): 35%+ from expansion\n- Mature ($200M+ ARR): Up to 66% from expansion\n\nExpansion Revenue Rate is reported per customer segment.\n\n**What it tells you:** How fast existing customers grow their spend. As companies mature, expansion becomes the largest source of growth.\n\n**Sources:**\n- [Ordway: New vs Expansion ARR](https://ordwaylabs.com/blog/new-versus-expansion-arr/)\n- [High Alpha: 2025 SaaS Benchmarks](https://www.highalpha.com/saas-benchmarks)\n- [ChartMogul: SaaS Benchmarks Report](https://chartmogul.com/reports/saas-benchmarks-report/)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"License Utilization","slug":"license-utilization","definition":"The share of purchased seats that are assigned to a user, across active licenses at period end.","formulas":["License Utilization = Seats assigned / Seats purchased × 100"],"benchmarks":null,"insight":"Whether customers are growing into what they bought. For seat-priced products it is the earliest hard signal of contraction or expansion.","commonMistakes":null,"sources":[],"department":"Customer Success","category":"Expansion Metrics","aliases":[],"rawMarkdown":"### License Utilization\n\n**Definition:** The share of purchased seats that are assigned to a user, across active licenses at period end.\n\n**Formula:**\n```\nLicense Utilization = Seats assigned / Seats purchased × 100\n```\n\n**Population:** Active licenses (the license dataset: one row per entitlement a subscription grants, with the product it covers, seats purchased and seats assigned). Reported for the whole base and per product (by product id and product name).\n\n**Target:** 70 to 90 percent. Below 70 percent the account is paying for seats it does not use and is a downgrade risk at renewal. Above 90 percent the account is close to needing more seats, which is an expansion signal.\n\n**What it tells you:** Whether customers are growing into what they bought. For seat-priced products it is the earliest hard signal of contraction or expansion.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Upsell Rate","slug":"upsell-rate","definition":"The percentage of customers eligible for an upgrade at period start who upgraded in the period.","formulas":["Upsell Rate = Customers who upgraded / Customers eligible for upgrade × 100"],"benchmarks":null,"insight":"How well you turn upgrade headroom into upgrades.","commonMistakes":null,"sources":[],"department":"Customer Success","category":"Expansion Metrics","aliases":[],"rawMarkdown":"### Upsell Rate\n\n**Definition:** The percentage of customers eligible for an upgrade at period start who upgraded in the period.\n\n**Formula:**\n```\nUpsell Rate = Customers who upgraded / Customers eligible for upgrade × 100\n```\n\n**What it tells you:** How well you turn upgrade headroom into upgrades.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Cross-sell Rate","slug":"cross-sell-rate","definition":"The percentage of customers active at period start who bought an additional product in the period.","formulas":["Cross-sell Rate = Customers who bought additional product / Total customers × 100"],"benchmarks":null,"insight":"Multi-product adoption and stickiness.","commonMistakes":null,"sources":[],"department":"Customer Success","category":"Expansion Metrics","aliases":[],"rawMarkdown":"### Cross-sell Rate\n\n**Definition:** The percentage of customers active at period start who bought an additional product in the period.\n\n**Formula:**\n```\nCross-sell Rate = Customers who bought additional product / Total customers × 100\n```\n\n**What it tells you:** Multi-product adoption and stickiness.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Renewal Rate","slug":"renewal-rate","definition":"The percentage of subscriptions whose term ended in the period that renewed.","formulas":["Renewal Rate = Contracts renewed / Contracts up for renewal × 100","Renewal Rate = ARR renewed / ARR up for renewal × 100"],"benchmarks":"- Below 85%: Concerning, indicates retention problem\n- 85-90%: Below average\n- 90-95%: Good (90% is the industry norm per 2025 data)\n- 95%+: Excellent, top-quartile performance","insight":null,"commonMistakes":null,"sources":["Maxio: 2025 B2B SaaS Benchmarks: https://www.maxio.com/resources/2025-saas-benchmarks-report","Recurly: Churn Rate Benchmarks: https://recurly.com/research/churn-rate-benchmarks/"],"department":"Customer Success","category":"Renewal Metrics","aliases":[],"rawMarkdown":"### Renewal Rate\n\n**Definition:** The percentage of subscriptions whose term ended in the period that renewed.\n\n**Formula (by logo):**\n```\nRenewal Rate = Contracts renewed / Contracts up for renewal × 100\n```\n\n**Formula (by value):**\n```\nRenewal Rate = ARR renewed / ARR up for renewal × 100\n```\n\nAlways specify logo or value basis.\n\n**Benchmarks:**\n- Below 85%: Concerning, indicates retention problem\n- 85-90%: Below average\n- 90-95%: Good (90% is the industry norm per 2025 data)\n- 95%+: Excellent, top-quartile performance\n\n**By segment:**\n- SMB: 85%+ is good (higher churn expected)\n- Mid-market: 90%+ is good\n- Enterprise: 95%+ expected\n\n**Sources:**\n- [Maxio: 2025 B2B SaaS Benchmarks](https://www.maxio.com/resources/2025-saas-benchmarks-report)\n- [Recurly: Churn Rate Benchmarks](https://recurly.com/research/churn-rate-benchmarks/)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Renewal Forecast Accuracy","slug":"renewal-forecast-accuracy","definition":"How closely the forecast renewal value matched the value actually renewed, for contracts ending in the period.","formulas":["Forecast Accuracy = 1 - |Forecasted renewals - Actual renewals| / Actual renewals"],"benchmarks":null,"insight":"How far revenue planning can rely on the renewal forecast.","commonMistakes":null,"sources":[],"department":"Customer Success","category":"Renewal Metrics","aliases":[],"rawMarkdown":"### Renewal Forecast Accuracy\n\n**Definition:** How closely the forecast renewal value matched the value actually renewed, for contracts ending in the period.\n\n**Formula:**\n```\nForecast Accuracy = 1 - |Forecasted renewals - Actual renewals| / Actual renewals\n```\n\n**Target:** >90%\n\n**What it tells you:** How far revenue planning can rely on the renewal forecast.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Days to Renewal","slug":"days-to-renewal","definition":"Average number of days until upcoming renewals.","formulas":[],"benchmarks":null,"insight":"How soon the renewal workload arrives. A short average means renewals are bunched close together, which strains CSM capacity.","commonMistakes":null,"sources":[],"department":"Customer Success","category":"Renewal Metrics","aliases":[],"rawMarkdown":"### Days to Renewal\n\n**Definition:** Average number of days until upcoming renewals.\n\n**What it tells you:** How soon the renewal workload arrives. A short average means renewals are bunched close together, which strains CSM capacity.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Accounts per CSM","slug":"accounts-per-csm","definition":"The number of accounts assigned to each Customer Success Manager.","formulas":["Accounts per CSM = Total managed accounts / Number of CSMs"],"benchmarks":"| Model | Accounts per CSM | Typical ACV |\n|-------|------------------|-------------|\n| High-touch Enterprise | 10-50 (median ~22) | $100K+ |\n| Mid-touch | 50-100 (median ~49) | $25K-$100K |\n| Low-touch/SMB | 100-250 | $5K-$25K |\n| Tech-touch/Digital | 300-500+ | <$5K |","insight":null,"commonMistakes":null,"sources":["Gainsight: CSM Ratio Benchmarks: https://www.gainsight.com/blog/gainsight-horizon-ai-labs-what-is-the-right-csm-to-customer-ratio/","Vitally: CSM to Customer Ratio: https://www.vitally.io/post/what-is-the-golden-ratio-of-customer-success-managers-to-customers","ChurnZero: CSM Coverage Ratio: https://churnzero.com/blog/customer-success-manager-coverage-ratio-arr/"],"department":"Customer Success","category":"Productivity Metrics","aliases":[],"rawMarkdown":"### Accounts per CSM\n\n**Definition:** The number of accounts assigned to each Customer Success Manager.\n\n**Formula:**\n```\nAccounts per CSM = Total managed accounts / Number of CSMs\n```\n\n**Benchmarks by touch model:**\n| Model | Accounts per CSM | Typical ACV |\n|-------|------------------|-------------|\n| High-touch Enterprise | 10-50 (median ~22) | $100K+ |\n| Mid-touch | 50-100 (median ~49) | $25K-$100K |\n| Low-touch/SMB | 100-250 | $5K-$25K |\n| Tech-touch/Digital | 300-500+ | <$5K |\n\n**By account value:**\n- <$25K ACV: Up to 200 accounts\n- $25K-$100K: 100-150 accounts\n- $100K-$500K: 50-100 accounts\n- $500K+: 10-25 accounts (high-touch required)\n\n**Important:** There's no universal standard. The right ratio depends on product complexity, customer needs and engagement model. Calculate based on capacity: reserve ~2/3 of CSM time for customer-facing work.\n\n**Sources:**\n- [Gainsight: CSM Ratio Benchmarks](https://www.gainsight.com/blog/gainsight-horizon-ai-labs-what-is-the-right-csm-to-customer-ratio/)\n- [Vitally: CSM to Customer Ratio](https://www.vitally.io/post/what-is-the-golden-ratio-of-customer-success-managers-to-customers)\n- [ChurnZero: CSM Coverage Ratio](https://churnzero.com/blog/customer-success-manager-coverage-ratio-arr/)\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"ARR per CSM","slug":"arr-per-csm","definition":"Total ARR managed by each CSM.","formulas":["ARR per CSM = Total managed ARR / Number of CSMs"],"benchmarks":"| Segment | ARR per CSM |\n|---------|-------------|\n| Enterprise | $2M-$5M (69% manage >$2M) |\n| Mid-market | $2M-$5M (spread across more accounts) |\n| SMB | $1M-$2M |","insight":"CSM productivity and capacity planning.","commonMistakes":null,"sources":["Gainsight: CS Team Planning & Cost Benchmarks: https://www.gainsight.com/blog/customer-success-team-planning-cost-benchmarks/","ChurnZero: CS Capacity Planning: https://churnzero.com/blog/customer-success-capacity-planning-and-budget-guide/","Tomasz Tunguz: How Much ARR Can a CSM Manage?: https://tomtunguz.com/how-much-arr-can-a-csm-manage/"],"department":"Customer Success","category":"Productivity Metrics","aliases":["ARR"],"rawMarkdown":"### ARR per CSM\n\n**Definition:** Total ARR managed by each CSM.\n\n**Formula:**\n```\nARR per CSM = Total managed ARR / Number of CSMs\n```\n\n**Benchmarks:**\n| Segment | ARR per CSM |\n|---------|-------------|\n| Enterprise | $2M-$5M (69% manage >$2M) |\n| Mid-market | $2M-$5M (spread across more accounts) |\n| SMB | $1M-$2M |\n\n**Distribution (Gainsight data):**\n- Median (50th percentile): $1.4M\n- Top quartile (75th percentile): $4.2M\n\n**Common rule of thumb:** Hire 1 CSM per $2M ARR.\n\n**CS team cost benchmark:** Customer Success should cost 5-15% of ARR (under 10% for companies >$100M ARR).\n\n**What it tells you:** CSM productivity and capacity planning.\n\n**Sources:**\n- [Gainsight: CS Team Planning & Cost Benchmarks](https://www.gainsight.com/blog/customer-success-team-planning-cost-benchmarks/)\n- [ChurnZero: CS Capacity Planning](https://churnzero.com/blog/customer-success-capacity-planning-and-budget-guide/)\n- [Tomasz Tunguz: How Much ARR Can a CSM Manage?](https://tomtunguz.com/how-much-arr-can-a-csm-manage/)\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Uptime (Availability)","slug":"uptime-availability","definition":"The percentage of time the service is operational.","formulas":["Uptime = (Total time - Downtime) / Total time × 100"],"benchmarks":"- 99.0%: ~7.3 hours downtime (unacceptable for most SaaS)\n- 99.9%: ~43 minutes downtime (three nines)\n- 99.95%: ~22 minutes downtime (typical SLA)\n- 99.99%: ~4.3 minutes downtime (four nines, high reliability)","insight":"Basic platform reliability.","commonMistakes":["Excluding \"scheduled maintenance\" (customers don't care why it's down)","Measuring only core service, not dependencies","Not weighting by traffic/usage"],"sources":[],"department":"Engineering","category":"Reliability Metrics","aliases":[],"rawMarkdown":"### Uptime (Availability)\n\n**Definition:** The percentage of time the service is operational.\n\n**Formula:**\n```\nUptime = (Total time - Downtime) / Total time × 100\n```\n\n**Benchmarks (Monthly):**\n- 99.0%: ~7.3 hours downtime (unacceptable for most SaaS)\n- 99.9%: ~43 minutes downtime (three nines)\n- 99.95%: ~22 minutes downtime (typical SLA)\n- 99.99%: ~4.3 minutes downtime (four nines, high reliability)\n\n**What it tells you:** Basic platform reliability.\n\n**Common mistakes:**\n- Excluding \"scheduled maintenance\" (customers don't care why it's down)\n- Measuring only core service, not dependencies\n- Not weighting by traffic/usage\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"SLA Adherence","slug":"sla-adherence","definition":"Percentage of time SLA commitments were met.","formulas":["SLA Adherence = Periods meeting SLA / Total periods × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Engineering","category":"Reliability Metrics","aliases":["SLA"],"rawMarkdown":"### SLA Adherence\n\n**Definition:** Percentage of time SLA commitments were met.\n\n**Formula:**\n```\nSLA Adherence = Periods meeting SLA / Total periods × 100\n```\n\n**Target:** 100% (SLA breaches have contractual and trust implications)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Error Rate","slug":"error-rate","definition":"Percentage of requests that result in errors.","formulas":["Error Rate = Error responses (5xx) / Total requests × 100"],"benchmarks":"- Below 0.1%: Excellent\n- 0.1-0.5%: Good\n- 0.5-1%: Acceptable\n- Above 1%: Needs attention","insight":"Service reliability from user perspective.","commonMistakes":null,"sources":[],"department":"Engineering","category":"Reliability Metrics","aliases":[],"rawMarkdown":"### Error Rate\n\n**Definition:** Percentage of requests that result in errors.\n\n**Formula:**\n```\nError Rate = Error responses (5xx) / Total requests × 100\n```\n\n**Benchmarks:**\n- Below 0.1%: Excellent\n- 0.1-0.5%: Good\n- 0.5-1%: Acceptable\n- Above 1%: Needs attention\n\n**What it tells you:** Service reliability from user perspective.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Latency (Response Time)","slug":"latency-response-time","definition":"Time taken to respond to requests.","formulas":["P50 Latency = Median response time\nP95 Latency = 95th percentile response time\nP99 Latency = 99th percentile response time"],"benchmarks":"- P50: < 100ms\n- P95: < 500ms\n- P99: < 1000ms","insight":"User experience. Slow responses impact satisfaction and conversion.","commonMistakes":null,"sources":[],"department":"Engineering","category":"Reliability Metrics","aliases":[],"rawMarkdown":"### Latency (Response Time)\n\n**Definition:** Time taken to respond to requests.\n\n**Formula:**\n```\nP50 Latency = Median response time\nP95 Latency = 95th percentile response time\nP99 Latency = 99th percentile response time\n```\n\nGASP's canonical latency is P95, with P50 and P99 as variants. Report percentiles rather than averages, which hide tail latency.\n\n**Benchmarks (API):**\n- P50: < 100ms\n- P95: < 500ms\n- P99: < 1000ms\n\n**What it tells you:** User experience. Slow responses impact satisfaction and conversion.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Incident Count","slug":"incident-count","definition":"Number of incidents in a period.","formulas":["Incident Count = Total incidents reported"],"benchmarks":null,"insight":"System stability. Read the trend per severity, since one SEV1 outweighs a month of SEV4 noise.","commonMistakes":null,"sources":[],"department":"Engineering","category":"Incident Metrics","aliases":[],"rawMarkdown":"### Incident Count\n\n**Definition:** Number of incidents in a period.\n\n**Formula:**\n```\nIncident Count = Total incidents reported\n```\n\nIncident Count is reported per severity and per incident type (availability, performance, security and data).\n\nCategorize by severity:\n- SEV1/P1: Critical, full outage\n- SEV2/P2: Major, significant degradation\n- SEV3/P3: Minor, limited impact\n- SEV4/P4: Cosmetic, no customer impact\n\n**What it tells you:** System stability. Read the trend per severity, since one SEV1 outweighs a month of SEV4 noise.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Mean Time to Detect (MTTD)","slug":"mean-time-to-detect-mttd","definition":"Time from incident start to detection.","formulas":["MTTD = Average of (Detection time - Incident start time)"],"benchmarks":null,"insight":"Monitoring and alerting effectiveness.","commonMistakes":null,"sources":[],"department":"Engineering","category":"Incident Metrics","aliases":["MTTD"],"rawMarkdown":"### Mean Time to Detect (MTTD)\n\n**Definition:** Time from incident start to detection.\n\n**Formula:**\n```\nMTTD = Average of (Detection time - Incident start time)\n```\n\n**Target:** < 5 minutes for critical services\n\n**What it tells you:** Monitoring and alerting effectiveness.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Mean Time to Acknowledge (MTTA)","slug":"mean-time-to-acknowledge-mtta","definition":"Time from detection (the alert firing) to a person acknowledging the incident.","formulas":["MTTA = Average of (Acknowledgment time - Alert time)"],"benchmarks":null,"insight":"On-call responsiveness.","commonMistakes":null,"sources":[],"department":"Engineering","category":"Incident Metrics","aliases":["MTTA"],"rawMarkdown":"### Mean Time to Acknowledge (MTTA)\n\n**Definition:** Time from detection (the alert firing) to a person acknowledging the incident.\n\n**Formula:**\n```\nMTTA = Average of (Acknowledgment time - Alert time)\n```\n\n**Target:** < 15 minutes\n\n**What it tells you:** On-call responsiveness.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Mean Time to Resolve (MTTR)","slug":"mean-time-to-resolve-mttr","definition":"Time from incident start to resolution.","formulas":["MTTR = Average of (Resolution time - Incident start time)"],"benchmarks":"- SEV1: < 1 hour\n- SEV2: < 4 hours\n- SEV3: < 24 hours","insight":"Incident response capability.","commonMistakes":null,"sources":[],"department":"Engineering","category":"Incident Metrics","aliases":["MTTR"],"rawMarkdown":"### Mean Time to Resolve (MTTR)\n\n**Definition:** Time from incident start to resolution.\n\n**Formula:**\n```\nMTTR = Average of (Resolution time - Incident start time)\n```\n\nMTTR is reported per severity and per incident type, since resolution targets differ by severity.\n\n**Benchmarks:**\n- SEV1: < 1 hour\n- SEV2: < 4 hours\n- SEV3: < 24 hours\n\n**What it tells you:** Incident response capability.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Change Failure Rate","slug":"change-failure-rate","definition":"Percentage of deployments that cause incidents.","formulas":["Change Failure Rate = Deployments causing incidents / Total deployments × 100"],"benchmarks":"- Elite: 0-15%\n- High: 16-30%\n- Medium: 31-45%\n- Low: 46-60%","insight":"Deployment quality and release process health.","commonMistakes":null,"sources":[],"department":"Engineering","category":"Incident Metrics","aliases":[],"rawMarkdown":"### Change Failure Rate\n\n**Definition:** Percentage of deployments that cause incidents.\n\n**Formula:**\n```\nChange Failure Rate = Deployments causing incidents / Total deployments × 100\n```\n\n**Benchmarks (DORA):**\n- Elite: 0-15%\n- High: 16-30%\n- Medium: 31-45%\n- Low: 46-60%\n\n**What it tells you:** Deployment quality and release process health.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Deployment Frequency","slug":"deployment-frequency","definition":"How often code is deployed to production.","formulas":["Deployment Frequency = Deployments / Time period"],"benchmarks":"- Elite: On-demand or multiple times per day\n- High: Once per day to once per week\n- Medium: Once per week to once per month\n- Low: Less than once per month","insight":"Ability to deliver value quickly.","commonMistakes":null,"sources":[],"department":"Engineering","category":"Delivery Metrics (DORA)","aliases":[],"rawMarkdown":"### Deployment Frequency\n\n**Definition:** How often code is deployed to production.\n\n**Formula:**\n```\nDeployment Frequency = Deployments / Time period\n```\n\n**Benchmarks (DORA):**\n- Elite: On-demand or multiple times per day\n- High: Once per day to once per week\n- Medium: Once per week to once per month\n- Low: Less than once per month\n\n**What it tells you:** Ability to deliver value quickly.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Lead Time for Changes","slug":"lead-time-for-changes","definition":"Time from code commit to production deployment.","formulas":["Lead Time = Median of (Deploy time - Commit time)"],"benchmarks":"- Elite: Less than 1 day\n- High: 1 day to 1 week\n- Medium: 1 week to 1 month\n- Low: 1 month to 6 months","insight":"Development and release pipeline efficiency.","commonMistakes":null,"sources":[],"department":"Engineering","category":"Delivery Metrics (DORA)","aliases":[],"rawMarkdown":"### Lead Time for Changes\n\n**Definition:** Time from code commit to production deployment.\n\n**Formula:**\n```\nLead Time = Median of (Deploy time - Commit time)\n```\n\n**Benchmarks (DORA):**\n- Elite: Less than 1 day\n- High: 1 day to 1 week\n- Medium: 1 week to 1 month\n- Low: 1 month to 6 months\n\n**What it tells you:** Development and release pipeline efficiency.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Mean Time to Recovery (MTTR)","slug":"mean-time-to-recovery-mttr","definition":"Time to restore service after a failure.","formulas":["MTTR = Average of (Recovery time - Failure time)"],"benchmarks":"- Elite: Less than 1 hour\n- High: Less than 1 day\n- Medium: 1 day to 1 week\n- Low: More than 1 week","insight":"Resilience and recovery capability.","commonMistakes":null,"sources":[],"department":"Engineering","category":"Delivery Metrics (DORA)","aliases":["MTTR"],"rawMarkdown":"### Mean Time to Recovery (MTTR)\n\n**Definition:** Time to restore service after a failure.\n\n**Formula:**\n```\nMTTR = Average of (Recovery time - Failure time)\n```\n\n**Benchmarks (DORA):**\n- Elite: Less than 1 hour\n- High: Less than 1 day\n- Medium: 1 day to 1 week\n- Low: More than 1 week\n\n**What it tells you:** Resilience and recovery capability.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Infrastructure Utilization","slug":"infrastructure-utilization","definition":"Percentage of provisioned capacity being used.","formulas":["Utilization = Actual usage / Provisioned capacity × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Engineering","category":"Capacity Metrics","aliases":[],"rawMarkdown":"### Infrastructure Utilization\n\n**Definition:** Percentage of provisioned capacity being used.\n\n**Formula:**\n```\nUtilization = Actual usage / Provisioned capacity × 100\n```\n\nMeasure for CPU, memory, storage, network.\n\n**Targets:**\n- Below 40%: Over-provisioned, wasting money\n- 40-70%: Healthy headroom\n- 70-85%: Efficient, monitoring needed\n- Above 85%: At risk, scale soon\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Infrastructure Cost per Customer","slug":"infrastructure-cost-per-customer","definition":"Total infrastructure cost divided by active customers.","formulas":["Cost per Customer = Total infrastructure cost / Active customers"],"benchmarks":null,"insight":"Unit economics of delivery. Should decrease or stay flat as you scale.","commonMistakes":null,"sources":[],"department":"Engineering","category":"Capacity Metrics","aliases":[],"rawMarkdown":"### Infrastructure Cost per Customer\n\n**Definition:** Total infrastructure cost divided by active customers.\n\n**Formula:**\n```\nCost per Customer = Total infrastructure cost / Active customers\n```\n\n**What it tells you:** Unit economics of delivery. Should decrease or stay flat as you scale.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Headroom","slug":"headroom","definition":"Available capacity before scaling is required.","formulas":["Headroom = (Max capacity - Current usage) / Max capacity × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Engineering","category":"Capacity Metrics","aliases":[],"rawMarkdown":"### Headroom\n\n**Definition:** Available capacity before scaling is required.\n\n**Formula:**\n```\nHeadroom = (Max capacity - Current usage) / Max capacity × 100\n```\n\nHeadroom is the complement of Infrastructure Utilization (1 minus utilization).\n\n**Target:** Maintain 20-30% headroom for traffic spikes.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Vulnerability Count","slug":"vulnerability-count","definition":"Number of known vulnerabilities still open in your systems.","formulas":[],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Engineering","category":"Security Metrics","aliases":[],"rawMarkdown":"### Vulnerability Count\n\n**Definition:** Number of known vulnerabilities still open in your systems.\n\n**Categorize by severity:** Critical, High, Medium, Low\n\n**Targets:**\n- Critical: 0 (fix immediately)\n- High: < 10 (fix within days)\n- Medium: < 50 (fix within weeks)\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Time to Patch","slug":"time-to-patch","definition":"Time from a vulnerability being discovered to its patch being deployed, for patches deployed in the period.","formulas":["Time to Patch = Average of (Patch deploy time - Disclosure time)"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Engineering","category":"Security Metrics","aliases":[],"rawMarkdown":"### Time to Patch\n\n**Definition:** Time from a vulnerability being discovered to its patch being deployed, for patches deployed in the period.\n\n**Formula:**\n```\nTime to Patch = Average of (Patch deploy time - Disclosure time)\n```\n\n**Targets:**\n- Critical: < 24 hours\n- High: < 7 days\n- Medium: < 30 days\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Security Incident Count","slug":"security-incident-count","definition":"Number of security incidents in a period.","formulas":[],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Engineering","category":"Security Metrics","aliases":[],"rawMarkdown":"### Security Incident Count\n\n**Definition:** Number of security incidents in a period.\n\n**Target:** Zero breaches. Track and reduce attempted attacks.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Revenue (GAAP)","slug":"revenue-gaap","definition":"Recognized revenue according to accounting standards.","formulas":["Revenue = Recognized revenue in period (per ASC 606)"],"benchmarks":null,"insight":"Actual earned revenue for the period.","commonMistakes":null,"sources":[],"department":"Finance","category":"Revenue Metrics","aliases":["GAAP"],"rawMarkdown":"### Revenue (GAAP)\n\n**Definition:** Recognized revenue according to accounting standards.\n\n**Formula:**\n```\nRevenue = Recognized revenue in period (per ASC 606)\n```\n\n**Note:** Different from bookings or billings. Revenue is recognized as service is delivered.\n\n**What it tells you:** Actual earned revenue for the period.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Bookings","slug":"bookings","definition":"Total contract value signed in a period.","formulas":["Bookings = Sum of total contract value for deals signed in period"],"benchmarks":null,"insight":"Sales output and future revenue committed.","commonMistakes":null,"sources":[],"department":"Finance","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Bookings\n\n**Definition:** Total contract value signed in a period.\n\n**Formula:**\n```\nBookings = Sum of total contract value for deals signed in period\n```\n\n**Types:**\n- New Bookings: From new customers\n- Expansion Bookings: Upgrades from existing customers\n- Renewal Bookings: Contract renewals\n\n**What it tells you:** Sales output and future revenue committed.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Billings","slug":"billings","definition":"Amounts invoiced in a period.","formulas":["Billings = Total invoiced amount in period"],"benchmarks":null,"insight":"The cash the period's invoices should bring in. The payment status breakdown shows how much of it has arrived.","commonMistakes":null,"sources":[],"department":"Finance","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Billings\n\n**Definition:** Amounts invoiced in a period.\n\n**Formula:**\n```\nBillings = Total invoiced amount in period\n```\n\nBillings are reported per payment status (paid, unpaid, partial, written off) as of period end.\n\n**What it tells you:** The cash the period's invoices should bring in. The payment status breakdown shows how much of it has arrived.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"ARR / MRR","slug":"arr-mrr","definition":"The total predictable revenue from active subscriptions, normalized to a monthly value.","formulas":["MRR = Sum of (Monthly subscription value for all active customers)","MRR contribution = Annual Contract Value / 12"],"benchmarks":null,"insight":"The current run rate of your recurring revenue engine.","commonMistakes":["Including one-time fees (setup, professional services)","Including usage/consumption revenue that isn't guaranteed","Double-counting customers during plan changes","Not normalizing annual contracts to monthly","Treating MRR as an accounting figure"],"sources":["Baremetrics: MRR Definition: https://baremetrics.com/academy/saas-calculate-mrr","Maxio: Monthly Recurring Revenue Defined: https://www.maxio.com/saaspedia/monthly-recurring-revenue-defined-for-a-saas-business","ChurnZero: Monthly Recurring Revenue: https://churnzero.com/churnopedia/monthly-recurring-revenue-mrr/"],"department":"Finance","category":"Revenue Metrics","aliases":["ARR"],"rawMarkdown":"### ARR / MRR\n\nSee [Core Metrics: MRR](core.md#mrr-monthly-recurring-revenue) and [ARR](core.md#arr-annual-recurring-revenue) for full definitions.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Deferred Revenue","slug":"deferred-revenue","definition":"Revenue billed but not yet recognized. A balance of cumulative billings less cumulative recognized revenue, independent of when cash is received.","formulas":["Deferred Revenue = Cumulative billings - Cumulative recognized revenue"],"benchmarks":null,"insight":"Revenue already billed that the company still owes in service.","commonMistakes":null,"sources":[],"department":"Finance","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Deferred Revenue\n\nSee [RevOps](revops.md#deferred-revenue-balance) for the canonical definition. Deferred revenue is a balance: cumulative billings to date minus cumulative revenue recognised to date. It arises on billing, not on cash receipt.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Consumption Revenue","slug":"consumption-revenue","definition":"Revenue earned as customers use the product: consumption drawn from a prepaid balance, billed as overage above a commitment or billed on demand with no commitment.","formulas":["Consumption Revenue = Sum of consumption drawn, billed as overage or billed on demand in the period"],"benchmarks":null,"insight":"How much revenue usage earned in the period, whichever way the customer bought it. The breakdown by basis shows how much came from prepaid commitments, how much ran past them and how much arrived with no commitment at all.","commonMistakes":["Counting credit purchases as consumption revenue","Adding consumption revenue to MRR, which excludes uncommitted usage","Counting usage within a ratable commitment a second time beside the commitment"],"sources":["FASB: ASU 2014-09, Topic 606: https://storage.fasb.org/ASU%202014-09_Section%20A.pdf","IFRS 15: https://www.icab.org.bd/icabadmin/uploads/ckeditor/7910IFRS%2015.pdf","Deloitte: Cloud arrangements with variable consideration: https://www.deloitte.com/content/dam/assets-zone3/us/en/docs/services/audit-assurance/2024/us-audit-tech-alert-accounting-for-cloud-basedor-hosted-software-arrangements-with-variable-consideration.pdf","Snowflake: Form 10-K, fiscal 2026: https://www.sec.gov/Archives/edgar/data/1640147/000164014726000008/snow-20260131.htm","Stripe: Billing credits: https://docs.stripe.com/billing/subscriptions/usage-based/billing-credits","Metronome: Glossary: https://metronome.com/glossary"],"department":"Finance","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Consumption Revenue\n\n**Definition:** Revenue earned as customers use the product: consumption drawn from a prepaid balance, billed as overage above a commitment or billed on demand with no commitment.\n\n**Formula:**\n```\nConsumption Revenue = Sum of consumption drawn, billed as overage or billed on demand in the period\n```\n\nConsumption Revenue reads the `consumption` events of the [Commercial Event Ledger (CEL)](../cel.md#credit_event) `Credit_Event` class. Those events carry a negative `credit_amount`, since they reduce what the customer has left to use, and the metric reports the positive amount.\n\nConsumption Revenue is reported per consumption basis (committed, overage, on demand) and per customer segment.\n\n**Includes:**\n- Consumption drawn from a prepaid balance (basis `committed`)\n- Consumption above an exhausted or per-period commitment (basis `overage`)\n- Consumption billed with no commitment (basis `on_demand`)\n\n**Excludes:**\n- Usage within a ratable commitment: that revenue is the commitment itself, already in MRR\n- Credit purchases: a prepayment is a contract liability until it is consumed, so it counts in bookings and billings\n- Expired credits, which [Credit Breakage](#credit-breakage) reports\n\n**What it tells you:** How much revenue usage earned in the period, whichever way the customer bought it. The breakdown by basis shows how much came from prepaid commitments, how much ran past them and how much arrived with no commitment at all.\n\n**Note:** Under ASC 606 and IFRS 15 a SaaS usage fee is variable consideration, recognised as the usage occurs. Consumption Revenue is the commercial figure read from the credit ledger; [Revenue (GAAP)](#revenue-gaap) remains the accounting figure.\n\n**Common mistakes:**\n- Counting credit purchases as consumption revenue\n- Adding consumption revenue to MRR, which excludes uncommitted usage\n- Counting usage within a ratable commitment a second time beside the commitment\n\n**Related metrics:** Usage Run-Rate, Prepaid Credit Balance, Credit Breakage, Consumption Revenue Growth Rate, Consumption Net Revenue Retention, Revenue (GAAP)\n\n**Sources:**\n- [FASB: ASU 2014-09, Topic 606](https://storage.fasb.org/ASU%202014-09_Section%20A.pdf)\n- [IFRS 15](https://www.icab.org.bd/icabadmin/uploads/ckeditor/7910IFRS%2015.pdf)\n- [Deloitte: Cloud arrangements with variable consideration](https://www.deloitte.com/content/dam/assets-zone3/us/en/docs/services/audit-assurance/2024/us-audit-tech-alert-accounting-for-cloud-basedor-hosted-software-arrangements-with-variable-consideration.pdf)\n- [Snowflake: Form 10-K, fiscal 2026](https://www.sec.gov/Archives/edgar/data/1640147/000164014726000008/snow-20260131.htm)\n- [Stripe: Billing credits](https://docs.stripe.com/billing/subscriptions/usage-based/billing-credits)\n- [Metronome: Glossary](https://metronome.com/glossary)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Usage Run-Rate","slug":"usage-run-rate","definition":"On-demand consumption revenue over the trailing three months, annualised. Also called Usage ARR.","formulas":["Usage Run-Rate = On-demand Consumption Revenue in the three months ending at period end × 4"],"benchmarks":null,"insight":"The annual scale of the usage that no contract guarantees. Set beside ARR it shows how much of the business runs on commitments and how much on customers who could stop tomorrow.","commonMistakes":["Annualising all consumption and adding it to ARR, which counts commitments and overage twice","Changing the window from one period to the next","Comparing two companies' usage figures without checking their windows"],"sources":["MongoDB: Form 10-K, fiscal 2026: https://www.sec.gov/Archives/edgar/data/1441816/000162828026016799/mdb-20260131.htm","Confluent: Form 10-K, 2025: https://www.sec.gov/Archives/edgar/data/1699838/000169983826000006/cflt-20251231.htm","Datadog: Form 10-K, 2025: https://www.sec.gov/Archives/edgar/data/1561550/000162828026008819/ddog-20251231.htm","Ordway: Cloud usage-based pricing ARR study: https://ordwaylabs.com/blog/cloud-usage-based-pricing-report-arr/","Metronome: ARR for usage-heavy SaaS: https://metronome.com/blog/arr-usage-heavy-saas","m3ter: SaaS usage metrics: https://www.m3ter.com/guides/saas-usage-metrics"],"department":"Finance","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Usage Run-Rate\n\n**Definition:** On-demand consumption revenue over the trailing three months, annualised. Also called Usage ARR.\n\n**Formula:**\n```\nUsage Run-Rate = On-demand Consumption Revenue in the three months ending at period end × 4\n```\n\n**Window:** The GASP Standard fixes the window at three months × 4, the basis of MongoDB's 90 days and Confluent's three months. Companies also use one month × 12 (Datadog), which moves with every unusual month, and a six-month average × 12 (Metronome's guidance), which is slower to show a trend; daily × 365 appears too. The standard picks one window so two companies' figures compare. A company that reports on another window states it beside the GASP figure.\n\n**Base:** Only on-demand consumption enters. Committed consumption is already in ARR through the commitment, and overage is already in MRR through the `usage_realisation` expansion the [CEL](../cel.md#deriving-usage-realisation) derives. With the base held to on-demand consumption, ARR plus Usage Run-Rate counts each dollar once.\n\n**Includes:** Consumption with basis `on_demand`.\n\n**Excludes:** Committed consumption and overage, which ARR already carries.\n\n**What it tells you:** The annual scale of the usage that no contract guarantees. Set beside ARR it shows how much of the business runs on commitments and how much on customers who could stop tomorrow.\n\n**Note:** A run-rate, not a forecast. Datadog describes its usage-inclusive figures as \"not intended to be replacements or forecasts of revenue\".\n\n**Common mistakes:**\n- Annualising all consumption and adding it to ARR, which counts commitments and overage twice\n- Changing the window from one period to the next\n- Comparing two companies' usage figures without checking their windows\n\n**Related metrics:** ARR Including Usage Run-Rate, Consumption Revenue, ARR\n\n**Sources:**\n- [MongoDB: Form 10-K, fiscal 2026](https://www.sec.gov/Archives/edgar/data/1441816/000162828026016799/mdb-20260131.htm)\n- [Confluent: Form 10-K, 2025](https://www.sec.gov/Archives/edgar/data/1699838/000169983826000006/cflt-20251231.htm)\n- [Datadog: Form 10-K, 2025](https://www.sec.gov/Archives/edgar/data/1561550/000162828026008819/ddog-20251231.htm)\n- [Ordway: Cloud usage-based pricing ARR study](https://ordwaylabs.com/blog/cloud-usage-based-pricing-report-arr/)\n- [Metronome: ARR for usage-heavy SaaS](https://metronome.com/blog/arr-usage-heavy-saas)\n- [m3ter: SaaS usage metrics](https://www.m3ter.com/guides/saas-usage-metrics)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Prepaid Credit Balance","slug":"prepaid-credit-balance","definition":"The prepaid commitment customers have paid for and not yet consumed or forfeited, as of period end. Also called Remaining Commitment.","formulas":["Prepaid Credit Balance = Purchases + granting adjustments − committed consumption − expiries − reducing adjustments, cumulative to period end"],"benchmarks":null,"insight":"How much consumption customers have paid for in advance and not yet used: revenue still to be earned through use, or forfeited at expiry.","commonMistakes":["Drawing on-demand or overage consumption against the balance","Reading the balance as a revenue forecast: rollover and consumption timing move it, and Snowflake states its deferred revenue \"is not a meaningful indicator of future revenue\"","Letting the balance go negative: consumption beyond the balance is overage"],"sources":["FASB: ASU 2014-09, Topic 606: https://storage.fasb.org/ASU%202014-09_Section%20A.pdf","IFRS 15: https://www.icab.org.bd/icabadmin/uploads/ckeditor/7910IFRS%2015.pdf","Stripe: Credit grant object: https://docs.stripe.com/api/billing/credit-grant/object","Stripe: Billing credits: https://docs.stripe.com/billing/subscriptions/usage-based/billing-credits","Orb: Credit ledger: https://docs.withorb.com/api-reference/credit/fetch-customer-credits-ledger","Metronome: Remaining balance: https://docs.metronome.com/guides/customers-billing/optimize-customer-experience/get-remaining-balance.md","Zuora: Prepaid balance transaction fields: https://docs.zuora.com/en/zuora-billing/bill-your-customer/usage-billing/prepaid-with-drawdown/query-the-prepaid-with-drawdown-objects-through-data-query/prepaid-balance-transaction-fields","Lago: Wallets and prepaid credits: https://doc.getlago.com/guide/wallet-and-prepaid-credits/overview"],"department":"Finance","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Prepaid Credit Balance\n\n**Definition:** The prepaid commitment customers have paid for and not yet consumed or forfeited, as of period end. Also called Remaining Commitment.\n\n**Formula:**\n```\nPrepaid Credit Balance = Purchases + granting adjustments − committed consumption − expiries − reducing adjustments, cumulative to period end\n```\n\nEvery `purchase`, `expiry` and `adjustment` event and every consumption with basis `committed` is summed from the start of the ledger to period end, each with the sign it carries.\n\n**Includes:** Prepaid commitments and blocks of credits, rollover grants and promotional grants, less what has been drawn down, forfeited or reduced.\n\n**Excludes:** Overage and on-demand consumption, which draw no balance.\n\n**What it tells you:** How much consumption customers have paid for in advance and not yet used: revenue still to be earned through use, or forfeited at expiry.\n\n**Note:** A prepayment is a contract liability when it is received and becomes revenue as the service is consumed (ASC 606-10-55-46, IFRS 15.B44). The Prepaid Credit Balance is the part of the [Deferred Revenue Balance](revops.md#deferred-revenue-balance) that is prepaid consumption. A balance that can roll over extends the obligation, so it is not yet breakage. The GASP Standard records the commercial fact and leaves the breakage method to the company's accounting policy.\n\n**Common mistakes:**\n- Drawing on-demand or overage consumption against the balance\n- Reading the balance as a revenue forecast: rollover and consumption timing move it, and Snowflake states its deferred revenue \"is not a meaningful indicator of future revenue\"\n- Letting the balance go negative: consumption beyond the balance is overage\n\n**Related metrics:** Consumption Revenue, Credit Breakage, Deferred Revenue Balance\n\n**Sources:**\n- [FASB: ASU 2014-09, Topic 606](https://storage.fasb.org/ASU%202014-09_Section%20A.pdf)\n- [IFRS 15](https://www.icab.org.bd/icabadmin/uploads/ckeditor/7910IFRS%2015.pdf)\n- [Stripe: Credit grant object](https://docs.stripe.com/api/billing/credit-grant/object)\n- [Stripe: Billing credits](https://docs.stripe.com/billing/subscriptions/usage-based/billing-credits)\n- [Orb: Credit ledger](https://docs.withorb.com/api-reference/credit/fetch-customer-credits-ledger)\n- [Metronome: Remaining balance](https://docs.metronome.com/guides/customers-billing/optimize-customer-experience/get-remaining-balance.md)\n- [Zuora: Prepaid balance transaction fields](https://docs.zuora.com/en/zuora-billing/bill-your-customer/usage-billing/prepaid-with-drawdown/query-the-prepaid-with-drawdown-objects-through-data-query/prepaid-balance-transaction-fields)\n- [Lago: Wallets and prepaid credits](https://doc.getlago.com/guide/wallet-and-prepaid-credits/overview)\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"ARR Including Usage Run-Rate","slug":"arr-including-usage-run-rate","definition":"Annual Recurring Revenue (ARR) plus Usage Run-Rate: committed recurring revenue and annualised on-demand usage together. It is the figure Datadog, MongoDB and Confluent report as ARR.","formulas":["ARR Including Usage Run-Rate = ARR + Usage Run-Rate"],"benchmarks":null,"insight":"The annual scale of the business with usage included, on a basis comparable to the ARR consumption companies report. The gap to ARR is the share of scale that no contract guarantees.","commonMistakes":["Reporting this figure as ARR","Adding a run-rate over all consumption, which counts commitments and overage twice"],"sources":["Datadog: Form 10-K, 2025: https://www.sec.gov/Archives/edgar/data/1561550/000162828026008819/ddog-20251231.htm","MongoDB: Form 10-K, fiscal 2026: https://www.sec.gov/Archives/edgar/data/1441816/000162828026016799/mdb-20260131.htm","Confluent: Form 10-K, 2025: https://www.sec.gov/Archives/edgar/data/1699838/000169983826000006/cflt-20251231.htm","Ordway: ARR at public SaaS companies: https://ordwaylabs.com/resources/research/arr-public-saas-companies-research-study/","Stripe: Committed ARR explained: https://stripe.com/resources/more/committed-annual-recurring-revenue-explained","Bessemer: Cloud computing metrics: https://www.bvp.com/atlas/cloud-computing-metrics"],"department":"Finance","category":"Revenue Metrics","aliases":["ARR"],"rawMarkdown":"### ARR Including Usage Run-Rate\n\n**Definition:** Annual Recurring Revenue (ARR) plus Usage Run-Rate: committed recurring revenue and annualised on-demand usage together. It is the figure Datadog, MongoDB and Confluent report as ARR.\n\n**Formula:**\n```\nARR Including Usage Run-Rate = ARR + Usage Run-Rate\n```\n\n**No double counting:** ARR carries commitments and the overage realised above them; Usage Run-Rate carries on-demand consumption alone. Each dollar of usage sits in exactly one of the two.\n\n**Relation to ARR:** The GASP Standard keeps [ARR](core.md#arr-annual-recurring-revenue) committed, which is what the industry calls Committed ARR, CARR or Baseline ARR. Public consumption companies split between that policy and a usage-inclusive ARR, so the combined figure carries its own name and the two stay distinct.\n\n**What it tells you:** The annual scale of the business with usage included, on a basis comparable to the ARR consumption companies report. The gap to ARR is the share of scale that no contract guarantees.\n\n**Common mistakes:**\n- Reporting this figure as ARR\n- Adding a run-rate over all consumption, which counts commitments and overage twice\n\n**Related metrics:** ARR, Usage Run-Rate, Consumption Revenue\n\n**Sources:**\n- [Datadog: Form 10-K, 2025](https://www.sec.gov/Archives/edgar/data/1561550/000162828026008819/ddog-20251231.htm)\n- [MongoDB: Form 10-K, fiscal 2026](https://www.sec.gov/Archives/edgar/data/1441816/000162828026016799/mdb-20260131.htm)\n- [Confluent: Form 10-K, 2025](https://www.sec.gov/Archives/edgar/data/1699838/000169983826000006/cflt-20251231.htm)\n- [Ordway: ARR at public SaaS companies](https://ordwaylabs.com/resources/research/arr-public-saas-companies-research-study/)\n- [Stripe: Committed ARR explained](https://stripe.com/resources/more/committed-annual-recurring-revenue-explained)\n- [Bessemer: Cloud computing metrics](https://www.bvp.com/atlas/cloud-computing-metrics)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Credit Breakage","slug":"credit-breakage","definition":"The prepaid balance forfeited at expiry in the period.","formulas":["Credit Breakage = Sum of prepaid balances forfeited at expiry in the period"],"benchmarks":null,"insight":"How much prepaid consumption customers paid for and never used. A rising figure means commitments are sized above what customers consume, which tends to show up at renewal as a smaller commitment.","commonMistakes":["Treating Credit Breakage as the period's breakage revenue","Counting a rolled-over balance as forfeited"],"sources":["FASB: ASU 2014-09, Topic 606: https://storage.fasb.org/ASU%202014-09_Section%20A.pdf","IFRS 15: https://www.icab.org.bd/icabadmin/uploads/ckeditor/7910IFRS%2015.pdf","PwC Viewpoint: Unexercised rights (RR 7.4): https://viewpoint.pwc.com/dt/us/en/pwc/accounting_guides/revenue_from_contrac/revenue_from_contrac_US/chapter_7_options_to_US/74unexercised_rights_US.html","Stripe: Billing credits: https://docs.stripe.com/billing/subscriptions/usage-based/billing-credits","Orb: Prepurchase: https://docs.withorb.com/product-catalog/prepurchase","Zenskar: Credit breakage: https://www.zenskar.com/finance-glossary/credit-breakage"],"department":"Finance","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Credit Breakage\n\n**Definition:** The prepaid balance forfeited at expiry in the period.\n\n**Formula:**\n```\nCredit Breakage = Sum of prepaid balances forfeited at expiry in the period\n```\n\nExpiry events carry a negative `credit_amount` and the metric reports the positive amount.\n\n**Excludes:** Balances that roll over into a new term. A rollover writes no expiry event; the new term's grant carries the new expiry date.\n\n**What it tells you:** How much prepaid consumption customers paid for and never used. A rising figure means commitments are sized above what customers consume, which tends to show up at renewal as a smaller commitment.\n\n**Note:** The event is the forfeiture, not the recognition. Breakage is codified in ASC 606-10-55-48 and IFRS 15.B46: a company that expects to be entitled to breakage recognises it in proportion to the pattern of consumption, and otherwise when the chance of the customer using the balance becomes remote. Recognising breakage only when it occurs is not a permitted policy, and amounts owed under unclaimed-property law are never revenue. Credit Breakage therefore differs in timing from breakage revenue. Credit-billing systems record expiry as a movement on the ledger; the public consumption filers do not disclose breakage.\n\n**Common mistakes:**\n- Treating Credit Breakage as the period's breakage revenue\n- Counting a rolled-over balance as forfeited\n\n**Related metrics:** Prepaid Credit Balance, Consumption Revenue\n\n**Sources:**\n- [FASB: ASU 2014-09, Topic 606](https://storage.fasb.org/ASU%202014-09_Section%20A.pdf)\n- [IFRS 15](https://www.icab.org.bd/icabadmin/uploads/ckeditor/7910IFRS%2015.pdf)\n- [PwC Viewpoint: Unexercised rights (RR 7.4)](https://viewpoint.pwc.com/dt/us/en/pwc/accounting_guides/revenue_from_contrac/revenue_from_contrac_US/chapter_7_options_to_US/74unexercised_rights_US.html)\n- [Stripe: Billing credits](https://docs.stripe.com/billing/subscriptions/usage-based/billing-credits)\n- [Orb: Prepurchase](https://docs.withorb.com/product-catalog/prepurchase)\n- [Zenskar: Credit breakage](https://www.zenskar.com/finance-glossary/credit-breakage)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Consumption Revenue Growth Rate","slug":"consumption-revenue-growth-rate","definition":"The month-over-month change in Consumption Revenue.","formulas":["Consumption Revenue Growth Rate = (Consumption Revenue this month − Consumption Revenue last month) / Consumption Revenue last month × 100"],"benchmarks":null,"insight":"Whether usage is accelerating or slowing. It is the consumption counterpart of MRR Growth Rate and the figure consumption companies discuss on their earnings calls.","commonMistakes":["Comparing periods of different lengths without adjusting","Counting credit purchases as growth"],"sources":["Snowflake: Form 10-K, fiscal 2026: https://www.sec.gov/Archives/edgar/data/1640147/000164014726000008/snow-20260131.htm","MongoDB: Form 10-K, fiscal 2026: https://www.sec.gov/Archives/edgar/data/1441816/000162828026016799/mdb-20260131.htm"],"department":"Finance","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Consumption Revenue Growth Rate\n\n**Definition:** The month-over-month change in Consumption Revenue.\n\n**Formula:**\n```\nConsumption Revenue Growth Rate = (Consumption Revenue this month − Consumption Revenue last month) / Consumption Revenue last month × 100\n```\n\n**What it tells you:** Whether usage is accelerating or slowing. It is the consumption counterpart of MRR Growth Rate and the figure consumption companies discuss on their earnings calls.\n\n**Note:** No benchmark publisher defines this metric; the GASP Standard defines it so consumption growth is measured one way. It is undefined for a month that follows one with no consumption revenue.\n\n**Common mistakes:**\n- Comparing periods of different lengths without adjusting\n- Counting credit purchases as growth\n\n**Related metrics:** Consumption Revenue, MRR Growth Rate, Consumption Net Revenue Retention\n\n**Sources:**\n- [Snowflake: Form 10-K, fiscal 2026](https://www.sec.gov/Archives/edgar/data/1640147/000164014726000008/snow-20260131.htm)\n- [MongoDB: Form 10-K, fiscal 2026](https://www.sec.gov/Archives/edgar/data/1441816/000162828026016799/mdb-20260131.htm)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Consumption Net Revenue Retention","slug":"consumption-net-revenue-retention","definition":"The consumption revenue of the customers active at period start, over a twelve-month period, divided by the same customers' consumption revenue over the twelve months before. Consumption Net Revenue Retention (Consumption NRR) reads year two over year one, Snowflake's basis.","formulas":["Consumption NRR = Consumption Revenue of the period-start cohort in the twelve-month period / Consumption Revenue of the same cohort in the prior twelve months × 100"],"benchmarks":null,"insight":"Whether the customers you had a year ago consume more or less today, including the pay-as-you-go customers whom NRR leaves outside its cohort.","commonMistakes":["Reporting Consumption NRR as NRR","Including customers acquired during the period","Measuring over a period shorter than twelve months, where seasonal consumption distorts the ratio"],"sources":["Snowflake: Form 10-K, fiscal 2026: https://www.sec.gov/Archives/edgar/data/1640147/000164014726000008/snow-20260131.htm","Twilio: Form 10-K, 2025: https://www.sec.gov/Archives/edgar/data/1447669/000144766926000021/twlo-20251231.htm","Ordway: How public companies calculate NRR: https://ordwaylabs.com/resources/research/how-public-companies-calculate-net-revenue-retention.md","Ordway: NRR for usage-based pricing: https://ordwaylabs.com/blog/net-revenue-retention-for-usage-based-pricing/","SaaS Capital: Pitfalls in measuring churn: https://www.saas-capital.com/blog-posts/grrumbling-about-retention-metrics-or-pitfalls-in-measuring-saas-churn/"],"department":"Finance","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Consumption Net Revenue Retention\n\n**Definition:** The consumption revenue of the customers active at period start, over a twelve-month period, divided by the same customers' consumption revenue over the twelve months before. Consumption Net Revenue Retention (Consumption NRR) reads year two over year one, Snowflake's basis.\n\n**Formula:**\n```\nConsumption NRR = Consumption Revenue of the period-start cohort in the twelve-month period / Consumption Revenue of the same cohort in the prior twelve months × 100\n```\n\n**Cohort:** The customers on the customer snapshot at period start. A customer in the cohort that consumed nothing in the period counts at zero; customers acquired during the period stay out. A pay-as-you-go customer enters the cohort once the company's customer status marks it active.\n\n**Two bases:** [Net Revenue Retention (NRR)](core.md#net-revenue-retention-nrr) reads MRR movements and already includes realised usage through the `usage_realisation` expansion, so it stays the main retention figure. Consumption NRR is a second basis, on recognised consumption: Snowflake reports on it, Twilio on recognised revenue, and Ordway finds public companies split between a revenue basis and an ARR basis. A company reporting this figure names it Consumption NRR rather than NRR.\n\n**What it tells you:** Whether the customers you had a year ago consume more or less today, including the pay-as-you-go customers whom NRR leaves outside its cohort.\n\n**Common mistakes:**\n- Reporting Consumption NRR as NRR\n- Including customers acquired during the period\n- Measuring over a period shorter than twelve months, where seasonal consumption distorts the ratio\n\n**Related metrics:** Net Revenue Retention (NRR), Consumption Revenue, Consumption Revenue Growth Rate\n\n**Sources:**\n- [Snowflake: Form 10-K, fiscal 2026](https://www.sec.gov/Archives/edgar/data/1640147/000164014726000008/snow-20260131.htm)\n- [Twilio: Form 10-K, 2025](https://www.sec.gov/Archives/edgar/data/1447669/000144766926000021/twlo-20251231.htm)\n- [Ordway: How public companies calculate NRR](https://ordwaylabs.com/resources/research/how-public-companies-calculate-net-revenue-retention.md)\n- [Ordway: NRR for usage-based pricing](https://ordwaylabs.com/blog/net-revenue-retention-for-usage-based-pricing/)\n- [SaaS Capital: Pitfalls in measuring churn](https://www.saas-capital.com/blog-posts/grrumbling-about-retention-metrics-or-pitfalls-in-measuring-saas-churn/)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Revenue per Employee","slug":"revenue-per-employee","definition":"Annual Recurring Revenue (ARR) divided by total headcount.","formulas":["Revenue per Employee = ARR / Total employees"],"benchmarks":"- Below $100K: Early stage or overstaffed\n- $100K-$200K: Growing\n- $200K-$300K: Efficient\n- Above $300K: Highly efficient","insight":"How much recurring revenue the company carries per person, a rough measure of overall productivity.","commonMistakes":null,"sources":[],"department":"Finance","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Revenue per Employee\n\n**Definition:** Annual Recurring Revenue (ARR) divided by total headcount.\n\n**Formula:**\n```\nRevenue per Employee = ARR / Total employees\n```\n\n**Benchmarks:**\n- Below $100K: Early stage or overstaffed\n- $100K-$200K: Growing\n- $200K-$300K: Efficient\n- Above $300K: Highly efficient\n\n**What it tells you:** How much recurring revenue the company carries per person, a rough measure of overall productivity.\n\n---","signalType":"outcome","signalTypeSecondary":"efficiency","dualLens":null,"dualLensNote":null},{"name":"Gross Margin","slug":"gross-margin","definition":"Revenue minus cost of goods sold (COGS), as a percentage of revenue. Measures profitability after direct delivery costs.","formulas":["Gross Margin = (Revenue (GAAP) - COGS) / Revenue (GAAP) × 100","GM-O = (Revenue − COGS − Support − CS − Implementation − Onboarding) / Revenue × 100","GM-M = (Revenue − COGS) / Revenue × 100","GM-M = GM-O + (Support + CS + Implementation + Onboarding costs) / Revenue × 100"],"benchmarks":"- Below 60%: Low, may indicate infrastructure-heavy or services-heavy business\n- 60-70%: Moderate (Seed/Series A acceptable while scaling)\n- 70-80%: Good, typical for SaaS (Most VCs require 70%+ for investment)\n- 75-80%: Series B+ expected, attractive to investors\n- 80-85%: Best-in-class (commands valuation premium)","insight":"How much of each dollar of revenue is available after delivery costs. Higher margins = more scalable business.","commonMistakes":null,"sources":["The SaaS CFO: How to Calculate SaaS Gross Margin: https://www.thesaascfo.com/how-to-calculate-saas-gross-margin/","CloudZero: SaaS Gross Margin: https://www.cloudzero.com/blog/saas-gross-margin/","Drivetrain: SaaS Gross Margin: https://www.drivetrain.ai/strategic-finance-glossary/saas-gross-margin"],"department":"Finance","category":"Profitability Metrics","aliases":[],"rawMarkdown":"### Gross Margin\n\nSee [Core Metrics](core.md#gross-margin) for full definition.\n\n---","signalType":"outcome","signalTypeSecondary":"efficiency","dualLens":null,"dualLensNote":null},{"name":"Operating Margin (EBIT Margin)","slug":"operating-margin-ebit-margin","definition":"Operating income as a percentage of revenue.","formulas":["Operating Margin = Operating Income / Revenue × 100"],"benchmarks":"- Below -50%: Heavy investment phase\n- -50% to 0%: Growth mode\n- 0-20%: Path to profitability\n- Above 20%: Profitable and efficient","insight":null,"commonMistakes":null,"sources":[],"department":"Finance","category":"Profitability Metrics","aliases":[],"rawMarkdown":"### Operating Margin (EBIT Margin)\n\n**Definition:** Operating income as a percentage of revenue.\n\n**Formula:**\n```\nOperating Margin = Operating Income / Revenue × 100\n```\n\nOperating Income = Revenue - COGS - Operating Expenses\n\n**Benchmarks:**\n- Below -50%: Heavy investment phase\n- -50% to 0%: Growth mode\n- 0-20%: Path to profitability\n- Above 20%: Profitable and efficient\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"EBITDA Margin","slug":"ebitda-margin","definition":"Earnings before interest, taxes, depreciation and amortization as a percentage of revenue.","formulas":["EBITDA Margin = EBITDA / Revenue × 100"],"benchmarks":null,"insight":"Operational profitability before non-cash charges.","commonMistakes":null,"sources":[],"department":"Finance","category":"Profitability Metrics","aliases":["EBITDA"],"rawMarkdown":"### EBITDA Margin\n\n**Definition:** Earnings before interest, taxes, depreciation and amortization as a percentage of revenue.\n\n**Formula:**\n```\nEBITDA Margin = EBITDA / Revenue × 100\n```\n\n**What it tells you:** Operational profitability before non-cash charges.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Net Income Margin","slug":"net-income-margin","definition":"Net income as a percentage of revenue.","formulas":["Net Income Margin = Net Income / Revenue × 100"],"benchmarks":null,"insight":"Bottom line profitability.","commonMistakes":null,"sources":[],"department":"Finance","category":"Profitability Metrics","aliases":[],"rawMarkdown":"### Net Income Margin\n\n**Definition:** Net income as a percentage of revenue.\n\n**Formula:**\n```\nNet Income Margin = Net Income / Revenue × 100\n```\n\n**What it tells you:** Bottom line profitability.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Rule of 40","slug":"rule-of-40","definition":"A heuristic that balances growth and profitability. A healthy SaaS company's growth rate plus profit margin should equal 40% or more.","formulas":["Rule of 40 = ARR Growth Rate (YoY %) + EBITDA Margin (%)"],"benchmarks":"- Below 20: Struggling (Median public SaaS Q1 2025: 12-15%)\n- 20-40: Developing (Median mid-2024: 34%)\n- 40+: Healthy balance of growth and profitability\n- 60+: Elite (top quartile: 45%+ growth component)","insight":"Whether you're balancing growth and profitability appropriately. You can grow fast and lose money, or grow slow and be profitable, but the sum should hit 40.","commonMistakes":null,"sources":["Wall Street Prep: Rule of 40: https://www.wallstreetprep.com/knowledge/rule-of-40/","The SaaS CFO: Rule of 40: https://www.thesaascfo.com/rule-of-40-saas/","Corporate Finance Institute: Rule of 40: https://corporatefinanceinstitute.com/resources/valuation/rule-of-40/"],"department":"Finance","category":"Profitability Metrics","aliases":[],"rawMarkdown":"### Rule of 40\n\nSee [Core Metrics](core.md#rule-of-40) for full definition.\n\n---","signalType":"outcome","signalTypeSecondary":"efficiency","dualLens":null,"dualLensNote":null},{"name":"Cash Burn Rate","slug":"cash-burn-rate","definition":"Net cash consumed per month.","formulas":["Burn Rate = (Cash at start of period - Cash at end of period) / Months in period"],"benchmarks":null,"insight":"How fast cash is being consumed.","commonMistakes":null,"sources":[],"department":"Finance","category":"Cash Metrics","aliases":[],"rawMarkdown":"### Cash Burn Rate\n\n**Definition:** Net cash consumed per month.\n\n**Formula:**\n```\nBurn Rate = (Cash at start of period - Cash at end of period) / Months in period\n```\n\n**What it tells you:** How fast cash is being consumed.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Cash Runway","slug":"cash-runway","definition":"Time until cash runs out at current burn rate.","formulas":["Runway = Current cash / Monthly burn rate"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Finance","category":"Cash Metrics","aliases":[],"rawMarkdown":"### Cash Runway\n\n**Definition:** Time until cash runs out at current burn rate.\n\n**Formula:**\n```\nRunway = Current cash / Monthly burn rate\n```\n\nMeasured in months.\n\n**Targets:**\n- Below 6 months: Critical, fundraise immediately\n- 6-12 months: Urgent attention needed\n- 12-18 months: Planning window\n- Above 18 months: Comfortable\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Free Cash Flow (FCF)","slug":"free-cash-flow-fcf","definition":"Cash generated from operations minus capital expenditures.","formulas":["FCF = Operating cash flow - Capital expenditures"],"benchmarks":null,"insight":"Cash available for growth, debt repayment or distribution.","commonMistakes":null,"sources":[],"department":"Finance","category":"Cash Metrics","aliases":["FCF"],"rawMarkdown":"### Free Cash Flow (FCF)\n\n**Definition:** Cash generated from operations minus capital expenditures.\n\n**Formula:**\n```\nFCF = Operating cash flow - Capital expenditures\n```\n\n**What it tells you:** Cash available for growth, debt repayment or distribution.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Free Cash Flow Margin","slug":"free-cash-flow-margin","definition":"FCF as a percentage of revenue.","formulas":["FCF Margin = Free Cash Flow / Revenue × 100"],"benchmarks":"- Below -20%: Heavy investment\n- -20% to 0%: Growth mode\n- 0-10%: Cash flow positive\n- Above 10%: Strong cash generation","insight":null,"commonMistakes":null,"sources":[],"department":"Finance","category":"Cash Metrics","aliases":[],"rawMarkdown":"### Free Cash Flow Margin\n\n**Definition:** FCF as a percentage of revenue.\n\n**Formula:**\n```\nFCF Margin = Free Cash Flow / Revenue × 100\n```\n\n**Benchmarks:**\n- Below -20%: Heavy investment\n- -20% to 0%: Growth mode\n- 0-10%: Cash flow positive\n- Above 10%: Strong cash generation\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"CAC Payback Period","slug":"cac-payback-period","definition":"The number of months required to recover the cost of acquiring a customer. Also called \"Months to Recover CAC\" or \"Time to Recover CAC.\"","formulas":["CAC Payback = CAC / (ARPA × Gross Margin)","CAC Payback-O = CAC-O / (ARPA × GM-O)","CAC Payback-M = CAC-M / (ARPA × GM-M)","CAC Payback-O = CAC Payback-M × (CAC-O / CAC-M) × (GM-M / GM-O)"],"benchmarks":"- Under 12 months: Good, investor-friendly target (best-in-class)\n- 12-18 months: Acceptable (Median 2024: 18-20 months)\n- 18-24 months: Concerning for most segments\n- Over 24 months: Requires attention","insight":"How many months of gross profit a new customer takes to repay what it cost to win. Payback sets how much cash growth ties up, so it limits how fast a company can grow on its own money.","commonMistakes":null,"sources":["Wall Street Prep: CAC Payback Period: https://www.wallstreetprep.com/knowledge/cac-payback-period/","Maxio: CAC Payback: https://www.maxio.com/saaspedia/cac-payback","Corporate Finance Institute: CAC Payback Period: https://corporatefinanceinstitute.com/resources/valuation/cac-payback-period/"],"department":"Finance","category":"Efficiency Metrics","aliases":["CAC"],"rawMarkdown":"### CAC Payback Period\n\nSee [Core Metrics](core.md#cac-payback-period) for full definition.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"LTV:CAC Ratio","slug":"ltvcac-ratio","definition":"The ratio of customer lifetime value to acquisition cost. Measures the return on investment from sales and marketing spend.","formulas":["LTV:CAC = LTV / CAC","LTV:CAC-O = LTV-O / CAC-O","LTV:CAC-M = LTV-M / CAC-M","LTV:CAC-O = LTV:CAC-M × (LTV-O / LTV-M) × (CAC-M / CAC-O)"],"benchmarks":"- Below 1:1: Losing money on every customer\n- 1:1 to 2:1: Breaking even or marginal, concerning to investors\n- 3:1 to 4:1: Industry standard, healthy sustainable growth (Median B2B SaaS: 3.2:1)\n- 4:1 to 5:1: Strong business model\n- Above 5:1: Under-investing in growth; could be growing faster","insight":"Unit economics health. Are customers worth more than they cost to acquire?","commonMistakes":null,"sources":["Wall Street Prep: LTV/CAC Ratio: https://www.wallstreetprep.com/knowledge/ltv-cac-ratio/","SaaS Capital: LTV/CAC Benchmarks: https://www.saas-capital.com/blog-posts/ltv-to-cac-ratio/","Corporate Finance Institute: LTV/CAC: https://corporatefinanceinstitute.com/resources/valuation/ltv-cac-ratio/"],"department":"Finance","category":"Efficiency Metrics","aliases":[],"rawMarkdown":"### LTV:CAC Ratio\n\nSee [Core Metrics](core.md#ltvcac-ratio) for full definition.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Magic Number","slug":"magic-number","definition":"Sales efficiency metric measuring revenue generated per dollar of sales and marketing spend.","formulas":["Magic Number = (QoQ ARR growth) / (Prior quarter S&M spend)"],"benchmarks":"- Below 0.5: Inefficient, fix before scaling\n- 0.5-0.75: Acceptable\n- 0.75-1.0: Efficient (2024 median: 0.90)\n- Above 1.0: Very efficient, invest more aggressively","insight":"Whether sales and marketing investment is generating sufficient returns.","commonMistakes":null,"sources":["Benchmarkit: 2025 SaaS Metrics: https://www.benchmarkit.ai/2025benchmarks","Drivetrain: SaaS Magic Number: https://www.drivetrain.ai/strategic-finance-glossary/what-is-magic-number-saas-companies"],"department":"Finance","category":"Efficiency Metrics","aliases":[],"rawMarkdown":"### Magic Number\n\n**Definition:** Sales efficiency metric measuring revenue generated per dollar of sales and marketing spend.\n\n**Formula:**\n```\nMagic Number = (QoQ ARR growth) / (Prior quarter S&M spend)\n```\n\n**Benchmarks:**\n- Below 0.5: Inefficient, fix before scaling\n- 0.5-0.75: Acceptable\n- 0.75-1.0: Efficient (2024 median: 0.90)\n- Above 1.0: Very efficient, invest more aggressively\n\n**What it tells you:** Whether sales and marketing investment is generating sufficient returns.\n\n**Sources:**\n- [Benchmarkit: 2025 SaaS Metrics](https://www.benchmarkit.ai/2025benchmarks)\n- [Drivetrain: SaaS Magic Number](https://www.drivetrain.ai/strategic-finance-glossary/what-is-magic-number-saas-companies)\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Burn Multiple","slug":"burn-multiple","definition":"Net burn divided by net new ARR. Popularized by David Sacks.","formulas":["Burn Multiple = Net burn / Net new ARR"],"benchmarks":"- Below 1x: Excellent (top 10% of Series A companies)\n- 1.0-1.5x: Strong (top quartile)\n- 1.5-2x: Median, acceptable\n- 2.0-3x: Concerning, especially above $20M ARR\n- Above 3x: Critical, requires immediate attention","insight":"How much cash is being burned to generate each dollar of new ARR.","commonMistakes":null,"sources":["CFO Advisors: 2025 Burn Multiple Benchmarks: https://www.cfoadvisors.com/blog/2025-burn-multiple-benchmarks_-how-series-a-saas-startups-can-prove-capital-efficiency","Benchmarkit: SaaS Performance Metrics: https://www.benchmarkit.ai/2025benchmarks"],"department":"Finance","category":"Efficiency Metrics","aliases":[],"rawMarkdown":"### Burn Multiple\n\n**Definition:** Net burn divided by net new ARR. Popularized by David Sacks.\n\n**Formula:**\n```\nBurn Multiple = Net burn / Net new ARR\n```\n\n**Benchmarks:**\n- Below 1x: Excellent (top 10% of Series A companies)\n- 1.0-1.5x: Strong (top quartile)\n- 1.5-2x: Median, acceptable\n- 2.0-3x: Concerning, especially above $20M ARR\n- Above 3x: Critical, requires immediate attention\n\n**Scale expectations:** Burn multiple should decrease as company scales. Target <1.0x by $25M-$50M ARR range.\n\n**What it tells you:** How much cash is being burned to generate each dollar of new ARR.\n\n**Sources:**\n- [CFO Advisors: 2025 Burn Multiple Benchmarks](https://www.cfoadvisors.com/blog/2025-burn-multiple-benchmarks_-how-series-a-saas-startups-can-prove-capital-efficiency)\n- [Benchmarkit: SaaS Performance Metrics](https://www.benchmarkit.ai/2025benchmarks)\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Opex Ratio","slug":"opex-ratio","definition":"Operating expenses as a percentage of revenue.","formulas":["Opex Ratio = Operating expenses / Revenue × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Finance","category":"Operating Expense Metrics","aliases":[],"rawMarkdown":"### Opex Ratio\n\n**Definition:** Operating expenses as a percentage of revenue.\n\n**Formula:**\n```\nOpex Ratio = Operating expenses / Revenue × 100\n```\n\nOpex Ratio can also be reported per cost centre, over all revenue: each row divides that centre's operating expenses by total revenue, so the rows sum to the Opex Ratio.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"S&M as % of Revenue","slug":"sm-as-of-revenue","definition":"Sales and marketing spend as percentage of revenue.","formulas":["S&M % = Sales & Marketing expense / Revenue × 100"],"benchmarks":"- Early stage: 80-120%\n- Growth stage: 40-60%\n- Mature: 20-40%","insight":null,"commonMistakes":null,"sources":[],"department":"Finance","category":"Operating Expense Metrics","aliases":[],"rawMarkdown":"### S&M as % of Revenue\n\n**Definition:** Sales and marketing spend as percentage of revenue.\n\n**Formula:**\n```\nS&M % = Sales & Marketing expense / Revenue × 100\n```\n\n**Benchmarks:**\n- Early stage: 80-120%\n- Growth stage: 40-60%\n- Mature: 20-40%\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"R&D as % of Revenue","slug":"rd-as-of-revenue","definition":"Research and development spend as percentage of revenue.","formulas":["R&D % = R&D expense / Revenue × 100"],"benchmarks":"- SaaS typical: 15-25%","insight":null,"commonMistakes":null,"sources":[],"department":"Finance","category":"Operating Expense Metrics","aliases":[],"rawMarkdown":"### R&D as % of Revenue\n\n**Definition:** Research and development spend as percentage of revenue.\n\n**Formula:**\n```\nR&D % = R&D expense / Revenue × 100\n```\n\n**Benchmarks:**\n- SaaS typical: 15-25%\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"G&A as % of Revenue","slug":"ga-as-of-revenue","definition":"General and administrative spend as percentage of revenue.","formulas":["G&A % = G&A expense / Revenue × 100"],"benchmarks":"- SaaS typical: 10-15%","insight":null,"commonMistakes":null,"sources":[],"department":"Finance","category":"Operating Expense Metrics","aliases":[],"rawMarkdown":"### G&A as % of Revenue\n\n**Definition:** General and administrative spend as percentage of revenue.\n\n**Formula:**\n```\nG&A % = G&A expense / Revenue × 100\n```\n\n**Benchmarks:**\n- SaaS typical: 10-15%\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Days Sales Outstanding (DSO)","slug":"days-sales-outstanding-dso","definition":"Average days to collect payment after invoicing.","formulas":["DSO = (Accounts Receivable / Revenue) × Days in period"],"benchmarks":"- Below 30 days: Excellent\n- 30-45 days: Good\n- 45-60 days: Average\n- Above 60 days: Collection issues","insight":null,"commonMistakes":null,"sources":[],"department":"Finance","category":"Collections Metrics","aliases":["DSO"],"rawMarkdown":"### Days Sales Outstanding (DSO)\n\nSee [RevOps](revops.md#days-sales-outstanding-dso) for the canonical definition: accounts receivable over revenue, times days in the period.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Collection Rate","slug":"collection-rate","definition":"Percentage of invoiced amounts collected.","formulas":["Collection Rate = Amount of invoices paid / Amount invoiced × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Finance","category":"Collections Metrics","aliases":[],"rawMarkdown":"### Collection Rate\n\n**Definition:** Percentage of invoiced amounts collected.\n\n**Formula:**\n```\nCollection Rate = Amount of invoices paid / Amount invoiced × 100\n```\n\nBoth sides read the invoices issued in the period. An invoice counts as collected at its full amount once it carries a payment date. The GASP Standard has no payment amount field, so a partial payment counts as the whole invoice and cash received is measured at the invoice level.\n\n**Target:** >95%\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Bad Debt Rate","slug":"bad-debt-rate","definition":"Percentage of revenue written off as uncollectable.","formulas":["Bad Debt Rate = Bad debt expense / Revenue × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Finance","category":"Collections Metrics","aliases":[],"rawMarkdown":"### Bad Debt Rate\n\n**Definition:** Percentage of revenue written off as uncollectable.\n\n**Formula:**\n```\nBad Debt Rate = Bad debt expense / Revenue × 100\n```\n\n**Target:** <1%\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Visitors","slug":"visitors","definition":"Unique visitors to owned properties (website, app).","formulas":["Visitors = Sum of unique visitors in period across traffic sources"],"benchmarks":null,"insight":"Top of funnel awareness and reach.","commonMistakes":null,"sources":[],"department":"Marketing","category":"Funnel Metrics","aliases":[],"rawMarkdown":"### Visitors\n\n**Definition:** Unique visitors to owned properties (website, app).\n\n**Formula:**\n```\nVisitors = Sum of unique visitors in period across traffic sources\n```\n\nWeb analytics report unique visitors per traffic source, so the GASP Standard sums the per-source counts. A visitor who arrives through two sources counts once in each. Load one figure per source per reporting period so a returning visitor counts once within a source.\n\n**What it tells you:** Top of funnel awareness and reach.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Visitor-to-Lead Rate","slug":"visitor-to-lead-rate","definition":"Percentage of website visitors who become leads.","formulas":["Visitor-to-Lead = Leads captured / Visitors × 100"],"benchmarks":"- Below 2%: Below average, optimize capture\n- 2-3%: Average for B2B websites\n- 3-7%: Good (majority of SaaS market)\n- 7-12%: Excellent / top performers","insight":"Website and content effectiveness at capturing interest.","commonMistakes":null,"sources":["First Page Sage: B2B SaaS Funnel Benchmarks: https://firstpagesage.com/seo-blog/b2b-saas-funnel-conversion-benchmarks-fc/","Userpilot: B2B SaaS Funnel Conversion: https://userpilot.com/blog/b2b-saas-funnel-conversion-benchmarks/"],"department":"Marketing","category":"Funnel Metrics","aliases":[],"rawMarkdown":"### Visitor-to-Lead Rate\n\n**Definition:** Percentage of website visitors who become leads.\n\n**Formula:**\n```\nVisitor-to-Lead = Leads captured / Visitors × 100\n```\n\n**Benchmarks:**\n- Below 2%: Below average, optimize capture\n- 2-3%: Average for B2B websites\n- 3-7%: Good (majority of SaaS market)\n- 7-12%: Excellent / top performers\n\n**By channel:**\n- Referral traffic: ~2.9%\n- Organic search: ~2.6%\n- Email: ~2.4%\n- Paid search: 1.5-3.2%\n- Social: ~1% or less\n\n**Free trial impact:**\n- With credit card required: ~2%\n- Without credit card: ~10%\n\n**What it tells you:** Website and content effectiveness at capturing interest.\n\n**Sources:**\n- [First Page Sage: B2B SaaS Funnel Benchmarks](https://firstpagesage.com/seo-blog/b2b-saas-funnel-conversion-benchmarks-fc/)\n- [Userpilot: B2B SaaS Funnel Conversion](https://userpilot.com/blog/b2b-saas-funnel-conversion-benchmarks/)\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Leads","slug":"leads","definition":"Contacts who have expressed interest (form fill, signup, etc.).","formulas":["Leads = Total new leads captured in period"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Marketing","category":"Funnel Metrics","aliases":[],"rawMarkdown":"### Leads\n\n**Definition:** Contacts who have expressed interest (form fill, signup, etc.).\n\n**Formula:**\n```\nLeads = Total new leads captured in period\n```\n\nLeads are reported per lead source (such as organic, paid, referral, direct and events) and per lead stage as of period end.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Marketing Qualified Leads (MQLs)","slug":"marketing-qualified-leads-mqls","definition":"Leads that have demonstrated sufficient engagement and intent to warrant sales attention, based on criteria established between marketing and sales.","formulas":["MQLs = Leads meeting MQL criteria in period"],"benchmarks":null,"insight":"Volume of potentially sales-ready prospects.","commonMistakes":null,"sources":["Gartner: MQL vs SQL: https://www.gartner.com/en/digital-markets/insights/marketing-qualified-lead-vs-sales-qualified-lead","MetricHQ: MQL to SQL: https://www.metrichq.org/marketing/mql-to-sql-conversion-rate/"],"department":"Marketing","category":"Funnel Metrics","aliases":[],"rawMarkdown":"### Marketing Qualified Leads (MQLs)\n\n**Definition:** Leads that have demonstrated sufficient engagement and intent to warrant sales attention, based on criteria established between marketing and sales.\n\n**MQL criteria (typical):**\n- **Behavioral:** Demo requests, pricing page visits, content downloads, webinar attendance\n- **Firmographic:** Company size, industry, role matches ICP\n- **Engagement:** Lead score threshold reached\n\n**High-intent signals (prioritize these):**\n- Demo/trial requests\n- Pricing page visits\n- Buying guide downloads\n- Contact sales form fills\n\n**Formula:**\n```\nMQLs = Leads meeting MQL criteria in period\n```\n\nMQLs are reported per lead source.\n\n**What it tells you:** Volume of potentially sales-ready prospects.\n\n**Key distinction:** MQLs show engagement but not confirmed buying intent. SQLs pass sales qualification (BANT: Budget, Authority, Need, Timeline).\n\n**Sources:**\n- [Gartner: MQL vs SQL](https://www.gartner.com/en/digital-markets/insights/marketing-qualified-lead-vs-sales-qualified-lead)\n- [MetricHQ: MQL to SQL](https://www.metrichq.org/marketing/mql-to-sql-conversion-rate/)\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Lead-to-MQL Rate","slug":"lead-to-mql-rate","definition":"Percentage of leads that become MQLs.","formulas":["Lead-to-MQL = MQLs / Total leads × 100"],"benchmarks":"- Below 15%: Low quality leads or strict MQL criteria\n- 15-30%: Average\n- 30-50%: Good quality leads\n- Above 50%: May indicate loose criteria","insight":null,"commonMistakes":null,"sources":[],"department":"Marketing","category":"Funnel Metrics","aliases":[],"rawMarkdown":"### Lead-to-MQL Rate\n\n**Definition:** Percentage of leads that become MQLs.\n\n**Formula:**\n```\nLead-to-MQL = MQLs / Total leads × 100\n```\n\nLead-to-MQL Rate is reported per lead source.\n\n**Benchmarks:**\n- Below 15%: Low quality leads or strict MQL criteria\n- 15-30%: Average\n- 30-50%: Good quality leads\n- Above 50%: May indicate loose criteria\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Sales Qualified Leads (SQLs)","slug":"sales-qualified-leads-sqls","definition":"MQLs accepted by sales as worth pursuing.","formulas":["SQLs = MQLs accepted by sales in period"],"benchmarks":null,"insight":"Marketing and sales alignment on lead quality.","commonMistakes":null,"sources":[],"department":"Marketing","category":"Funnel Metrics","aliases":[],"rawMarkdown":"### Sales Qualified Leads (SQLs)\n\n**Definition:** MQLs accepted by sales as worth pursuing.\n\n**Formula:**\n```\nSQLs = MQLs accepted by sales in period\n```\n\n**What it tells you:** Marketing and sales alignment on lead quality.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"MQL-to-SQL Rate","slug":"mql-to-sql-rate","definition":"Percentage of MQLs accepted by sales as qualified.","formulas":["MQL-to-SQL = SQLs / MQLs × 100"],"benchmarks":"- Overall average (all industries): ~13%\n- B2B SaaS average: 20-30%\n- B2B SaaS top performers: 40%+\n- Website leads: ~31%\n- Referral leads: Highest conversion","insight":"Quality of MQLs from sales perspective and marketing-sales alignment.","commonMistakes":null,"sources":["MetricHQ: MQL to SQL Conversion Rate: https://www.metrichq.org/marketing/mql-to-sql-conversion-rate/","Geckoboard: MQL to SQL: https://www.geckoboard.com/best-practice/kpi-examples/mql-to-sql-conversion-rate/","Data-Mania: MQL to SQL Benchmarks: https://www.data-mania.com/blog/mql-to-sql-conversion-rate-benchmarks-2025/"],"department":"Marketing","category":"Funnel Metrics","aliases":[],"rawMarkdown":"### MQL-to-SQL Rate\n\n**Definition:** Percentage of MQLs accepted by sales as qualified.\n\n**Formula:**\n```\nMQL-to-SQL = SQLs / MQLs × 100\n```\n\nMQL-to-SQL Rate is reported per lead source.\n\n**Benchmarks:**\n- Overall average (all industries): ~13%\n- B2B SaaS average: 20-30%\n- B2B SaaS top performers: 40%+\n- Website leads: ~31%\n- Referral leads: Highest conversion\n\n**By lead scoring approach:**\n- Basic demographic scoring: ~20%\n- Behavioral scoring models: 39-40%\n\n**Speed-to-lead impact:**\n- Response within 1 hour: 53% conversion\n- Response after 24 hours: 17% conversion\n\n**What it tells you:** Quality of MQLs from sales perspective and marketing-sales alignment.\n\n**Sources:**\n- [MetricHQ: MQL to SQL Conversion Rate](https://www.metrichq.org/marketing/mql-to-sql-conversion-rate/)\n- [Geckoboard: MQL to SQL](https://www.geckoboard.com/best-practice/kpi-examples/mql-to-sql-conversion-rate/)\n- [Data-Mania: MQL to SQL Benchmarks](https://www.data-mania.com/blog/mql-to-sql-conversion-rate-benchmarks-2025/)\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"SQL-to-Opportunity Rate","slug":"sql-to-opportunity-rate","definition":"Percentage of SQLs that become pipeline opportunities.","formulas":["SQL-to-Opp = Opportunities created / SQLs × 100"],"benchmarks":"- Below 30%: Low conversion\n- 30-50%: Average\n- Above 50%: Good","insight":null,"commonMistakes":null,"sources":[],"department":"Marketing","category":"Funnel Metrics","aliases":[],"rawMarkdown":"### SQL-to-Opportunity Rate\n\n**Definition:** Percentage of SQLs that become pipeline opportunities.\n\n**Formula:**\n```\nSQL-to-Opp = Opportunities created / SQLs × 100\n```\n\n**Benchmarks:**\n- Below 30%: Low conversion\n- 30-50%: Average\n- Above 50%: Good\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Lead Velocity Rate (LVR)","slug":"lead-velocity-rate-lvr","definition":"Month-over-month growth in qualified leads (MQLs).","formulas":["LVR = (Qualified leads this month - Qualified leads last month) / Qualified leads last month × 100"],"benchmarks":"- 10%/month: Target after $1M ARR\n- 8%/month: Target after $3M ARR (supports 100%+ YoY growth)","insight":"Pipeline growth momentum. If LVR is consistently positive, you have the raw ingredients for growth.","commonMistakes":null,"sources":["SaaStr: Why LVR Is The Most Important Metric: https://www.saastr.com/why-lead-velocity-rate-lvr-is-the-most-important-metric-in-saas/","Wall Street Prep: Lead Velocity Rate: https://www.wallstreetprep.com/knowledge/lead-velocity-rate-lvr/","Corporate Finance Institute: LVR: https://corporatefinanceinstitute.com/resources/valuation/lead-velocity-rate-lvr/"],"department":"Marketing","category":"Funnel Metrics","aliases":["LVR"],"rawMarkdown":"### Lead Velocity Rate (LVR)\n\n**Definition:** Month-over-month growth in qualified leads (MQLs).\n\n**Formula:**\n```\nLVR = (Qualified leads this month - Qualified leads last month) / Qualified leads last month × 100\n```\n\n**Origin:** Popularized by Jason Lemkin (SaaStr), who calls it \"the most important metric in SaaS\" because it predicts future revenue 12-18 months out.\n\n**Why it matters:** Revenue reports deals that already closed. LVR moves months earlier, because this month's qualified leads become the pipeline that closes later.\n\n**Benchmarks (per Jason Lemkin):**\n- 10%/month: Target after $1M ARR\n- 8%/month: Target after $3M ARR (supports 100%+ YoY growth)\n\n**Critical:** Must use **qualified** leads (MQLs), not raw leads. Otherwise it becomes a vanity metric.\n\n**What it tells you:** Pipeline growth momentum. If LVR is consistently positive, you have the raw ingredients for growth.\n\n**Limitation:** Doesn't measure conversion quality. Track alongside MRR growth.\n\n**Sources:**\n- [SaaStr: Why LVR Is The Most Important Metric](https://www.saastr.com/why-lead-velocity-rate-lvr-is-the-most-important-metric-in-saas/)\n- [Wall Street Prep: Lead Velocity Rate](https://www.wallstreetprep.com/knowledge/lead-velocity-rate-lvr/)\n- [Corporate Finance Institute: LVR](https://corporatefinanceinstitute.com/resources/valuation/lead-velocity-rate-lvr/)\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Customer Acquisition Cost (CAC)","slug":"customer-acquisition-cost-cac","definition":"The total cost to acquire a new customer.","formulas":["CAC = (Sales + Marketing spend in period) / New customers acquired in period","CAC-O = Total Cost (Acquisition + Activation lifecycle) / New Customers Acquired","CAC-M = S&M Spend / New Customers Acquired","CAC-O = CAC-M + Implementation_Cost_per_Customer + Onboarding_Cost_per_Customer"],"benchmarks":"- SMB SaaS: $300-$1,000\n- Mid-market: $1,000-$5,000\n- Enterprise: $5,000-$50,000+\n- Target LTV:CAC ratio: 3:1 or higher (see LTV:CAC Ratio)","insight":"The investment required to acquire each customer.","commonMistakes":["Excluding salaries (they're a real cost)","Using wrong time period (customers acquired may not align with spend timing)","Including Customer Success costs","Mixing paid and organic (calculate separately for channel efficiency)"],"sources":["Wall Street Prep: Customer Acquisition Cost: https://www.wallstreetprep.com/knowledge/customer-acquisition-cost-cac/","Maxio: CAC Customer Acquisition Cost: https://www.maxio.com/saaspedia/cac-customer-acquisition-cost","Paddle: Customer Acquisition Cost: https://www.paddle.com/resources/customer-acquisition-cost"],"department":"Marketing","category":"Efficiency Metrics","aliases":["CAC"],"rawMarkdown":"### Customer Acquisition Cost (CAC)\n\nSee [Core Metrics](core.md#cac-customer-acquisition-cost) for full definition.\n\nMarketing typically owns a portion of CAC (marketing spend / new customers).\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Marketing CAC","slug":"marketing-cac","definition":"Marketing-only portion of acquisition cost: go-to-market cost booked to the marketing cost centre, divided by all new customers in the period.","formulas":["Marketing CAC = Marketing spend / New customers acquired"],"benchmarks":null,"insight":"Marketing efficiency at generating customers.","commonMistakes":null,"sources":[],"department":"Marketing","category":"Efficiency Metrics","aliases":[],"rawMarkdown":"### Marketing CAC\n\n**Definition:** Marketing-only portion of acquisition cost: go-to-market cost booked to the marketing cost centre, divided by all new customers in the period.\n\n**Formula:**\n```\nMarketing CAC = Marketing spend / New customers acquired\n```\n\n**What it tells you:** Marketing efficiency at generating customers.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"CAC by Channel","slug":"cac-by-channel","definition":"Customer acquisition cost broken down by marketing channel.","formulas":["Channel CAC = Channel ad spend / Deals won in period via channel"],"benchmarks":null,"insight":"Which channels are most efficient.","commonMistakes":null,"sources":[],"department":"Marketing","category":"Efficiency Metrics","aliases":["CAC"],"rawMarkdown":"### CAC by Channel\n\n**Definition:** Customer acquisition cost broken down by marketing channel.\n\n**Formula:**\n```\nChannel CAC = Channel ad spend / Deals won in period via channel\n```\n\n**Channels:** Paid ads, organic search, email, events, content, referral, direct and other.\n\nCAC by Channel is reported per channel: one value for each channel. Spend is campaign ad spend, which records its channel. New customers are deals won in the period, attributed to their first-touch channel. The cost ledger has no channel, so ledger cost cannot be split this way; Marketing CAC remains the total.\n\n**What it tells you:** Which channels are most efficient.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Cost per Lead (CPL)","slug":"cost-per-lead-cpl","definition":"Cost to acquire a lead.","formulas":["CPL = Marketing spend / Leads generated"],"benchmarks":null,"insight":"Top-of-funnel efficiency.","commonMistakes":null,"sources":[],"department":"Marketing","category":"Efficiency Metrics","aliases":["CPL"],"rawMarkdown":"### Cost per Lead (CPL)\n\n**Definition:** Cost to acquire a lead.\n\n**Formula:**\n```\nCPL = Marketing spend / Leads generated\n```\n\n**What it tells you:** Top-of-funnel efficiency.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Cost per MQL","slug":"cost-per-mql","definition":"Cost to acquire a marketing qualified lead.","formulas":["Cost per MQL = Marketing spend / MQLs generated"],"benchmarks":"- Average range: $30-$120\n- SMB-focused: $50-$150\n- Mid-market: $150-$400\n- Enterprise: $400-$1000+","insight":"Lead generation efficiency and channel performance.","commonMistakes":null,"sources":["SaaS Capital: Spending Benchmarks 2025: https://www.saas-capital.com/blog-posts/spending-benchmarks-for-private-b2b-saas-companies/","Martal: B2B Marketing ROI Benchmarks: https://martal.ca/b2b-digital-marketing-benchmarks-lb/"],"department":"Marketing","category":"Efficiency Metrics","aliases":[],"rawMarkdown":"### Cost per MQL\n\n**Definition:** Cost to acquire a marketing qualified lead.\n\n**Formula:**\n```\nCost per MQL = Marketing spend / MQLs generated\n```\n\n**Benchmarks (B2B SaaS 2025):**\n- Average range: $30-$120\n- SMB-focused: $50-$150\n- Mid-market: $150-$400\n- Enterprise: $400-$1000+\n\n**Cost per Lead (CPL) for context:**\n- B2B SaaS paid channels: ~$310\n- B2B SaaS organic: ~$164\n- Blended average: ~$237\n- Demo request leads: $600-$800\n\n**By channel:**\n- Google Ads: $150-$250\n- LinkedIn: $100-$200\n- Bing: $80-$180\n- SEO/Organic: Significantly lower\n\n**What it tells you:** Lead generation efficiency and channel performance.\n\n**Sources:**\n- [SaaS Capital: Spending Benchmarks 2025](https://www.saas-capital.com/blog-posts/spending-benchmarks-for-private-b2b-saas-companies/)\n- [Martal: B2B Marketing ROI Benchmarks](https://martal.ca/b2b-digital-marketing-benchmarks-lb/)\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Marketing Sourced Pipeline","slug":"marketing-sourced-pipeline","definition":"Pipeline value attributed to marketing efforts (first-touch attribution).","formulas":["Marketing Sourced Pipeline = Sum of opportunity value where first touch = marketing"],"benchmarks":null,"insight":"Marketing's contribution to sales pipeline.","commonMistakes":null,"sources":[],"department":"Marketing","category":"Efficiency Metrics","aliases":[],"rawMarkdown":"### Marketing Sourced Pipeline\n\n**Definition:** Pipeline value attributed to marketing efforts (first-touch attribution).\n\n**Formula:**\n```\nMarketing Sourced Pipeline = Sum of opportunity value where first touch = marketing\n```\n\n**Benchmark:** Strong programs generate 30-50% of sales pipeline from marketing.\n\n**What it tells you:** Marketing's contribution to sales pipeline.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Marketing Sourced Revenue","slug":"marketing-sourced-revenue","definition":"Closed revenue attributed to marketing efforts (first-touch attribution).","formulas":["Marketing Sourced Revenue = Sum of closed won revenue where first touch = marketing"],"benchmarks":null,"insight":"Marketing's contribution to actual revenue.","commonMistakes":null,"sources":[],"department":"Marketing","category":"Efficiency Metrics","aliases":[],"rawMarkdown":"### Marketing Sourced Revenue\n\n**Definition:** Closed revenue attributed to marketing efforts (first-touch attribution).\n\n**Formula:**\n```\nMarketing Sourced Revenue = Sum of closed won revenue where first touch = marketing\n```\n\n**What it tells you:** Marketing's contribution to actual revenue.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Marketing Influenced Pipeline/Revenue","slug":"marketing-influenced-pipelinerevenue","definition":"Pipeline or revenue where marketing touched the deal at any point (multi-touch attribution).","formulas":["Marketing Influenced = Pipeline/Revenue where any touch = marketing"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":["SaaS Capital: Spending Benchmarks: https://www.saas-capital.com/blog-posts/spending-benchmarks-for-private-b2b-saas-companies/","Digital Bloom: Pipeline Performance Benchmarks: https://thedigitalbloom.com/learn/pipeline-performance-benchmarks-2025/"],"department":"Marketing","category":"Efficiency Metrics","aliases":[],"rawMarkdown":"### Marketing Influenced Pipeline/Revenue\n\n**Definition:** Pipeline or revenue where marketing touched the deal at any point (multi-touch attribution).\n\n**Formula:**\n```\nMarketing Influenced = Pipeline/Revenue where any touch = marketing\n```\n\nTypically 2-3x higher than sourced (multiple touches on most B2B deals).\n\n**Note:** B2B buyers average 6-8 touches before purchase, so influenced is often more representative than sourced.\n\n**Sources:**\n- [SaaS Capital: Spending Benchmarks](https://www.saas-capital.com/blog-posts/spending-benchmarks-for-private-b2b-saas-companies/)\n- [Digital Bloom: Pipeline Performance Benchmarks](https://thedigitalbloom.com/learn/pipeline-performance-benchmarks-2025/)\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Organic Traffic","slug":"organic-traffic","definition":"Visitors from unpaid search.","formulas":["Organic Traffic = Visitors where source = organic search"],"benchmarks":null,"insight":"SEO effectiveness and brand awareness.","commonMistakes":null,"sources":[],"department":"Marketing","category":"Channel Metrics","aliases":[],"rawMarkdown":"### Organic Traffic\n\n**Definition:** Visitors from unpaid search.\n\n**Formula:**\n```\nOrganic Traffic = Visitors where source = organic search\n```\n\n**What it tells you:** SEO effectiveness and brand awareness.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Paid Media Efficiency (ROAS)","slug":"paid-media-efficiency-roas","definition":"Return on ad spend: closed won revenue from the paid ads channel in the period, divided by paid ad spend.","formulas":["ROAS = Revenue attributed to ads / Ad spend"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":["Varos: Google ROAS for B2B SaaS: https://varos.com/benchmarks/google-roas-for-b2b-saas","Directive: B2B ROAS Benchmarks 2025: https://directiveconsulting.com/blog/b2b-roas-benchmarks-high-performing-campaigns-in-2025/"],"department":"Marketing","category":"Channel Metrics","aliases":["ROAS"],"rawMarkdown":"### Paid Media Efficiency (ROAS)\n\n**Definition:** Return on ad spend: closed won revenue from the paid ads channel in the period, divided by paid ad spend.\n\n**Formula:**\n```\nROAS = Revenue attributed to ads / Ad spend\n```\n\nExpress as ratio (e.g., \"3:1\" or \"3x\").\n\n**B2B SaaS Benchmarks:**\n- Below 2x: Below average, but may be acceptable if LTV is high\n- 2-3x: Average for mid-market SaaS\n- 3-4x: Good\n- 4x+: Strong / top quartile\n\n**By segment:**\n- Enterprise: 2-3x typical (long sales cycles)\n- Mid-market SaaS: 2.6x average, 4.1x top quartile\n- SMB: Higher ROAS expected\n\n**By channel:**\n- Google Ads (Search): ~2.8x average\n- LinkedIn: ~2.2x average\n- Facebook: ~1.9x average\n- Branded search: Very high (captures existing intent)\n\n**Important:** Lower ROAS can be acceptable if customer LTV is high. Always consider LTV:CAC alongside ROAS.\n\n**Sources:**\n- [Varos: Google ROAS for B2B SaaS](https://varos.com/benchmarks/google-roas-for-b2b-saas)\n- [Directive: B2B ROAS Benchmarks 2025](https://directiveconsulting.com/blog/b2b-roas-benchmarks-high-performing-campaigns-in-2025/)\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Email Metrics","slug":"email-metrics","definition":"","formulas":[],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":["HubSpot: Email Marketing Benchmarks: https://blog.hubspot.com/sales/average-email-open-rate-benchmark","GetResponse: Email Marketing Benchmarks 2024: https://www.getresponse.com/resources/reports/email-marketing-benchmarks","SalesHive: B2B SaaS Email Benchmarks 2025: https://saleshive.com/blog/b2b-benchmarks-email-marketing-saas-you-need-know-2025/"],"department":"Marketing","category":"Channel Metrics","aliases":[],"rawMarkdown":"### Email Metrics\n\n| Metric | Formula | B2B SaaS Benchmark |\n|--------|---------|-----------|\n| Open Rate | Opens / Delivered × 100 | 25-40% |\n| Click Rate (CTR) | Clicks / Delivered × 100 | 2-4% |\n| Click-to-Open Rate | Clicks / Opens × 100 | 5-7% |\n| Unsubscribe Rate | Unsubscribes / Delivered × 100 | <0.3% |\n| Bounce Rate | Bounces / Sent × 100 | <2.5% |\n| Spam Complaint Rate | Complaints / Delivered × 100 | <0.1% |\n\n**Cold email/outbound (SaaS SDRs):**\n- Open rate: 38-42%\n- Reply rate: 3-8% (good: 5-10%)\n- Meeting booked rate: 1-2%\n\n**Important:** Apple Mail Privacy Protection (46% of email clients) inflates open rates by preloading images. Treat opens as directional only; focus on replies and conversions.\n\n**Sources:**\n- [HubSpot: Email Marketing Benchmarks](https://blog.hubspot.com/sales/average-email-open-rate-benchmark)\n- [GetResponse: Email Marketing Benchmarks 2024](https://www.getresponse.com/resources/reports/email-marketing-benchmarks)\n- [SalesHive: B2B SaaS Email Benchmarks 2025](https://saleshive.com/blog/b2b-benchmarks-email-marketing-saas-you-need-know-2025/)\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Content Performance","slug":"content-performance","definition":"","formulas":[],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Marketing","category":"Channel Metrics","aliases":[],"rawMarkdown":"### Content Performance\n\n| Metric | Formula |\n|--------|---------|\n| Downloads | Content pieces downloaded |\n| Engagement Rate | Engaged visitors / Total visitors × 100 |\n| Content-to-MQL | MQLs from content / Content engagements × 100 |\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Brand Awareness","slug":"brand-awareness","definition":"Percentage of target market aware of brand.","formulas":[],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Marketing","category":"Brand Metrics","aliases":[],"rawMarkdown":"### Brand Awareness\n\n**Definition:** Percentage of target market aware of brand.\n\n**Measurement:** Survey-based or search volume proxy.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Share of Voice","slug":"share-of-voice","definition":"Brand mentions relative to competitors.","formulas":["Share of Voice = Brand mentions / (Brand + Competitor mentions) × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Marketing","category":"Brand Metrics","aliases":[],"rawMarkdown":"### Share of Voice\n\n**Definition:** Brand mentions relative to competitors.\n\n**Formula:**\n```\nShare of Voice = Brand mentions / (Brand + Competitor mentions) × 100\n```\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"NPS (Marketing context)","slug":"nps-marketing-context","definition":"Net Promoter Score for prospects/market (vs customers).","formulas":[],"benchmarks":null,"insight":"Brand perception in broader market.","commonMistakes":null,"sources":[],"department":"Marketing","category":"Brand Metrics","aliases":["NPS"],"rawMarkdown":"### NPS (Marketing context)\n\n**Definition:** Net Promoter Score for prospects/market (vs customers).\n\n**What it tells you:** Brand perception in broader market.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Time to First Value (TTFV)","slug":"time-to-first-value-ttfv","definition":"Time from contract start to the customer's first meaningful value milestone.","formulas":["TTFV = Median of (First value milestone date - Contract start date)"],"benchmarks":"| Model | TTFV Target |\n|-------|-------------|\n| PLG/Self-serve | ~1.5 days (median: 1 day 2 hours) |\n| SMB with implementation | 1-2 weeks |\n| Mid-market | 2-4 weeks |\n| Enterprise | 4-12 weeks |","insight":"How quickly customers realize value, which feeds directly into retention.","commonMistakes":null,"sources":["Userpilot: Time-to-Value Benchmark Report 2024: https://userpilot.com/blog/time-to-value-benchmark-report-2024/","Userpilot: SaaS Product Metrics: https://userpilot.com/saas-product-metrics/"],"department":"Onboarding","category":"Time Metrics","aliases":["TTFV"],"rawMarkdown":"### Time to First Value (TTFV)\n\n**Definition:** Time from contract start to the customer's first meaningful value milestone.\n\n**Formula:**\n```\nTTFV = Median of (First value milestone date - Contract start date)\n```\n\n**First value milestone (examples):**\n- First successful transaction processed\n- First report generated\n- First integration completed\n- First core workflow executed\n\n**Benchmarks (per Userpilot 2024 data):**\n\n| Model | TTFV Target |\n|-------|-------------|\n| PLG/Self-serve | ~1.5 days (median: 1 day 2 hours) |\n| SMB with implementation | 1-2 weeks |\n| Mid-market | 2-4 weeks |\n| Enterprise | 4-12 weeks |\n\n**By industry:**\n- CRM/Sales tools: Faster (simpler onboarding)\n- Insurance/Martech: Longer (complex products)\n\n**By growth model:**\n- Sales-led: Slightly faster (paid upfront, motivated)\n- Product-led: Longer (free trials attract less committed users)\n\n**What it tells you:** How quickly customers realize value, which feeds directly into retention.\n\n**Sources:**\n- [Userpilot: Time-to-Value Benchmark Report 2024](https://userpilot.com/blog/time-to-value-benchmark-report-2024/)\n- [Userpilot: SaaS Product Metrics](https://userpilot.com/saas-product-metrics/)\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Time to Go-Live","slug":"time-to-go-live","definition":"Time from contract to production deployment.","formulas":["Time to Go-Live = Median of (Go-live date - Contract start date)"],"benchmarks":null,"insight":"Implementation efficiency.","commonMistakes":null,"sources":[],"department":"Onboarding","category":"Time Metrics","aliases":[],"rawMarkdown":"### Time to Go-Live\n\n**Definition:** Time from contract to production deployment.\n\n**Formula:**\n```\nTime to Go-Live = Median of (Go-live date - Contract start date)\n```\n\n**What it tells you:** Implementation efficiency.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Time to Full Adoption","slug":"time-to-full-adoption","definition":"Time from contract to using all purchased features/modules.","formulas":["Time to Full Adoption = Median of (Full adoption date - Contract start date)"],"benchmarks":null,"insight":"How long until customers are fully utilizing what they paid for.","commonMistakes":null,"sources":[],"department":"Onboarding","category":"Time Metrics","aliases":[],"rawMarkdown":"### Time to Full Adoption\n\n**Definition:** Time from contract to using all purchased features/modules.\n\n**Formula:**\n```\nTime to Full Adoption = Median of (Full adoption date - Contract start date)\n```\n\n**What it tells you:** How long until customers are fully utilizing what they paid for.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Onboarding Duration","slug":"onboarding-duration","definition":"Time from onboarding start to onboarding completion, for onboardings completed in the period.","formulas":["Onboarding Duration = Median of (Onboarding complete date - Onboarding start date)"],"benchmarks":null,"insight":"Length of onboarding program.","commonMistakes":null,"sources":[],"department":"Onboarding","category":"Time Metrics","aliases":[],"rawMarkdown":"### Onboarding Duration\n\n**Definition:** Time from onboarding start to onboarding completion, for onboardings completed in the period.\n\n**Formula:**\n```\nOnboarding Duration = Median of (Onboarding complete date - Onboarding start date)\n```\n\n**What it tells you:** Length of onboarding program.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Onboarding Completion Rate","slug":"onboarding-completion-rate","definition":"Percentage of customers who complete the onboarding program.","formulas":["Completion Rate = Customers completing onboarding / Customers starting onboarding × 100"],"benchmarks":"- Below 70%: Low, investigate friction points\n- 70-85%: Average\n- 85-95%: Good\n- Above 95%: Excellent","insight":"Onboarding program effectiveness.","commonMistakes":null,"sources":[],"department":"Onboarding","category":"Completion Metrics","aliases":[],"rawMarkdown":"### Onboarding Completion Rate\n\n**Definition:** Percentage of customers who complete the onboarding program.\n\n**Formula:**\n```\nCompletion Rate = Customers completing onboarding / Customers starting onboarding × 100\n```\n\nBoth counts come from the same period: onboardings completed in it over onboardings started in it.\n\n**Benchmarks:**\n- Below 70%: Low, investigate friction points\n- 70-85%: Average\n- 85-95%: Good\n- Above 95%: Excellent\n\n**What it tells you:** Onboarding program effectiveness.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Onboarding Milestone Completion Rate","slug":"onboarding-milestone-completion-rate","definition":"Percentage of due onboarding milestones that customers reach.","formulas":["Onboarding Milestone Completion Rate = Milestones reached / Milestones due × 100"],"benchmarks":null,"insight":"Where customers get stuck.","commonMistakes":null,"sources":[],"department":"Onboarding","category":"Completion Metrics","aliases":[],"rawMarkdown":"### Onboarding Milestone Completion Rate\n\n**Definition:** Percentage of due onboarding milestones that customers reach.\n\n**Formula:**\n```\nOnboarding Milestone Completion Rate = Milestones reached / Milestones due × 100\n```\n\nCount the milestones due in the period and how many of them were reached by period end. Track each milestone separately to identify drop-off points.\n\n**Typical milestones:**\n1. Kickoff (`kickoff`)\n2. First value (`first_value`)\n3. Go-live (`go_live`)\n4. Full adoption (`full_adoption`)\n\nThese are the canonical `onboarding_milestone` values. Data import, configuration, integration and training usually fall between kickoff and go-live. Teams whose onboarding tool records them can track them as sub-steps.\n\n**What it tells you:** Where customers get stuck.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"On-Time Completion Rate","slug":"on-time-completion-rate","definition":"Percentage of customers completing onboarding within target timeframe.","formulas":["On-Time Rate = Customers completing on time / Total customers completing × 100"],"benchmarks":null,"insight":"Predictability of onboarding timeline.","commonMistakes":null,"sources":[],"department":"Onboarding","category":"Completion Metrics","aliases":[],"rawMarkdown":"### On-Time Completion Rate\n\n**Definition:** Percentage of customers completing onboarding within target timeframe.\n\n**Formula:**\n```\nOn-Time Rate = Customers completing on time / Total customers completing × 100\n```\n\n**Target:** >80%\n\n**What it tells you:** Predictability of onboarding timeline.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Onboarding Engagement Score","slug":"onboarding-engagement-score","definition":"Level of customer engagement during onboarding.","formulas":["Engagement Score = Weighted average of engagement indicators (0-100)"],"benchmarks":null,"insight":"Customer investment in onboarding success.","commonMistakes":null,"sources":[],"department":"Onboarding","category":"Engagement Metrics","aliases":[],"rawMarkdown":"### Onboarding Engagement Score\n\n**Definition:** Level of customer engagement during onboarding.\n\n**Components:**\n- Attendance at scheduled sessions\n- Response time to onboarding team\n- Completion of assigned tasks\n- Login frequency during onboarding\n\n**Formula:**\n```\nEngagement Score = Weighted average of engagement indicators (0-100)\n```\n\nEach team sets its own weights, so the standard publishes no canonical formula for this score.\n\n**What it tells you:** Customer investment in onboarding success.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Session Attendance Rate","slug":"session-attendance-rate","definition":"Percentage of scheduled onboarding sessions attended.","formulas":["Attendance Rate = Sessions attended / Sessions scheduled × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Onboarding","category":"Engagement Metrics","aliases":[],"rawMarkdown":"### Session Attendance Rate\n\n**Definition:** Percentage of scheduled onboarding sessions attended.\n\n**Formula:**\n```\nAttendance Rate = Sessions attended / Sessions scheduled × 100\n```\n\nA session counts as attended when at least one customer attendee is recorded.\n\n**Target:** >90%\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Task Completion Rate","slug":"task-completion-rate","definition":"Percentage of assigned onboarding tasks completed by customer.","formulas":["Task Completion = Tasks completed / Tasks assigned × 100"],"benchmarks":null,"insight":"Customer follow-through on their responsibilities.","commonMistakes":null,"sources":[],"department":"Onboarding","category":"Engagement Metrics","aliases":[],"rawMarkdown":"### Task Completion Rate\n\n**Definition:** Percentage of assigned onboarding tasks completed by customer.\n\n**Formula:**\n```\nTask Completion = Tasks completed / Tasks assigned × 100\n```\n\n**What it tells you:** Customer follow-through on their responsibilities.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Onboarding CSAT","slug":"onboarding-csat","definition":"Customer satisfaction with the onboarding experience.","formulas":["Onboarding CSAT = Positive ratings / Total ratings × 100"],"benchmarks":"- Below 80%: Investigate pain points\n- 80-90%: Average\n- Above 90%: Good\n- Above 95%: Excellent","insight":null,"commonMistakes":null,"sources":[],"department":"Onboarding","category":"Quality Metrics","aliases":[],"rawMarkdown":"### Onboarding CSAT\n\n**Definition:** Customer satisfaction with the onboarding experience.\n\n**Formula:**\n```\nOnboarding CSAT = Positive ratings / Total ratings × 100\n```\n\nSurveyed at onboarding completion. Positive means 4 or 5 on a 5-point scale.\n\n**Benchmarks:**\n- Below 80%: Investigate pain points\n- 80-90%: Average\n- Above 90%: Good\n- Above 95%: Excellent\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Onboarding NPS","slug":"onboarding-nps","definition":"Net Promoter Score specifically for onboarding experience.","formulas":["Onboarding NPS = % Promoters - % Detractors"],"benchmarks":null,"insight":"Onboarding experience quality.","commonMistakes":null,"sources":[],"department":"Onboarding","category":"Quality Metrics","aliases":[],"rawMarkdown":"### Onboarding NPS\n\n**Definition:** Net Promoter Score specifically for onboarding experience.\n\n**Formula:**\n```\nOnboarding NPS = % Promoters - % Detractors\n```\n\n**What it tells you:** Onboarding experience quality.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Implementation Quality Score","slug":"implementation-quality-score","definition":"Assessment of implementation completeness and correctness.","formulas":[],"benchmarks":null,"insight":"Whether implementations are configured to work in production.","commonMistakes":null,"sources":[],"department":"Onboarding","category":"Quality Metrics","aliases":[],"rawMarkdown":"### Implementation Quality Score\n\n**Definition:** Assessment of implementation completeness and correctness.\n\n**Components:**\n- Configuration accuracy\n- Data quality post-migration\n- Integration health\n- User setup completeness\n\nThe score is an assessment against these components. The standard gives no weights, so it has no canonical formula.\n\n**What it tells you:** Whether implementations are configured to work in production.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Onboardings per Resource","slug":"onboardings-per-resource","definition":"Number of onboardings handled per implementation resource.","formulas":["Onboardings per Resource = Completed onboardings / Implementation headcount"],"benchmarks":null,"insight":"Team capacity and efficiency.","commonMistakes":null,"sources":[],"department":"Onboarding","category":"Efficiency Metrics","aliases":[],"rawMarkdown":"### Onboardings per Resource\n\n**Definition:** Number of onboardings handled per implementation resource.\n\n**Formula:**\n```\nOnboardings per Resource = Completed onboardings / Implementation headcount\n```\n\n**What it tells you:** Team capacity and efficiency.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Cost per Onboarding","slug":"cost-per-onboarding","definition":"Total onboarding cost divided by customers onboarded.","formulas":["Cost per Onboarding = Total onboarding team cost / Customers onboarded"],"benchmarks":null,"insight":"Unit economics of implementation.","commonMistakes":null,"sources":[],"department":"Onboarding","category":"Efficiency Metrics","aliases":[],"rawMarkdown":"### Cost per Onboarding\n\n**Definition:** Total onboarding cost divided by customers onboarded.\n\n**Formula:**\n```\nCost per Onboarding = Total onboarding team cost / Customers onboarded\n```\n\n**What it tells you:** Unit economics of implementation.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Time Spent per Onboarding","slug":"time-spent-per-onboarding","definition":"Total hours invested per customer onboarding.","formulas":["Hours per Onboarding = Total onboarding hours / Customers onboarded"],"benchmarks":"- Self-serve/digital: 0-2 hours\n- SMB: 5-15 hours\n- Mid-market: 20-50 hours\n- Enterprise: 50-200+ hours","insight":null,"commonMistakes":null,"sources":[],"department":"Onboarding","category":"Efficiency Metrics","aliases":[],"rawMarkdown":"### Time Spent per Onboarding\n\n**Definition:** Total hours invested per customer onboarding.\n\n**Formula:**\n```\nHours per Onboarding = Total onboarding hours / Customers onboarded\n```\n\n**Benchmarks:**\n- Self-serve/digital: 0-2 hours\n- SMB: 5-15 hours\n- Mid-market: 20-50 hours\n- Enterprise: 50-200+ hours\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Onboarding-to-Active Rate (Activation Rate)","slug":"onboarding-to-active-rate-activation-rate","definition":"Percentage of onboarded customers who become actively engaged.","formulas":["Activation Rate = Active customers post-onboarding / Customers completing onboarding × 100"],"benchmarks":"- Average across SaaS: 37.5%\n- PLG companies: 34.6%\n- Sales-led companies: 41.6%","insight":"Whether onboarding turns into real product usage.","commonMistakes":null,"sources":["Userpilot: User Activation Rate Benchmark 2024: https://userpilot.com/blog/user-activation-rate-benchmark-report-2024/","Userpilot: Activation Metrics for SaaS: https://userpilot.com/blog/activation-metrics-saas/"],"department":"Onboarding","category":"Outcome Metrics","aliases":[],"rawMarkdown":"### Onboarding-to-Active Rate (Activation Rate)\n\n**Definition:** Percentage of onboarded customers who become actively engaged.\n\n**Formula:**\n```\nActivation Rate = Active customers post-onboarding / Customers completing onboarding × 100\n```\n\nA customer counts as active once it has an activation date: the date it first met the product's usage threshold (its \"aha moment\").\n\n**Benchmarks (Userpilot 2024 data):**\n- Average across SaaS: 37.5%\n- PLG companies: 34.6%\n- Sales-led companies: 41.6%\n\n**By company size:**\n- $1-5M ARR: 41.6%\n- $5-10M ARR: 36.9%\n- $10-50M ARR: 17.6%\n- $50M+ ARR: 43.1%\n\n**Target:** Varies by model. For managed onboarding (enterprise), aim for >90%. For PLG/self-serve, 40%+ is strong.\n\n**What it tells you:** Whether onboarding turns into real product usage.\n\n**Sources:**\n- [Userpilot: User Activation Rate Benchmark 2024](https://userpilot.com/blog/user-activation-rate-benchmark-report-2024/)\n- [Userpilot: Activation Metrics for SaaS](https://userpilot.com/blog/activation-metrics-saas/)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"30-Day Retention (Post-Onboarding)","slug":"30-day-retention-post-onboarding","definition":"Percentage of customers still active 30 days after onboarding completion.","formulas":["30-Day Retention = Customers active at day 30 / Customers completing onboarding × 100"],"benchmarks":null,"insight":"Near-term stickiness after onboarding.","commonMistakes":null,"sources":[],"department":"Onboarding","category":"Outcome Metrics","aliases":[],"rawMarkdown":"### 30-Day Retention (Post-Onboarding)\n\n**Definition:** Percentage of customers still active 30 days after onboarding completion.\n\n**Formula:**\n```\n30-Day Retention = Customers active at day 30 / Customers completing onboarding × 100\n```\n\n**Target:** >95%\n\n**What it tells you:** Near-term stickiness after onboarding.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Onboarding Cohort Churn","slug":"onboarding-cohort-churn","definition":"Churn rate segmented by onboarding characteristics.","formulas":[],"benchmarks":null,"insight":"How onboarding experience predicts retention.","commonMistakes":null,"sources":[],"department":"Onboarding","category":"Outcome Metrics","aliases":[],"rawMarkdown":"### Onboarding Cohort Churn\n\n**Definition:** Churn rate segmented by onboarding characteristics.\n\n**Analysis dimensions:**\n- Onboarding duration (fast vs slow)\n- Onboarding completeness (full vs partial)\n- Engagement level during onboarding\n\n**What it tells you:** How onboarding experience predicts retention.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Feature Adoption at Go-Live","slug":"feature-adoption-at-go-live","definition":"Percentage of available features being used at go-live.","formulas":["Feature Adoption = Features in use / Total features available × 100"],"benchmarks":null,"insight":"Whether customers are set up to use the whole product.","commonMistakes":null,"sources":[],"department":"Onboarding","category":"Outcome Metrics","aliases":[],"rawMarkdown":"### Feature Adoption at Go-Live\n\n**Definition:** Percentage of available features being used at go-live.\n\n**Formula:**\n```\nFeature Adoption = Features in use / Total features available × 100\n```\n\nMeasured as a snapshot at the go-live milestone.\n\n**What it tells you:** Whether customers are set up to use the whole product.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Total Active Partners","slug":"total-active-partners","definition":"Number of partners actively engaged in the program.","formulas":["Active Partners = Partners with activity in trailing 12 months"],"benchmarks":null,"insight":"Size of the active partner ecosystem.","commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Portfolio","aliases":[],"rawMarkdown":"### Total Active Partners\n\n**Definition:** Number of partners actively engaged in the program.\n\n**Formula:**\n```\nActive Partners = Partners with activity in trailing 12 months\n```\n\n**Activity:** Deals registered, deals closed, certifications maintained or engagement threshold met.\n\nA partner's status moves to active when it meets one of these, so the count reads the partner status flag.\n\n**What it tells you:** Size of the active partner ecosystem.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Partner Tier Distribution","slug":"partner-tier-distribution","definition":"Breakdown of partners by program tier.","formulas":["Tier Distribution = Partners in tier / Total partners × 100"],"benchmarks":null,"insight":"Partner ecosystem maturity.","commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Portfolio","aliases":[],"rawMarkdown":"### Partner Tier Distribution\n\n**Definition:** Breakdown of partners by program tier.\n\n**Tiers (typical):**\n- Registered / Affiliate\n- Silver / Select\n- Gold / Premier\n- Platinum / Elite\n\nThe first name in each pair is the canonical `partner_tier` value.\n\n**Formula:**\n```\nTier Distribution = Partners in tier / Total partners × 100\n```\n\nPartner Tier Distribution is reported per tier: one share for each tier, with the shares summing to 100%.\n\n**What it tells you:** Partner ecosystem maturity.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Partner Activation Rate","slug":"partner-activation-rate","definition":"Percentage of recruited partners who become productive.","formulas":["Activation Rate = Partners recruited in period now active / Partners recruited in period × 100"],"benchmarks":"- Below 20%: Low activation\n- 20-40%: Average\n- 40-60%: Good\n- Above 60%: Strong enablement","insight":"Partner onboarding and enablement effectiveness.","commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Portfolio","aliases":[],"rawMarkdown":"### Partner Activation Rate\n\n**Definition:** Percentage of recruited partners who become productive.\n\n**Formula:**\n```\nActivation Rate = Partners recruited in period now active / Partners recruited in period × 100\n```\n\nA recruited partner becomes active once productive: a first deal registered or closed, or the engagement threshold met. Count activation at period end for the partners recruited in the period.\n\n**Benchmarks:**\n- Below 20%: Low activation\n- 20-40%: Average\n- 40-60%: Good\n- Above 60%: Strong enablement\n\n**What it tells you:** Partner onboarding and enablement effectiveness.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Partner Churn Rate","slug":"partner-churn-rate","definition":"Percentage of partners who leave or become inactive.","formulas":["Partner Churn = Partners churned in period / Active partners at start of period × 100"],"benchmarks":null,"insight":"Partner program health and competitiveness.","commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Portfolio","aliases":[],"rawMarkdown":"### Partner Churn Rate\n\n**Definition:** Percentage of partners who leave or become inactive.\n\n**Formula:**\n```\nPartner Churn = Partners churned in period / Active partners at start of period × 100\n```\n\nPartner Churn Rate is reported per partner tier.\n\n**What it tells you:** Partner program health and competitiveness.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Partner-Sourced Revenue","slug":"partner-sourced-revenue","definition":"Revenue from deals originated by partners.","formulas":["Partner-Sourced Revenue = Sum of closed revenue where partner = source"],"benchmarks":null,"insight":"Partner contribution to new business.","commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Revenue","aliases":[],"rawMarkdown":"### Partner-Sourced Revenue\n\n**Definition:** Revenue from deals originated by partners.\n\n**Formula:**\n```\nPartner-Sourced Revenue = Sum of closed revenue where partner = source\n```\n\n**What it tells you:** Partner contribution to new business.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Partner-Influenced Revenue","slug":"partner-influenced-revenue","definition":"Revenue from deals where partners were involved (but may not have originated).","formulas":["Partner-Influenced Revenue = Sum of closed revenue where partner = involved"],"benchmarks":null,"insight":"Total partner impact on revenue.","commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Revenue","aliases":[],"rawMarkdown":"### Partner-Influenced Revenue\n\n**Definition:** Revenue from deals where partners were involved (but may not have originated).\n\n**Formula:**\n```\nPartner-Influenced Revenue = Sum of closed revenue where partner = involved\n```\n\n**What it tells you:** Total partner impact on revenue.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Channel Revenue Percentage","slug":"channel-revenue-percentage","definition":"Partner-sourced revenue as a percentage of total recognised (GAAP) revenue.","formulas":["Channel % = Partner-sourced revenue / Total revenue × 100"],"benchmarks":"- Below 10%: Direct-dominant model\n- 10-30%: Developing channel\n- 30-50%: Balanced model\n- Above 50%: Channel-dominant model","insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Revenue","aliases":[],"rawMarkdown":"### Channel Revenue Percentage\n\n**Definition:** Partner-sourced revenue as a percentage of total recognised (GAAP) revenue.\n\n**Formula:**\n```\nChannel % = Partner-sourced revenue / Total revenue × 100\n```\n\n**Benchmarks:**\n- Below 10%: Direct-dominant model\n- 10-30%: Developing channel\n- 30-50%: Balanced model\n- Above 50%: Channel-dominant model\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Partner Revenue Growth","slug":"partner-revenue-growth","definition":"Year-over-year growth in partner-sourced revenue.","formulas":["Growth = (Partner revenue this year - Partner revenue last year) / Partner revenue last year × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Revenue","aliases":[],"rawMarkdown":"### Partner Revenue Growth\n\n**Definition:** Year-over-year growth in partner-sourced revenue.\n\n**Formula:**\n```\nGrowth = (Partner revenue this year - Partner revenue last year) / Partner revenue last year × 100\n```\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Average Partner Revenue","slug":"average-partner-revenue","definition":"Average revenue per active partner.","formulas":["Average Partner Revenue = Total partner revenue / Active partners"],"benchmarks":null,"insight":"Partner productivity.","commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Revenue","aliases":[],"rawMarkdown":"### Average Partner Revenue\n\n**Definition:** Average revenue per active partner.\n\n**Formula:**\n```\nAverage Partner Revenue = Total partner revenue / Active partners\n```\n\nTotal partner revenue is Partner-Influenced Revenue: closed revenue on every deal with a partner involved, partner-sourced deals included.\n\n**What it tells you:** Partner productivity.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Partner Deal Registration Volume","slug":"partner-deal-registration-volume","definition":"Number of deals registered by partners.","formulas":["Deal Registrations = Count of partner-registered deals in period"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Deal Flow","aliases":[],"rawMarkdown":"### Partner Deal Registration Volume\n\n**Definition:** Number of deals registered by partners.\n\n**Formula:**\n```\nDeal Registrations = Count of partner-registered deals in period\n```\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Deal Registration-to-Close Rate","slug":"deal-registration-to-close-rate","definition":"Percentage of registered deals that close.","formulas":["Registration-to-Close = Closed deals / Registered deals × 100"],"benchmarks":"- Below 20%: Low quality or poor follow-through\n- 20-35%: Average\n- Above 35%: Good","insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Deal Flow","aliases":[],"rawMarkdown":"### Deal Registration-to-Close Rate\n\n**Definition:** Percentage of registered deals that close.\n\n**Formula:**\n```\nRegistration-to-Close = Closed deals / Registered deals × 100\n```\n\n**Benchmarks:**\n- Below 20%: Low quality or poor follow-through\n- 20-35%: Average\n- Above 35%: Good\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Partner Win Rate","slug":"partner-win-rate","definition":"Win rate on partner-involved opportunities.","formulas":["Partner Win Rate = Partner deals won / (Partner deals won + Partner deals lost) × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Deal Flow","aliases":[],"rawMarkdown":"### Partner Win Rate\n\n**Definition:** Win rate on partner-involved opportunities.\n\n**Formula:**\n```\nPartner Win Rate = Partner deals won / (Partner deals won + Partner deals lost) × 100\n```\n\nCompare to direct win rate to assess partner effectiveness.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Partner Deal Size","slug":"partner-deal-size","definition":"Average deal size for partner-sourced deals.","formulas":["Partner Deal Size = Partner-sourced revenue / Partner deals closed"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Deal Flow","aliases":[],"rawMarkdown":"### Partner Deal Size\n\n**Definition:** Average deal size for partner-sourced deals.\n\n**Formula:**\n```\nPartner Deal Size = Partner-sourced revenue / Partner deals closed\n```\n\nCompare to direct deal size.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Partner Sales Cycle","slug":"partner-sales-cycle","definition":"Median sales cycle for registered partner deals that closed won in the period, from registration to close.","formulas":["Partner Sales Cycle = Median of (Close date - Registration date) for partner deals"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Deal Flow","aliases":[],"rawMarkdown":"### Partner Sales Cycle\n\n**Definition:** Median sales cycle for registered partner deals that closed won in the period, from registration to close.\n\n**Formula:**\n```\nPartner Sales Cycle = Median of (Close date - Registration date) for partner deals\n```\n\nCompare to direct sales cycle.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Partner Portal Engagement","slug":"partner-portal-engagement","definition":"Partner activity in partner portal/systems.","formulas":[],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Engagement","aliases":[],"rawMarkdown":"### Partner Portal Engagement\n\n**Definition:** Partner activity in partner portal/systems.\n\n**Metrics:**\n- Portal logins per partner\n- Content downloads\n- Training modules accessed\n- Deal registrations submitted\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Certification Rate","slug":"certification-rate","definition":"Percentage of partners with current certifications.","formulas":["Certification Rate = Certified partners / Active partners × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Engagement","aliases":[],"rawMarkdown":"### Certification Rate\n\n**Definition:** Percentage of partners with current certifications.\n\n**Formula:**\n```\nCertification Rate = Certified partners / Active partners × 100\n```\n\n**Target:** >80% for technical partners\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Training Completion","slug":"training-completion","definition":"Percentage of partners completing required training.","formulas":["Training Completion = Partners completing training / Partners enrolled × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Engagement","aliases":[],"rawMarkdown":"### Training Completion\n\n**Definition:** Percentage of partners completing required training.\n\n**Formula:**\n```\nTraining Completion = Partners completing training / Partners enrolled × 100\n```\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Joint Marketing Activities","slug":"joint-marketing-activities","definition":"Number of co-marketing activities with partners.","formulas":["Joint Activities = Count of co-marketing activities in period"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Engagement","aliases":[],"rawMarkdown":"### Joint Marketing Activities\n\n**Definition:** Number of co-marketing activities with partners.\n\n**Activities:** Webinars, events, content, campaigns.\n\n**Formula:**\n```\nJoint Activities = Count of co-marketing activities in period\n```\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Partner NPS","slug":"partner-nps","definition":"Net Promoter Score from partner satisfaction surveys.","formulas":["Partner NPS = % Promoters - % Detractors"],"benchmarks":null,"insight":"Partner satisfaction with the program.","commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Engagement","aliases":[],"rawMarkdown":"### Partner NPS\n\n**Definition:** Net Promoter Score from partner satisfaction surveys.\n\n**Formula:**\n```\nPartner NPS = % Promoters - % Detractors\n```\n\n**What it tells you:** Partner satisfaction with the program.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Partner Margin / Commission","slug":"partner-margin-commission","definition":"Compensation paid to partners.","formulas":["Partner Margin = Partner compensation / Partner-sourced revenue × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Economics","aliases":[],"rawMarkdown":"### Partner Margin / Commission\n\n**Definition:** Compensation paid to partners.\n\n**Formula:**\n```\nPartner Margin = Partner compensation / Partner-sourced revenue × 100\n```\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Cost of Partner Acquisition","slug":"cost-of-partner-acquisition","definition":"Cost to recruit and onboard a new partner.","formulas":["Cost of Partner Acquisition = Partner program costs / New partners recruited"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Economics","aliases":[],"rawMarkdown":"### Cost of Partner Acquisition\n\n**Definition:** Cost to recruit and onboard a new partner.\n\n**Formula:**\n```\nCost of Partner Acquisition = Partner program costs / New partners recruited\n```\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Partner Lifetime Value","slug":"partner-lifetime-value","definition":"Expected revenue from a partner over its lifetime.","formulas":["Partner LTV = Average annual partner revenue / Partner churn rate"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Economics","aliases":[],"rawMarkdown":"### Partner Lifetime Value\n\n**Definition:** Expected revenue from a partner over its lifetime.\n\n**Formula:**\n```\nPartner LTV = Average annual partner revenue / Partner churn rate\n```\n\nAverage annual partner revenue is Average Partner Revenue measured over a 12-month period.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Partner ROI","slug":"partner-roi","definition":"Return on investment in partner program.","formulas":["Partner ROI = (Partner-sourced revenue - Partner program costs) / Partner program costs × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Economics","aliases":[],"rawMarkdown":"### Partner ROI\n\n**Definition:** Return on investment in partner program.\n\n**Formula:**\n```\nPartner ROI = (Partner-sourced revenue - Partner program costs) / Partner program costs × 100\n```\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Resellers","slug":"resellers","definition":"","formulas":[],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Types","aliases":[],"rawMarkdown":"### Resellers\n\n- Focus: Revenue sourced, deal flow, margin\n- Key metric: Revenue per reseller","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Referral Partners","slug":"referral-partners","definition":"","formulas":[],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Types","aliases":[],"rawMarkdown":"### Referral Partners\n\n- Focus: Lead volume, conversion, referral fees\n- Key metric: Referrals per partner","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Technology Partners (Integrations)","slug":"technology-partners-integrations","definition":"","formulas":[],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Types","aliases":[],"rawMarkdown":"### Technology Partners (Integrations)\n\n- Focus: Integration usage, co-sell, marketplace\n- Key metric: Customers using integration","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"System Integrators (SIs)","slug":"system-integrators-sis","definition":"","formulas":[],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Types","aliases":[],"rawMarkdown":"### System Integrators (SIs)\n\n- Focus: Implementation capacity, project revenue, customer success\n- Key metric: Implementations delivered","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Managed Service Providers (MSPs)","slug":"managed-service-providers-msps","definition":"","formulas":[],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Partner Types","aliases":[],"rawMarkdown":"### Managed Service Providers (MSPs)\n\n- Focus: Managed seats, recurring revenue, retention\n- Key metric: Seats under management\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Marketplace Revenue","slug":"marketplace-revenue","definition":"Revenue transacted through marketplace (AWS, Azure, etc.).","formulas":["Marketplace Revenue = Sum of marketplace transactions"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Marketplace (if applicable)","aliases":[],"rawMarkdown":"### Marketplace Revenue\n\n**Definition:** Revenue transacted through marketplace (AWS, Azure, etc.).\n\n**Formula:**\n```\nMarketplace Revenue = Sum of marketplace transactions\n```\n\nMarketplace deals are closed-won opportunities whose `channel` is `marketplace`.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Marketplace as % of Revenue","slug":"marketplace-as-of-revenue","definition":"Marketplace contribution to total revenue.","formulas":["Marketplace % = Marketplace revenue / Total revenue × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Marketplace (if applicable)","aliases":[],"rawMarkdown":"### Marketplace as % of Revenue\n\n**Definition:** Marketplace contribution to total revenue.\n\n**Formula:**\n```\nMarketplace % = Marketplace revenue / Total revenue × 100\n```\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Marketplace Listings Performance","slug":"marketplace-listings-performance","definition":"Performance of product listings.","formulas":[],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Partnerships","category":"Marketplace (if applicable)","aliases":[],"rawMarkdown":"### Marketplace Listings Performance\n\n**Definition:** Performance of product listings.\n\n**Metrics:**\n- Listing views\n- Trial starts\n- Conversions\n- Reviews/ratings\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Total Headcount","slug":"total-headcount","definition":"Total number of active employees at the end of the period.","formulas":["Headcount = Total active employees at end of period"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"People","category":"Headcount Metrics","aliases":[],"rawMarkdown":"### Total Headcount\n\n**Definition:** Total number of active employees at the end of the period.\n\n**Formula:**\n```\nHeadcount = Total active employees at end of period\n```\n\nTotal Headcount is reported per department (the `by_department` breakdown). Share of headcount is each department's count over the total.\n\nInclude: Full-time, part-time employees\nExclude: Contractors (track separately)\n\n**Typical shares by department for SaaS:**\n| Department | % of Headcount |\n|------------|----------------|\n| Engineering | 25-35% |\n| Sales | 20-30% |\n| Customer Success/Support | 15-25% |\n| Marketing | 5-10% |\n| G&A (Finance, HR, Legal, Ops) | 10-15% |\n| Product | 5-10% |\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Headcount Growth Rate","slug":"headcount-growth-rate","definition":"Percentage change in headcount over a period.","formulas":["Growth Rate = (Headcount end - Headcount start) / Headcount start × 100"],"benchmarks":null,"insight":"Organizational scaling velocity.","commonMistakes":null,"sources":[],"department":"People","category":"Headcount Metrics","aliases":[],"rawMarkdown":"### Headcount Growth Rate\n\n**Definition:** Percentage change in headcount over a period.\n\n**Formula:**\n```\nGrowth Rate = (Headcount end - Headcount start) / Headcount start × 100\n```\n\n**What it tells you:** Organizational scaling velocity.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Revenue per Employee","slug":"revenue-per-employee","definition":"Annual Recurring Revenue (ARR) divided by total headcount.","formulas":["Revenue per Employee = ARR / Total employees"],"benchmarks":"- Below $100K: Early stage or overstaffed\n- $100K-$200K: Growing\n- $200K-$300K: Efficient\n- Above $300K: Highly efficient","insight":"How much recurring revenue the company carries per person, a rough measure of overall productivity.","commonMistakes":null,"sources":[],"department":"People","category":"Headcount Metrics","aliases":[],"rawMarkdown":"### Revenue per Employee\n\nSee [Finance](finance.md#revenue-per-employee) for the canonical definition: ARR over total headcount.\n\n---","signalType":"outcome","signalTypeSecondary":"efficiency","dualLens":null,"dualLensNote":null},{"name":"Employee Turnover Rate","slug":"employee-turnover-rate","definition":"Percentage of employees who left in a period.","formulas":["Turnover Rate = Employees departed / Average headcount × 100"],"benchmarks":"- Below 10%: Excellent retention\n- 10-15%: Good\n- 13-20%: Average for tech (tech runs higher than other industries)\n- 20-25%: High for tech, investigate\n- Above 25%: Critical","insight":null,"commonMistakes":null,"sources":["BambooHR: Turnover Benchmarks 2025: https://www.bamboohr.com/resources/guides/turnover-benchmarks","Mercer: 2025 US Turnover Survey: https://www.imercer.com/articleinsights/workforce-turnover-trends"],"department":"People","category":"Retention Metrics","aliases":[],"rawMarkdown":"### Employee Turnover Rate\n\n**Definition:** Percentage of employees who left in a period.\n\n**Formula:**\n```\nTurnover Rate = Employees departed / Average headcount × 100\n```\n\nEmployee Turnover Rate is reported per department, with leavers and headcount counted within each department.\n\nCalculate monthly or annually. Annualize for comparability.\n\n**Benchmarks (Annual):**\n- Below 10%: Excellent retention\n- 10-15%: Good\n- 13-20%: Average for tech (tech runs higher than other industries)\n- 20-25%: High for tech, investigate\n- Above 25%: Critical\n\n**Context:** US voluntary turnover averaged 13.5% in 2025 (down from 17.3% in 2023). Tech sector runs 13-25% due to competitive demand for specialized skills. Average tech tenure is 2-3 years vs 4.1 years overall.\n\n**Sources:**\n- [BambooHR: Turnover Benchmarks 2025](https://www.bamboohr.com/resources/guides/turnover-benchmarks)\n- [Mercer: 2025 US Turnover Survey](https://www.imercer.com/articleinsights/workforce-turnover-trends)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Voluntary Turnover Rate","slug":"voluntary-turnover-rate","definition":"Turnover due to employee choice (resignations).","formulas":["Voluntary Turnover = Voluntary departures / Average headcount × 100"],"benchmarks":null,"insight":"Employee satisfaction and competitiveness of employment.","commonMistakes":null,"sources":[],"department":"People","category":"Retention Metrics","aliases":[],"rawMarkdown":"### Voluntary Turnover Rate\n\n**Definition:** Turnover due to employee choice (resignations).\n\n**Formula:**\n```\nVoluntary Turnover = Voluntary departures / Average headcount × 100\n```\n\nVoluntary Turnover Rate is reported per department.\n\n**What it tells you:** Employee satisfaction and competitiveness of employment.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Involuntary Turnover Rate","slug":"involuntary-turnover-rate","definition":"Turnover due to company decision (terminations, layoffs).","formulas":["Involuntary Turnover = Involuntary departures / Average headcount × 100"],"benchmarks":null,"insight":"Hiring quality and performance management.","commonMistakes":null,"sources":[],"department":"People","category":"Retention Metrics","aliases":[],"rawMarkdown":"### Involuntary Turnover Rate\n\n**Definition:** Turnover due to company decision (terminations, layoffs).\n\n**Formula:**\n```\nInvoluntary Turnover = Involuntary departures / Average headcount × 100\n```\n\n**What it tells you:** Hiring quality and performance management.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Regrettable Turnover","slug":"regrettable-turnover","definition":"Voluntary departures of high performers, as a share of the high performers employed at the start of the period.","formulas":["Regrettable Turnover = High performer departures / Total high performers × 100"],"benchmarks":null,"insight":"Whether you are losing your best people.","commonMistakes":null,"sources":[],"department":"People","category":"Retention Metrics","aliases":[],"rawMarkdown":"### Regrettable Turnover\n\n**Definition:** Voluntary departures of high performers, as a share of the high performers employed at the start of the period.\n\n**Formula:**\n```\nRegrettable Turnover = High performer departures / Total high performers × 100\n```\n\n**Target:** <5%\n\n**What it tells you:** Whether you are losing your best people.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Average Tenure","slug":"average-tenure","definition":"Average length of employment.","formulas":["Average Tenure = Sum of employee tenure / Total employees"],"benchmarks":null,"insight":"Workforce stability and institutional knowledge.","commonMistakes":null,"sources":[],"department":"People","category":"Retention Metrics","aliases":[],"rawMarkdown":"### Average Tenure\n\n**Definition:** Average length of employment.\n\n**Formula:**\n```\nAverage Tenure = Sum of employee tenure / Total employees\n```\n\nAveraged over active employees at period end and reported in months.\n\n**What it tells you:** Workforce stability and institutional knowledge.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"90-Day Turnover","slug":"90-day-turnover","definition":"Percentage of new hires who leave within 90 days.","formulas":["90-Day Turnover = Departures within 90 days / New hires × 100"],"benchmarks":"- Below 5%: Good onboarding and hiring\n- 5-10%: Average\n- Above 10%: Hiring or onboarding issues","insight":"Hiring quality and onboarding effectiveness.","commonMistakes":null,"sources":[],"department":"People","category":"Retention Metrics","aliases":[],"rawMarkdown":"### 90-Day Turnover\n\n**Definition:** Percentage of new hires who leave within 90 days.\n\n**Formula:**\n```\n90-Day Turnover = Departures within 90 days / New hires × 100\n```\n\n90-Day Turnover is reported per hiring source.\n\n**Benchmarks:**\n- Below 5%: Good onboarding and hiring\n- 5-10%: Average\n- Above 10%: Hiring or onboarding issues\n\n**What it tells you:** Hiring quality and onboarding effectiveness.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Employee Net Promoter Score (eNPS)","slug":"employee-net-promoter-score-enps","definition":"Likelihood of employees recommending the company as a place to work.","formulas":["eNPS = % Promoters (9-10) - % Detractors (0-6)"],"benchmarks":"- Below 0: Poor engagement (investigate immediately)\n- 0-10: Below average\n- 10-30: Average (overall benchmark ~12-27)\n- 30-50: Good, leading companies\n- Above 50: Excellent","insight":"Employee satisfaction and advocacy.","commonMistakes":null,"sources":["AIHR: Employee Net Promoter Score Guide: https://www.aihr.com/blog/employee-net-promoter-score-enps/","Perceptyx: eNPS Guide: https://blog.perceptyx.com/employee-net-promoter-score"],"department":"People","category":"Engagement Metrics","aliases":[],"rawMarkdown":"### Employee Net Promoter Score (eNPS)\n\n**Definition:** Likelihood of employees recommending the company as a place to work.\n\n**Formula:**\n```\neNPS = % Promoters (9-10) - % Detractors (0-6)\n```\n\nBased on: \"How likely are you to recommend [company] as a place to work?\" (0-10)\n\n**Benchmarks:**\n- Below 0: Poor engagement (investigate immediately)\n- 0-10: Below average\n- 10-30: Average (overall benchmark ~12-27)\n- 30-50: Good, leading companies\n- Above 50: Excellent\n\n**Tech industry:** Average eNPS is 26, but top tech companies score 50-75+.\n\n**Company size effect:** Smaller companies (0-250) average 30; larger companies (5000+) average 9.\n\n**What it tells you:** Employee satisfaction and advocacy.\n\n**Sources:**\n- [AIHR: Employee Net Promoter Score Guide](https://www.aihr.com/blog/employee-net-promoter-score-enps/)\n- [Perceptyx: eNPS Guide](https://blog.perceptyx.com/employee-net-promoter-score)\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Engagement Score","slug":"engagement-score","definition":"Composite score from engagement survey.","formulas":[],"benchmarks":"- Below 60%: Low engagement\n- 60-70%: Average\n- 70-80%: Good\n- Above 80%: High engagement","insight":null,"commonMistakes":null,"sources":[],"department":"People","category":"Engagement Metrics","aliases":[],"rawMarkdown":"### Engagement Score\n\n**Definition:** Composite score from engagement survey.\n\n**Measurement:** Usually an annual or quarterly survey covering:\n- Job satisfaction\n- Manager relationship\n- Growth opportunities\n- Company direction\n- Work-life balance\n\nThe canonical value is the average composite score across employee survey responses in the period.\n\n**Benchmarks:**\n- Below 60%: Low engagement\n- 60-70%: Average\n- 70-80%: Good\n- Above 80%: High engagement\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Survey Participation Rate","slug":"survey-participation-rate","definition":"Percentage of employees completing engagement surveys.","formulas":["Participation Rate = Surveys completed / Surveys sent × 100"],"benchmarks":null,"insight":"Trust in feedback process and engagement with company.","commonMistakes":null,"sources":[],"department":"People","category":"Engagement Metrics","aliases":[],"rawMarkdown":"### Survey Participation Rate\n\n**Definition:** Percentage of employees completing engagement surveys.\n\n**Formula:**\n```\nParticipation Rate = Surveys completed / Surveys sent × 100\n```\n\n**Target:** >80%\n\n**What it tells you:** Trust in feedback process and engagement with company.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Open Positions","slug":"open-positions","definition":"Number of open requisitions (unfilled roles) at the end of the period.","formulas":[],"benchmarks":null,"insight":"Hiring backlog and growth plans.","commonMistakes":null,"sources":[],"department":"People","category":"Recruiting Metrics","aliases":[],"rawMarkdown":"### Open Positions\n\n**Definition:** Number of open requisitions (unfilled roles) at the end of the period.\n\n**What it tells you:** Hiring backlog and growth plans.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Time to Fill","slug":"time-to-fill","definition":"Days from a requisition opening to it being filled with an accepted offer, for requisitions filled in the period.","formulas":["Time to Fill = Average of (Offer accepted date - Job posted date)"],"benchmarks":"- Below 30 days: Fast\n- 30-45 days: Good\n- 45-60 days: Average\n- Above 60 days: Slow, may impact growth","insight":null,"commonMistakes":null,"sources":[],"department":"People","category":"Recruiting Metrics","aliases":[],"rawMarkdown":"### Time to Fill\n\n**Definition:** Days from a requisition opening to it being filled with an accepted offer, for requisitions filled in the period.\n\n**Formula:**\n```\nTime to Fill = Average of (Offer accepted date - Job posted date)\n```\n\n**Benchmarks:**\n- Below 30 days: Fast\n- 30-45 days: Good\n- 45-60 days: Average\n- Above 60 days: Slow, may impact growth\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Time to Hire","slug":"time-to-hire","definition":"Days from the hired employee's application to their start date, for employees hired in the period.","formulas":["Time to Hire = Average of (Start date - Application date)"],"benchmarks":null,"insight":"Candidate experience and process efficiency.","commonMistakes":null,"sources":[],"department":"People","category":"Recruiting Metrics","aliases":[],"rawMarkdown":"### Time to Hire\n\n**Definition:** Days from the hired employee's application to their start date, for employees hired in the period.\n\n**Formula:**\n```\nTime to Hire = Average of (Start date - Application date)\n```\n\n**What it tells you:** Candidate experience and process efficiency.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Offer Acceptance Rate","slug":"offer-acceptance-rate","definition":"Percentage of offers accepted.","formulas":["Acceptance Rate = Offers accepted / Offers extended × 100"],"benchmarks":"- Below 70%: Low, may indicate compensation or culture issues\n- 70-85%: Average\n- Above 85%: Strong employer brand","insight":null,"commonMistakes":null,"sources":[],"department":"People","category":"Recruiting Metrics","aliases":[],"rawMarkdown":"### Offer Acceptance Rate\n\n**Definition:** Percentage of offers accepted.\n\n**Formula:**\n```\nAcceptance Rate = Offers accepted / Offers extended × 100\n```\n\n**Benchmarks:**\n- Below 70%: Low, may indicate compensation or culture issues\n- 70-85%: Average\n- Above 85%: Strong employer brand\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Quality of Hire","slug":"quality-of-hire","definition":"Performance rating of new hires after defined period.","formulas":["Quality of Hire = Average performance rating of hires at 6-12 months"],"benchmarks":null,"insight":"Recruiting effectiveness at finding good candidates.","commonMistakes":null,"sources":[],"department":"People","category":"Recruiting Metrics","aliases":[],"rawMarkdown":"### Quality of Hire\n\n**Definition:** Performance rating of new hires after defined period.\n\n**Formula:**\n```\nQuality of Hire = Average performance rating of hires at 6-12 months\n```\n\nSome teams report the share of new hires meeting or exceeding expectations instead. That version needs a rating threshold, which each team sets.\n\n**What it tells you:** Recruiting effectiveness at finding good candidates.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Cost per Hire","slug":"cost-per-hire","definition":"Total recruiting cost divided by hires made.","formulas":["Cost per Hire = (Internal recruiting costs + External recruiting costs) / Total hires"],"benchmarks":"- IC roles: $3,000-$7,000\n- Technical roles: $7,000-$15,000\n- Executive roles: $20,000-$50,000+","insight":null,"commonMistakes":null,"sources":[],"department":"People","category":"Recruiting Metrics","aliases":[],"rawMarkdown":"### Cost per Hire\n\n**Definition:** Total recruiting cost divided by hires made.\n\n**Formula:**\n```\nCost per Hire = (Internal recruiting costs + External recruiting costs) / Total hires\n```\n\n**Benchmarks:**\n- IC roles: $3,000-$7,000\n- Technical roles: $7,000-$15,000\n- Executive roles: $20,000-$50,000+\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Source of Hire","slug":"source-of-hire","definition":"Where successful candidates came from.","formulas":["Source share = Hires in period from the source / Total hires in period"],"benchmarks":null,"insight":"Most effective recruiting channels.","commonMistakes":null,"sources":[],"department":"People","category":"Recruiting Metrics","aliases":[],"rawMarkdown":"### Source of Hire\n\n**Definition:** Where successful candidates came from.\n\n**Formula:**\n```\nSource share = Hires in period from the source / Total hires in period\n```\n\n**Channels:**\n- Employee referrals\n- Inbound applications (job boards and career page)\n- Direct sourcing (LinkedIn and similar)\n- Agencies\n- Internal transfers\n- Campus hiring\n\nSource of Hire is reported per source: one share for each source, with the shares summing to 100%.\n\n**What it tells you:** Most effective recruiting channels.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Compa-Ratio","slug":"compa-ratio","definition":"Employee salary relative to market midpoint.","formulas":["Compa-Ratio = Actual salary / Market midpoint × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"People","category":"Compensation Metrics","aliases":[],"rawMarkdown":"### Compa-Ratio\n\n**Definition:** Employee salary relative to market midpoint.\n\n**Formula:**\n```\nCompa-Ratio = Actual salary / Market midpoint × 100\n```\n\n**Interpretation:**\n- Below 90%: Below market\n- 90-110%: At market\n- Above 110%: Above market\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Pay Equity Ratio","slug":"pay-equity-ratio","definition":"Pay comparison across demographic groups for same role.","formulas":["Pay Equity = Average pay (Group A) / Average pay (Group B)"],"benchmarks":null,"insight":"Fairness in compensation practices.","commonMistakes":null,"sources":[],"department":"People","category":"Compensation Metrics","aliases":[],"rawMarkdown":"### Pay Equity Ratio\n\n**Definition:** Pay comparison across demographic groups for same role.\n\n**Formula:**\n```\nPay Equity = Average pay (Group A) / Average pay (Group B)\n```\n\nGASP compares employees from underrepresented groups (Group A) with everyone else (Group B), within the same role.\n\n**Target:** 0.98-1.02 (within 2%)\n\n**What it tells you:** Fairness in compensation practices.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Diversity Representation","slug":"diversity-representation","definition":"Percentage of workforce from underrepresented groups.","formulas":[],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"People","category":"Diversity Metrics","aliases":[],"rawMarkdown":"### Diversity Representation\n\n**Definition:** Percentage of workforce from underrepresented groups.\n\n**Dimensions:**\n- Gender\n- Race/ethnicity\n- Age\n- Disability status\n- Veteran status\n\nTrack overall and by department/level.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Diversity in Leadership","slug":"diversity-in-leadership","definition":"Representation at manager+ levels.","formulas":["Leadership Diversity = URG in leadership / Total leadership × 100"],"benchmarks":null,"insight":"Pipeline to leadership for underrepresented groups.","commonMistakes":null,"sources":[],"department":"People","category":"Diversity Metrics","aliases":[],"rawMarkdown":"### Diversity in Leadership\n\n**Definition:** Representation at manager+ levels.\n\n**Formula:**\n```\nLeadership Diversity = URG in leadership / Total leadership × 100\n```\n\n**What it tells you:** Pipeline to leadership for underrepresented groups.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Diversity Hiring Rate","slug":"diversity-hiring-rate","definition":"Percentage of new hires from underrepresented groups.","formulas":["Diversity Hiring = URG hires / Total hires × 100"],"benchmarks":null,"insight":"Progress on diversifying the workforce.","commonMistakes":null,"sources":[],"department":"People","category":"Diversity Metrics","aliases":[],"rawMarkdown":"### Diversity Hiring Rate\n\n**Definition:** Percentage of new hires from underrepresented groups.\n\n**Formula:**\n```\nDiversity Hiring = URG hires / Total hires × 100\n```\n\n**What it tells you:** Progress on diversifying the workforce.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Daily Active Users (DAU)","slug":"daily-active-users-dau","definition":"Unique users who performed a meaningful action in the product on a given day.","formulas":["DAU = Count of unique users with qualifying activity in 24-hour period"],"benchmarks":null,"insight":"Daily engagement level.","commonMistakes":null,"sources":[],"department":"Product","category":"Usage Metrics","aliases":["DAU"],"rawMarkdown":"### Daily Active Users (DAU)\n\n**Definition:** Unique users who performed a meaningful action in the product on a given day.\n\n**Formula:**\n```\nDAU = Count of unique users with qualifying activity in 24-hour period\n```\n\n**Qualifying activity:** A core action, defined per product, that the user chose to take. Logging in on its own does not qualify.\n\n**What it tells you:** Daily engagement level.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Weekly Active Users (WAU)","slug":"weekly-active-users-wau","definition":"Unique users who performed a meaningful action in the product within a 7-day period.","formulas":["WAU = Count of unique users with qualifying activity in 7-day period"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Product","category":"Usage Metrics","aliases":["WAU"],"rawMarkdown":"### Weekly Active Users (WAU)\n\n**Definition:** Unique users who performed a meaningful action in the product within a 7-day period.\n\n**Formula:**\n```\nWAU = Count of unique users with qualifying activity in 7-day period\n```\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Monthly Active Users (MAU)","slug":"monthly-active-users-mau","definition":"Unique users who performed a meaningful action in the product within a 30-day period.","formulas":["MAU = Count of unique users with qualifying activity in 30-day period"],"benchmarks":null,"insight":"Monthly engagement breadth.","commonMistakes":null,"sources":[],"department":"Product","category":"Usage Metrics","aliases":["MAU"],"rawMarkdown":"### Monthly Active Users (MAU)\n\n**Definition:** Unique users who performed a meaningful action in the product within a 30-day period.\n\n**Formula:**\n```\nMAU = Count of unique users with qualifying activity in 30-day period\n```\n\n**What it tells you:** Monthly engagement breadth.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"DAU/MAU Ratio (Stickiness)","slug":"daumau-ratio-stickiness","definition":"The ratio of daily to monthly active users, indicating how often users return.","formulas":["Stickiness = DAU / MAU × 100"],"benchmarks":"- Below 10%: Low stickiness, investigate product-market fit\n- 10-13%: Average for B2B SaaS (Mixpanel data: 13% median)\n- 13-20%: Good for B2B SaaS\n- 20-25%: Strong engagement\n- 25%+: Exceptional (top-quartile products)\n- 50%+: World-class (communication/collaboration tools like Slack)","insight":"How habit-forming the product is. Higher = users come back more frequently.","commonMistakes":null,"sources":["Mixpanel: Product Benchmarks 2024: https://mixpanel.com/blog/product-benchmarks/","Gainsight: DAU/MAU Guide: https://www.gainsight.com/essential-guide/product-management-metrics/dau-mau/"],"department":"Product","category":"Usage Metrics","aliases":[],"rawMarkdown":"### DAU/MAU Ratio (Stickiness)\n\n**Definition:** The ratio of daily to monthly active users, indicating how often users return.\n\n**Formula:**\n```\nStickiness = DAU / MAU × 100\n```\n\n**Benchmarks:**\n- Below 10%: Low stickiness, investigate product-market fit\n- 10-13%: Average for B2B SaaS (Mixpanel data: 13% median)\n- 13-20%: Good for B2B SaaS\n- 20-25%: Strong engagement\n- 25%+: Exceptional (top-quartile products)\n- 50%+: World-class (communication/collaboration tools like Slack)\n\n**Important context:** DAU/MAU is misleading for products not designed for daily use (accounting tools, signature apps, seasonal products). For B2B tools used weekly, WAU/MAU is more appropriate.\n\n**What it tells you:** How habit-forming the product is. Higher = users come back more frequently.\n\n**Sources:**\n- [Mixpanel: Product Benchmarks 2024](https://mixpanel.com/blog/product-benchmarks/)\n- [Gainsight: DAU/MAU Guide](https://www.gainsight.com/essential-guide/product-management-metrics/dau-mau/)\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"WAU/MAU Ratio","slug":"waumau-ratio","definition":"Weekly to monthly active user ratio.","formulas":["WAU/MAU = WAU / MAU × 100"],"benchmarks":"- Below 40%: Infrequent use\n- 40-60%: Moderate use\n- Above 60%: Regular weekly use","insight":null,"commonMistakes":null,"sources":[],"department":"Product","category":"Usage Metrics","aliases":[],"rawMarkdown":"### WAU/MAU Ratio\n\n**Definition:** Weekly to monthly active user ratio.\n\n**Formula:**\n```\nWAU/MAU = WAU / MAU × 100\n```\n\n**Benchmarks:**\n- Below 40%: Infrequent use\n- 40-60%: Moderate use\n- Above 60%: Regular weekly use\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Active Accounts","slug":"active-accounts","definition":"Customer accounts with at least one active user in the period.","formulas":["Active Accounts = Count of accounts with ≥1 active user in period"],"benchmarks":null,"insight":"Account-level engagement (vs user-level).","commonMistakes":null,"sources":[],"department":"Product","category":"Usage Metrics","aliases":[],"rawMarkdown":"### Active Accounts\n\n**Definition:** Customer accounts with at least one active user in the period.\n\n**Formula:**\n```\nActive Accounts = Count of accounts with ≥1 active user in period\n```\n\n**What it tells you:** Account-level engagement (vs user-level).\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Activation Rate","slug":"activation-rate","definition":"Percentage of users who signed up in the period that reached the activation milestone.","formulas":["Activation Rate = Users reaching activation / New users × 100"],"benchmarks":"- Below 20%: Low activation, onboarding issue\n- 20-40%: Average\n- 40-60%: Good\n- Above 60%: Strong activation","insight":"Whether new users reach the product's core value, the first step to keeping them.","commonMistakes":null,"sources":[],"department":"Product","category":"Usage Metrics","aliases":[],"rawMarkdown":"### Activation Rate\n\n**Definition:** Percentage of users who signed up in the period that reached the activation milestone.\n\n**Formula:**\n```\nActivation Rate = Users reaching activation / New users × 100\n```\n\n**Activation milestone:** Product-specific moment when user has experienced core value. Define explicitly.\n\n**Benchmarks:**\n- Below 20%: Low activation, onboarding issue\n- 20-40%: Average\n- 40-60%: Good\n- Above 60%: Strong activation\n\n**What it tells you:** Whether new users reach the product's core value, the first step to keeping them.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Trial-to-Paid Conversion Rate","slug":"trial-to-paid-conversion-rate","definition":"The percentage of trials that ended in the period and became paying customers.","formulas":["Trial-to-Paid Conversion Rate = Trials converted / Trials ended (converted + expired + cancelled) × 100"],"benchmarks":"- Opt-in free trial (no card): 10-25% (per OpenView / Lenny's PLG benchmarks)\n- Opt-out trial (card required): 40-60%\n- Freemium to paid: 2-5%","insight":"Whether the product sells itself once someone tries it. It is the first conversion metric of a product-led motion. Read it with [Activation Rate](#activation-rate), since trials that never activate rarely convert.","commonMistakes":null,"sources":[],"department":"Product","category":"Usage Metrics","aliases":[],"rawMarkdown":"### Trial-to-Paid Conversion Rate\n\n**Definition:** The percentage of trials that ended in the period and became paying customers.\n\n**Formula:**\n```\nTrial-to-Paid Conversion Rate = Trials converted / Trials ended (converted + expired + cancelled) × 100\n```\n\n**Also known as:** Free-to-Paid Conversion Rate, Trial Conversion Rate\n\n**Cohort:** Trials are counted by the date they ended, not started, so every trial in the denominator has an outcome. A trial that converts before its end date ends on the day it converts. Counting by start date understates recent periods while trials are still running; report it as a variant and say so.\n\n**Scope:** Time-boxed free trials and freemium accounts that upgrade. A proof of concept run by sales is an opportunity stage, not a trial.\n\n**Benchmarks:**\n- Opt-in free trial (no card): 10-25% (per OpenView / Lenny's PLG benchmarks)\n- Opt-out trial (card required): 40-60%\n- Freemium to paid: 2-5%\n\n**What it tells you:** Whether the product sells itself once someone tries it. It is the first conversion metric of a product-led motion. Read it with [Activation Rate](#activation-rate), since trials that never activate rarely convert.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Feature Adoption Rate","slug":"feature-adoption-rate","definition":"Percentage of active users who used a specific feature in the period.","formulas":["Feature Adoption = Users using feature / Total active users × 100"],"benchmarks":null,"insight":"Which features are being used, which are ignored.","commonMistakes":null,"sources":[],"department":"Product","category":"Adoption Metrics","aliases":[],"rawMarkdown":"### Feature Adoption Rate\n\n**Definition:** Percentage of active users who used a specific feature in the period.\n\n**Formula:**\n```\nFeature Adoption = Users using feature / Total active users × 100\n```\n\nTrack for each key feature.\n\n**What it tells you:** Which features are being used, which are ignored.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Core Feature Adoption","slug":"core-feature-adoption","definition":"Percentage of users using the core features that define the product.","formulas":["Core Feature Adoption = Users using all core features / Total active users × 100"],"benchmarks":"- Below 30%: Users not fully utilizing product\n- 30-50%: Moderate adoption\n- 50-70%: Good\n- Above 70%: Strong full-product adoption","insight":null,"commonMistakes":null,"sources":[],"department":"Product","category":"Adoption Metrics","aliases":[],"rawMarkdown":"### Core Feature Adoption\n\n**Definition:** Percentage of users using the core features that define the product.\n\n**Formula:**\n```\nCore Feature Adoption = Users using all core features / Total active users × 100\n```\n\nDefine 3-5 \"core\" features that represent full product usage.\n\n**Benchmarks:**\n- Below 30%: Users not fully utilizing product\n- 30-50%: Moderate adoption\n- 50-70%: Good\n- Above 70%: Strong full-product adoption\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Feature Depth","slug":"feature-depth","definition":"How intensively users engage with features: average feature actions per user who used a feature in the period.","formulas":["Feature Depth = Average feature actions per user per period"],"benchmarks":null,"insight":"How heavily people use the features they have adopted, which breadth measures miss.","commonMistakes":null,"sources":[],"department":"Product","category":"Adoption Metrics","aliases":[],"rawMarkdown":"### Feature Depth\n\n**Definition:** How intensively users engage with features: average feature actions per user who used a feature in the period.\n\n**Formula:**\n```\nFeature Depth = Average feature actions per user per period\n```\n\n**What it tells you:** How heavily people use the features they have adopted, which breadth measures miss.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Time to Feature Adoption","slug":"time-to-feature-adoption","definition":"Median time from signup to a user's first use of a specific feature, for users whose first use falls in the period.","formulas":["Time to Adoption = Median of (First feature use date - Signup date)"],"benchmarks":null,"insight":"Feature discovery and adoption speed.","commonMistakes":null,"sources":[],"department":"Product","category":"Adoption Metrics","aliases":[],"rawMarkdown":"### Time to Feature Adoption\n\n**Definition:** Median time from signup to a user's first use of a specific feature, for users whose first use falls in the period.\n\n**Formula:**\n```\nTime to Adoption = Median of (First feature use date - Signup date)\n```\n\n**What it tells you:** Feature discovery and adoption speed.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Breadth of Adoption","slug":"breadth-of-adoption","definition":"Average number of features used per account.","formulas":["Breadth = Distinct (account, feature) pairs used in period / Active accounts"],"benchmarks":null,"insight":"How much of the product each account uses.","commonMistakes":null,"sources":[],"department":"Product","category":"Adoption Metrics","aliases":[],"rawMarkdown":"### Breadth of Adoption\n\n**Definition:** Average number of features used per account.\n\n**Formula:**\n```\nBreadth = Distinct (account, feature) pairs used in period / Active accounts\n```\n\nEach account counts each feature it used once, so the result is the average number of distinct features per active account.\n\n**What it tells you:** How much of the product each account uses.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Session Frequency","slug":"session-frequency","definition":"Average number of sessions per user per period.","formulas":["Session Frequency = Total sessions / Active users"],"benchmarks":null,"insight":"How often users return.","commonMistakes":null,"sources":[],"department":"Product","category":"Engagement Metrics","aliases":[],"rawMarkdown":"### Session Frequency\n\n**Definition:** Average number of sessions per user per period.\n\n**Formula:**\n```\nSession Frequency = Total sessions / Active users\n```\n\n**What it tells you:** How often users return.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Session Duration","slug":"session-duration","definition":"Average time spent per session.","formulas":["Session Duration = Total session time / Total sessions"],"benchmarks":"Highly product-dependent. Track trend over time.","insight":"Depth of engagement per visit.","commonMistakes":null,"sources":[],"department":"Product","category":"Engagement Metrics","aliases":[],"rawMarkdown":"### Session Duration\n\n**Definition:** Average time spent per session.\n\n**Formula:**\n```\nSession Duration = Total session time / Total sessions\n```\n\n**Benchmarks:** Highly product-dependent. Track trend over time.\n\n**What it tells you:** Depth of engagement per visit.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Time in Product","slug":"time-in-product","definition":"Total time spent in product per user per period.","formulas":["Time in Product = Sum of session duration per user"],"benchmarks":null,"insight":"Overall engagement intensity.","commonMistakes":null,"sources":[],"department":"Product","category":"Engagement Metrics","aliases":[],"rawMarkdown":"### Time in Product\n\n**Definition:** Total time spent in product per user per period.\n\n**Formula:**\n```\nTime in Product = Sum of session duration per user\n```\n\n**What it tells you:** Overall engagement intensity.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Actions per Session","slug":"actions-per-session","definition":"Average number of meaningful actions per session.","formulas":["Actions per Session = Total actions / Total sessions"],"benchmarks":null,"insight":"Productivity per session.","commonMistakes":null,"sources":[],"department":"Product","category":"Engagement Metrics","aliases":[],"rawMarkdown":"### Actions per Session\n\n**Definition:** Average number of meaningful actions per session.\n\n**Formula:**\n```\nActions per Session = Total actions / Total sessions\n```\n\n**What it tells you:** Productivity per session.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Product Qualified Accounts (PQAs)","slug":"product-qualified-accounts-pqas","definition":"Accounts that have demonstrated product engagement indicating sales-readiness.","formulas":["PQA = Accounts meeting product engagement threshold"],"benchmarks":null,"insight":"Product-driven sales signals.","commonMistakes":null,"sources":[],"department":"Product","category":"Engagement Metrics","aliases":[],"rawMarkdown":"### Product Qualified Accounts (PQAs)\n\n**Definition:** Accounts that have demonstrated product engagement indicating sales-readiness.\n\n**Formula:**\n```\nPQA = Accounts meeting product engagement threshold\n```\n\n**Threshold criteria (examples):**\n- Used product X times\n- Activated Y features\n- Added Z users\n- Reached usage limit\n\n**What it tells you:** Product-driven sales signals.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"User Retention (Day N)","slug":"user-retention-day-n","definition":"Percentage of users who return on day N after signup.","formulas":["Day N Retention = Users active on day N / Users who signed up N days ago × 100"],"benchmarks":"- Below 20%: Poor\n- 20-40%: Average\n- Above 40%: Good","insight":null,"commonMistakes":null,"sources":[],"department":"Product","category":"Retention Metrics (Product)","aliases":[],"rawMarkdown":"### User Retention (Day N)\n\n**Definition:** Percentage of users who return on day N after signup.\n\n**Formula:**\n```\nDay N Retention = Users active on day N / Users who signed up N days ago × 100\n```\n\nCommon intervals: Day 1, Day 7, Day 14, Day 30. The canonical formula reports Day 30 for users who signed up in the period.\n\n**Benchmarks (Day 30 for B2B SaaS):**\n- Below 20%: Poor\n- 20-40%: Average\n- Above 40%: Good\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Cohort Retention","slug":"cohort-retention","definition":"Retention tracked by signup cohort over time. The canonical formula reports week 8 for the period's signup cohort.","formulas":["Cohort Retention (Week N) = Active users in week N / Users in cohort × 100"],"benchmarks":null,"insight":"How retention evolves and whether it is improving for newer cohorts.","commonMistakes":null,"sources":[],"department":"Product","category":"Retention Metrics (Product)","aliases":[],"rawMarkdown":"### Cohort Retention\n\n**Definition:** Retention tracked by signup cohort over time. The canonical formula reports week 8 for the period's signup cohort.\n\n**Formula:**\n```\nCohort Retention (Week N) = Active users in week N / Users in cohort × 100\n```\n\n**What it tells you:** How retention evolves and whether it is improving for newer cohorts.\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Resurrection Rate","slug":"resurrection-rate","definition":"Percentage of users dormant at period start who returned in the period.","formulas":["Resurrection Rate = Reactivated users / Dormant users × 100"],"benchmarks":null,"insight":"How many lapsed users you win back.","commonMistakes":null,"sources":[],"department":"Product","category":"Retention Metrics (Product)","aliases":[],"rawMarkdown":"### Resurrection Rate\n\n**Definition:** Percentage of users dormant at period start who returned in the period.\n\n**Formula:**\n```\nResurrection Rate = Reactivated users / Dormant users × 100\n```\n\n**What it tells you:** How many lapsed users you win back.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Release Frequency","slug":"release-frequency","definition":"How often new releases are shipped to customers.","formulas":["Release Frequency = Releases per period"],"benchmarks":null,"insight":"Product development velocity.","commonMistakes":null,"sources":[],"department":"Product","category":"Delivery Metrics","aliases":[],"rawMarkdown":"### Release Frequency\n\n**Definition:** How often new releases are shipped to customers.\n\n**Formula:**\n```\nRelease Frequency = Releases per period\n```\n\n**What it tells you:** Product development velocity.\n\n**Note:** Related to Engineering's Deployment Frequency, but measured at feature/product level vs code deployment level.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Feature Delivery Rate","slug":"feature-delivery-rate","definition":"Percentage of planned features delivered on schedule.","formulas":["Delivery Rate = Features shipped on time / Features planned × 100"],"benchmarks":null,"insight":"Roadmap predictability.","commonMistakes":null,"sources":[],"department":"Product","category":"Delivery Metrics","aliases":[],"rawMarkdown":"### Feature Delivery Rate\n\n**Definition:** Percentage of planned features delivered on schedule.\n\n**Formula:**\n```\nDelivery Rate = Features shipped on time / Features planned × 100\n```\n\n**What it tells you:** Roadmap predictability.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Roadmap Completion","slug":"roadmap-completion","definition":"Percentage of roadmap items completed in the period.","formulas":["Roadmap Completion = Roadmap items completed / Roadmap items planned × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Product","category":"Delivery Metrics","aliases":[],"rawMarkdown":"### Roadmap Completion\n\n**Definition:** Percentage of roadmap items completed in the period.\n\n**Formula:**\n```\nRoadmap Completion = Roadmap items completed / Roadmap items planned × 100\n```\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Time to Market","slug":"time-to-market","definition":"Time from feature concept to production release.","formulas":["Time to Market = Median of (Release date - Concept approval date)"],"benchmarks":null,"insight":"How quickly product can respond to market needs.","commonMistakes":null,"sources":[],"department":"Product","category":"Delivery Metrics","aliases":[],"rawMarkdown":"### Time to Market\n\n**Definition:** Time from feature concept to production release.\n\n**Formula:**\n```\nTime to Market = Median of (Release date - Concept approval date)\n```\n\n**What it tells you:** How quickly product can respond to market needs.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Error Rate (User-Facing)","slug":"error-rate-user-facing","definition":"Percentage of user actions that result in errors.","formulas":["Error Rate = Error events / Total user actions × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Product","category":"Quality Metrics (Product)","aliases":[],"rawMarkdown":"### Error Rate (User-Facing)\n\n**Definition:** Percentage of user actions that result in errors.\n\n**Formula:**\n```\nError Rate = Error events / Total user actions × 100\n```\n\n**Target:** <1%\n\n**Note:** Related to Engineering's Error Rate, but measured from user action perspective.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Bug Escape Rate","slug":"bug-escape-rate","definition":"Share of bugs found in production rather than caught in testing.","formulas":["Bug Escape Rate = Production bugs / (Production bugs + Bugs caught in QA) × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Product","category":"Quality Metrics (Product)","aliases":[],"rawMarkdown":"### Bug Escape Rate\n\n**Definition:** Share of bugs found in production rather than caught in testing.\n\n**Formula:**\n```\nBug Escape Rate = Production bugs / (Production bugs + Bugs caught in QA) × 100\n```\n\n**Target:** <10%\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"User-Reported Issues","slug":"user-reported-issues","definition":"Number of bugs/issues reported by users.","formulas":["User-Reported Issues = Count of user-submitted bug reports"],"benchmarks":null,"insight":"Quality as perceived by users.","commonMistakes":null,"sources":[],"department":"Product","category":"Quality Metrics (Product)","aliases":[],"rawMarkdown":"### User-Reported Issues\n\n**Definition:** Number of bugs/issues reported by users.\n\n**Formula:**\n```\nUser-Reported Issues = Count of user-submitted bug reports\n```\n\n**What it tells you:** Quality as perceived by users.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Feature Request Volume","slug":"feature-request-volume","definition":"Number of feature requests received.","formulas":["Feature Request Volume = Count of feature requests per period"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Product","category":"Quality Metrics (Product)","aliases":[],"rawMarkdown":"### Feature Request Volume\n\n**Definition:** Number of feature requests received.\n\n**Formula:**\n```\nFeature Request Volume = Count of feature requests per period\n```\n\nTrack by theme/category to identify patterns.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Services Revenue","slug":"services-revenue","definition":"Revenue from professional services (implementation, consulting, training).","formulas":["Services Revenue = Sum of recognized services revenue in period"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Services Revenue\n\n**Definition:** Revenue from professional services (implementation, consulting, training).\n\n**Formula:**\n```\nServices Revenue = Sum of recognized services revenue in period\n```\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Services as % of Total Revenue","slug":"services-as-of-total-revenue","definition":"Professional services contribution to total revenue.","formulas":["Services % = Services revenue / Total revenue × 100"],"benchmarks":"- Below 10%: Product-led, minimal services\n- 10-20%: Services-assisted product\n- 20-30%: Balanced model\n- Above 30%: Services-heavy (may impact valuation multiples)","insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Services as % of Total Revenue\n\n**Definition:** Professional services contribution to total revenue.\n\n**Formula:**\n```\nServices % = Services revenue / Total revenue × 100\n```\n\n**Benchmarks:**\n- Below 10%: Product-led, minimal services\n- 10-20%: Services-assisted product\n- 20-30%: Balanced model\n- Above 30%: Services-heavy (may impact valuation multiples)\n\n**Note:** Investors often discount a high services share, because services revenue grows with headcount rather than with product usage.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Services Attach Rate","slug":"services-attach-rate","definition":"Percentage of product deals that include services.","formulas":["Attach Rate = Deals with services / Total deals × 100"],"benchmarks":null,"insight":"How often services are sold with product.","commonMistakes":null,"sources":[],"department":"Professional Services","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Services Attach Rate\n\n**Definition:** Percentage of product deals that include services.\n\n**Formula:**\n```\nAttach Rate = Deals with services / Total deals × 100\n```\n\n**What it tells you:** How often services are sold with product.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Average Services Deal Size","slug":"average-services-deal-size","definition":"Average value of services engagements.","formulas":["Avg Services Deal = Total services bookings / Number of services engagements"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Average Services Deal Size\n\n**Definition:** Average value of services engagements.\n\n**Formula:**\n```\nAvg Services Deal = Total services bookings / Number of services engagements\n```\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Services Backlog","slug":"services-backlog","definition":"Contracted services not yet delivered.","formulas":["Backlog = Services booked - Services delivered (revenue recognized)"],"benchmarks":null,"insight":"Future services revenue and delivery workload.","commonMistakes":null,"sources":[],"department":"Professional Services","category":"Revenue Metrics","aliases":[],"rawMarkdown":"### Services Backlog\n\n**Definition:** Contracted services not yet delivered.\n\n**Formula:**\n```\nBacklog = Services booked - Services delivered (revenue recognized)\n```\n\n**What it tells you:** Future services revenue and delivery workload.\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Services Gross Margin","slug":"services-gross-margin","definition":"Services revenue minus direct delivery costs.","formulas":["Services Gross Margin = (Services revenue - Direct delivery cost) / Services revenue × 100"],"benchmarks":"- Below 20%: Unprofitable, review pricing\n- 20-30%: Low margin\n- 30-40%: Average\n- 40-50%: Good\n- Above 50%: Excellent","insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Profitability Metrics","aliases":[],"rawMarkdown":"### Services Gross Margin\n\n**Definition:** Services revenue minus direct delivery costs.\n\n**Formula:**\n```\nServices Gross Margin = (Services revenue - Direct delivery cost) / Services revenue × 100\n```\n\n**Direct costs:** Consultant salaries, travel, contractor costs.\n\n**Benchmarks:**\n- Below 20%: Unprofitable, review pricing\n- 20-30%: Low margin\n- 30-40%: Average\n- 40-50%: Good\n- Above 50%: Excellent\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Project Margin","slug":"project-margin","definition":"Gross margin on individual projects.","formulas":["Project Margin = (Project revenue - Project costs) / Project revenue × 100"],"benchmarks":null,"insight":"Profitability by engagement, including which ones lose money.","commonMistakes":null,"sources":[],"department":"Professional Services","category":"Profitability Metrics","aliases":[],"rawMarkdown":"### Project Margin\n\n**Definition:** Gross margin on individual projects.\n\n**Formula:**\n```\nProject Margin = (Project revenue - Project costs) / Project revenue × 100\n```\n\nMeasured on projects completed in the period.\n\n**What it tells you:** Profitability by engagement, including which ones lose money.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Realization Rate","slug":"realization-rate","definition":"Actual revenue realized vs potential revenue at standard rates.","formulas":["Realization Rate = Actual revenue / (Hours worked × Standard rate) × 100"],"benchmarks":"- Below 80%: Significant discounting or write-offs\n- 80-90%: Average\n- 90-100%: Good pricing discipline\n- Above 100%: Premium pricing achieved","insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Profitability Metrics","aliases":[],"rawMarkdown":"### Realization Rate\n\n**Definition:** Actual revenue realized vs potential revenue at standard rates.\n\n**Formula:**\n```\nRealization Rate = Actual revenue / (Hours worked × Standard rate) × 100\n```\n\nHours worked are taken from billed hours.\n\n**Benchmarks:**\n- Below 80%: Significant discounting or write-offs\n- 80-90%: Average\n- 90-100%: Good pricing discipline\n- Above 100%: Premium pricing achieved\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Write-off Rate","slug":"write-off-rate","definition":"Percentage of billable hours written off (not billed to client).","formulas":["Write-off Rate = Written-off hours / Total billable hours × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Profitability Metrics","aliases":[],"rawMarkdown":"### Write-off Rate\n\n**Definition:** Percentage of billable hours written off (not billed to client).\n\n**Formula:**\n```\nWrite-off Rate = Written-off hours / Total billable hours × 100\n```\n\n**Target:** <10%\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Billable Utilization","slug":"billable-utilization","definition":"Percentage of available time spent on billable work.","formulas":["Billable Utilization = Billable hours / Available hours × 100"],"benchmarks":"- Below 60%: Underutilized\n- 60-70%: Average\n- 70-80%: Good\n- Above 80%: Maxed out (burnout risk)","insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Utilization Metrics","aliases":[],"rawMarkdown":"### Billable Utilization\n\n**Definition:** Percentage of available time spent on billable work.\n\n**Formula:**\n```\nBillable Utilization = Billable hours / Available hours × 100\n```\n\n**Available hours:** Total work hours minus PTO, holidays, company meetings.\n\n**Benchmarks:**\n- Below 60%: Underutilized\n- 60-70%: Average\n- 70-80%: Good\n- Above 80%: Maxed out (burnout risk)\n\n**Target:** 70-75% sustainable.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Total Utilization","slug":"total-utilization","definition":"Percentage of time spent on all productive work (billable + non-billable).","formulas":["Total Utilization = (Billable + Non-billable productive hours) / Available hours × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Utilization Metrics","aliases":[],"rawMarkdown":"### Total Utilization\n\n**Definition:** Percentage of time spent on all productive work (billable + non-billable).\n\n**Formula:**\n```\nTotal Utilization = (Billable + Non-billable productive hours) / Available hours × 100\n```\n\n**Non-billable productive:** Training, pre-sales, internal projects.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Bench Rate","slug":"bench-rate","definition":"Percentage of team without billable assignment.","formulas":["Bench Rate = Consultants without assignment / Total consultants × 100"],"benchmarks":null,"insight":"Capacity available vs excess.","commonMistakes":null,"sources":[],"department":"Professional Services","category":"Utilization Metrics","aliases":[],"rawMarkdown":"### Bench Rate\n\n**Definition:** Percentage of team without billable assignment.\n\n**Formula:**\n```\nBench Rate = Consultants without assignment / Total consultants × 100\n```\n\n**Target:** <15%\n\n**What it tells you:** Capacity available vs excess.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Capacity","slug":"capacity","definition":"Total billable hours available in period.","formulas":["Capacity = Consultants × Available hours per consultant"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Utilization Metrics","aliases":[],"rawMarkdown":"### Capacity\n\n**Definition:** Total billable hours available in period.\n\n**Formula:**\n```\nCapacity = Consultants × Available hours per consultant\n```\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Capacity Utilization","slug":"capacity-utilization","definition":"Billable hours sold vs available. Hours booked are the budgeted hours on sold projects.","formulas":["Capacity Utilization = Hours booked / Capacity × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Utilization Metrics","aliases":[],"rawMarkdown":"### Capacity Utilization\n\n**Definition:** Billable hours sold vs available. Hours booked are the budgeted hours on sold projects.\n\n**Formula:**\n```\nCapacity Utilization = Hours booked / Capacity × 100\n```\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"On-Time Delivery","slug":"on-time-delivery","definition":"Percentage of projects delivered by committed date.","formulas":["On-Time Delivery = Projects on time / Total projects completed × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Delivery Metrics","aliases":[],"rawMarkdown":"### On-Time Delivery\n\n**Definition:** Percentage of projects delivered by committed date.\n\n**Formula:**\n```\nOn-Time Delivery = Projects on time / Total projects completed × 100\n```\n\n**Target:** >85%\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"On-Budget Delivery","slug":"on-budget-delivery","definition":"Percentage of projects completed in the period within their budgeted hours.","formulas":["On-Budget = Projects within budget / Total projects × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Delivery Metrics","aliases":[],"rawMarkdown":"### On-Budget Delivery\n\n**Definition:** Percentage of projects completed in the period within their budgeted hours.\n\n**Formula:**\n```\nOn-Budget = Projects within budget / Total projects × 100\n```\n\n**Target:** >80%\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Scope Change Rate","slug":"scope-change-rate","definition":"Percentage of projects with scope changes.","formulas":["Scope Change Rate = Projects with scope changes / Total projects × 100"],"benchmarks":null,"insight":"Scoping accuracy and change management.","commonMistakes":null,"sources":[],"department":"Professional Services","category":"Delivery Metrics","aliases":[],"rawMarkdown":"### Scope Change Rate\n\n**Definition:** Percentage of projects with scope changes.\n\n**Formula:**\n```\nScope Change Rate = Projects with scope changes / Total projects × 100\n```\n\n**What it tells you:** Scoping accuracy and change management.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Project Duration Accuracy","slug":"project-duration-accuracy","definition":"Actual duration vs estimated duration.","formulas":["Duration Accuracy = Average of (Estimated duration / Actual duration) per project × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Delivery Metrics","aliases":[],"rawMarkdown":"### Project Duration Accuracy\n\n**Definition:** Actual duration vs estimated duration.\n\n**Formula:**\n```\nDuration Accuracy = Average of (Estimated duration / Actual duration) per project × 100\n```\n\nCompute the ratio for each project completed in the period, then average, so every project carries equal weight.\n\n**Target:** 90-110%\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Project Milestone Completion Rate","slug":"project-milestone-completion-rate","definition":"Percentage of milestones completed on schedule.","formulas":["Project Milestone Completion Rate = Milestones on time / Total milestones × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Delivery Metrics","aliases":[],"rawMarkdown":"### Project Milestone Completion Rate\n\n**Definition:** Percentage of milestones completed on schedule.\n\n**Formula:**\n```\nProject Milestone Completion Rate = Milestones on time / Total milestones × 100\n```\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Project CSAT","slug":"project-csat","definition":"Customer satisfaction with services engagement.","formulas":["Project CSAT = Positive ratings / Total ratings × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Quality Metrics","aliases":[],"rawMarkdown":"### Project CSAT\n\n**Definition:** Customer satisfaction with services engagement.\n\n**Formula:**\n```\nProject CSAT = Positive ratings / Total ratings × 100\n```\n\nSurveyed at project completion.\n\n**Target:** >90%\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Project NPS","slug":"project-nps","definition":"Net Promoter Score for services experience.","formulas":["Project NPS = % Promoters - % Detractors"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Quality Metrics","aliases":[],"rawMarkdown":"### Project NPS\n\n**Definition:** Net Promoter Score for services experience.\n\n**Formula:**\n```\nProject NPS = % Promoters - % Detractors\n```\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Project Escalation Rate","slug":"project-escalation-rate","definition":"Percentage of projects with escalations.","formulas":["Project Escalation Rate = Projects with escalations / Total projects × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Quality Metrics","aliases":[],"rawMarkdown":"### Project Escalation Rate\n\n**Definition:** Percentage of projects with escalations.\n\n**Formula:**\n```\nProject Escalation Rate = Projects with escalations / Total projects × 100\n```\n\n**Target:** <10%\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Rework Rate","slug":"rework-rate","definition":"Percentage of deliverables requiring rework.","formulas":["Rework Rate = Deliverables reworked / Total deliverables × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Quality Metrics","aliases":[],"rawMarkdown":"### Rework Rate\n\n**Definition:** Percentage of deliverables requiring rework.\n\n**Formula:**\n```\nRework Rate = Deliverables reworked / Total deliverables × 100\n```\n\n**Target:** <5%\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Reference-ability","slug":"reference-ability","definition":"Percentage of completed projects that become referenceable.","formulas":["Reference-ability = Referenceable projects / Completed projects × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Quality Metrics","aliases":[],"rawMarkdown":"### Reference-ability\n\n**Definition:** Percentage of completed projects that become referenceable.\n\n**Formula:**\n```\nReference-ability = Referenceable projects / Completed projects × 100\n```\n\n**Target:** >70%\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Revenue per Consultant","slug":"revenue-per-consultant","definition":"Services revenue per delivery resource.","formulas":["Revenue per Consultant = Services revenue / Consultant headcount"],"benchmarks":"$150K-$300K annually, depending on rate structure. Use an annual period to compare against them.","insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Productivity Metrics","aliases":[],"rawMarkdown":"### Revenue per Consultant\n\n**Definition:** Services revenue per delivery resource.\n\n**Formula:**\n```\nRevenue per Consultant = Services revenue / Consultant headcount\n```\n\n**Benchmarks:** $150K-$300K annually, depending on rate structure. Use an annual period to compare against them.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Projects per Consultant","slug":"projects-per-consultant","definition":"Average projects completed per consultant in the period.","formulas":["Projects per Consultant = Completed projects / Consultant headcount"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Productivity Metrics","aliases":[],"rawMarkdown":"### Projects per Consultant\n\n**Definition:** Average projects completed per consultant in the period.\n\n**Formula:**\n```\nProjects per Consultant = Completed projects / Consultant headcount\n```\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Average Project Duration","slug":"average-project-duration","definition":"Average length, in days, of projects completed in the period.","formulas":["Avg Duration = Sum of project durations / Number of projects"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Productivity Metrics","aliases":[],"rawMarkdown":"### Average Project Duration\n\n**Definition:** Average length, in days, of projects completed in the period.\n\n**Formula:**\n```\nAvg Duration = Sum of project durations / Number of projects\n```\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Services Pipeline","slug":"services-pipeline","definition":"Value of services opportunities in pipeline.","formulas":["Services Pipeline = Sum of services opportunity values"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Pipeline Metrics","aliases":[],"rawMarkdown":"### Services Pipeline\n\n**Definition:** Value of services opportunities in pipeline.\n\n**Formula:**\n```\nServices Pipeline = Sum of services opportunity values\n```\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Services Win Rate","slug":"services-win-rate","definition":"Percentage of services opportunities won.","formulas":["Services Win Rate = Services deals won / (Won + Lost) × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Professional Services","category":"Pipeline Metrics","aliases":[],"rawMarkdown":"### Services Win Rate\n\n**Definition:** Percentage of services opportunities won.\n\n**Formula:**\n```\nServices Win Rate = Services deals won / (Won + Lost) × 100\n```\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Time to Start","slug":"time-to-start","definition":"Time from services sold to project kickoff.","formulas":["Time to Start = Median of (Kickoff date - Close date)"],"benchmarks":null,"insight":"Resource availability and scheduling efficiency.","commonMistakes":null,"sources":[],"department":"Professional Services","category":"Pipeline Metrics","aliases":[],"rawMarkdown":"### Time to Start\n\n**Definition:** Time from services sold to project kickoff.\n\n**Formula:**\n```\nTime to Start = Median of (Kickoff date - Close date)\n```\n\n**What it tells you:** Resource availability and scheduling efficiency.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Pipeline Hygiene Score","slug":"pipeline-hygiene-score","definition":"Quality assessment of pipeline data and process adherence across open opportunities.","formulas":["Hygiene Score = (Complete opps + Updated opps + Valid dates + Accurate stages) / 4"],"benchmarks":null,"insight":"How far you can trust the pipeline data your forecast is built on.","commonMistakes":null,"sources":[],"department":"RevOps","category":"Pipeline Operations","aliases":[],"rawMarkdown":"### Pipeline Hygiene Score\n\n**Definition:** Quality assessment of pipeline data and process adherence across open opportunities.\n\n**Components:**\n- Opportunities with required fields complete\n- Opportunities updated within SLA\n- Opportunities with valid close dates\n- Opportunities with accurate stage assignment\n\n**Formula:**\n```\nHygiene Score = (Complete opps + Updated opps + Valid dates + Accurate stages) / 4\n```\n\nEach component scored as percentage meeting criteria.\n\n**Target:** >90%\n\n**What it tells you:** How far you can trust the pipeline data your forecast is built on.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Forecast Accuracy","slug":"forecast-accuracy","definition":"How closely forecasted revenue matched actual revenue.","formulas":["Forecast Accuracy = 1 - |Forecasted - Actual| / Actual"],"benchmarks":"- Below 70%: Poor forecasting\n- 70-85%: Average\n- 85-95%: Good\n- Above 95%: Excellent","insight":"How predictable revenue is, which sets how much weight plans can put on the forecast.","commonMistakes":null,"sources":[],"department":"RevOps","category":"Pipeline Operations","aliases":[],"rawMarkdown":"### Forecast Accuracy\n\n**Definition:** How closely forecasted revenue matched actual revenue.\n\n**Formula:**\n```\nForecast Accuracy = 1 - |Forecasted - Actual| / Actual\n```\n\n**Benchmarks:**\n- Below 70%: Poor forecasting\n- 70-85%: Average\n- 85-95%: Good\n- Above 95%: Excellent\n\n**What it tells you:** How predictable revenue is, which sets how much weight plans can put on the forecast.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Commit Accuracy","slug":"commit-accuracy","definition":"Percentage of committed deals that close.","formulas":["Commit Accuracy = Deals closed from commit / Deals in commit × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"RevOps","category":"Pipeline Operations","aliases":[],"rawMarkdown":"### Commit Accuracy\n\n**Definition:** Percentage of committed deals that close.\n\n**Formula:**\n```\nCommit Accuracy = Deals closed from commit / Deals in commit × 100\n```\n\n**Target:** >80%\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Stage Conversion Rates","slug":"stage-conversion-rates","definition":"Conversion rate between each pipeline stage.","formulas":["Stage Conversion = Opportunities advancing to next stage / Opportunities in stage × 100"],"benchmarks":null,"insight":"Where deals get stuck or leak.","commonMistakes":null,"sources":[],"department":"RevOps","category":"Pipeline Operations","aliases":[],"rawMarkdown":"### Stage Conversion Rates\n\n**Definition:** Conversion rate between each pipeline stage.\n\n**Formula:**\n```\nStage Conversion = Opportunities advancing to next stage / Opportunities in stage × 100\n```\n\nTrack for each stage transition.\n\n**What it tells you:** Where deals get stuck or leak.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Quote Volume","slug":"quote-volume","definition":"Number of quotes sent in a period.","formulas":["Quote Volume = Count of quotes created"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"RevOps","category":"Quote-to-Order","aliases":[],"rawMarkdown":"### Quote Volume\n\n**Definition:** Number of quotes sent in a period.\n\n**Formula:**\n```\nQuote Volume = Count of quotes created\n```\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Quote-to-Order Rate","slug":"quote-to-order-rate","definition":"Percentage of quotes that convert to orders.","formulas":["Quote-to-Order = Orders / Quotes × 100"],"benchmarks":"- Below 20%: Low conversion\n- 20-40%: Average\n- 40-60%: Good\n- Above 60%: Strong","insight":null,"commonMistakes":null,"sources":[],"department":"RevOps","category":"Quote-to-Order","aliases":[],"rawMarkdown":"### Quote-to-Order Rate\n\n**Definition:** Percentage of quotes that convert to orders.\n\n**Formula:**\n```\nQuote-to-Order = Orders / Quotes × 100\n```\n\n**Benchmarks:**\n- Below 20%: Low conversion\n- 20-40%: Average\n- 40-60%: Good\n- Above 60%: Strong\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Quote Cycle Time","slug":"quote-cycle-time","definition":"Time from quote request to quote delivery.","formulas":["Quote Cycle Time = Median of (Quote sent date - Quote requested date)"],"benchmarks":null,"insight":"Speed of quote generation process.","commonMistakes":null,"sources":[],"department":"RevOps","category":"Quote-to-Order","aliases":[],"rawMarkdown":"### Quote Cycle Time\n\n**Definition:** Time from quote request to quote delivery.\n\n**Formula:**\n```\nQuote Cycle Time = Median of (Quote sent date - Quote requested date)\n```\n\n**Target:** <24 hours for standard quotes\n\n**What it tells you:** Speed of quote generation process.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Quote Accuracy","slug":"quote-accuracy","definition":"Percentage of quotes requiring no revision.","formulas":["Quote Accuracy = Quotes with no revision / Total quotes × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"RevOps","category":"Quote-to-Order","aliases":[],"rawMarkdown":"### Quote Accuracy\n\n**Definition:** Percentage of quotes requiring no revision.\n\n**Formula:**\n```\nQuote Accuracy = Quotes with no revision / Total quotes × 100\n```\n\n**Target:** >90%\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Discount Rate","slug":"discount-rate","definition":"Discount off list price across quotes sent in the period, weighted by list price.","formulas":["Discount Rate = (List price - Sold price) / List price × 100"],"benchmarks":null,"insight":"Pricing discipline and competitive pressure.","commonMistakes":null,"sources":[],"department":"RevOps","category":"Quote-to-Order","aliases":[],"rawMarkdown":"### Discount Rate\n\n**Definition:** Discount off list price across quotes sent in the period, weighted by list price.\n\n**Formula:**\n```\nDiscount Rate = (List price - Sold price) / List price × 100\n```\n\n**What it tells you:** Pricing discipline and competitive pressure.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Order-to-Activation Time","slug":"order-to-activation-time","definition":"Time from signed order to customer activation/provisioning.","formulas":["Order-to-Activation = Median of (Activation date - Order signed date)"],"benchmarks":null,"insight":"How quickly customers get access after buying.","commonMistakes":null,"sources":[],"department":"RevOps","category":"Order Processing","aliases":[],"rawMarkdown":"### Order-to-Activation Time\n\n**Definition:** Time from signed order to customer activation/provisioning.\n\n**Formula:**\n```\nOrder-to-Activation = Median of (Activation date - Order signed date)\n```\n\n**What it tells you:** How quickly customers get access after buying.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Order Processing Time","slug":"order-processing-time","definition":"Time to process an order through internal systems.","formulas":["Processing Time = Median of (Order complete in system - Order received)"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"RevOps","category":"Order Processing","aliases":[],"rawMarkdown":"### Order Processing Time\n\n**Definition:** Time to process an order through internal systems.\n\n**Formula:**\n```\nProcessing Time = Median of (Order complete in system - Order received)\n```\n\n**Target:** Same day for standard orders.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Order Error Rate","slug":"order-error-rate","definition":"Percentage of orders with processing errors.","formulas":["Order Error Rate = Orders with errors / Total orders × 100"],"benchmarks":null,"insight":"Process quality and system reliability.","commonMistakes":null,"sources":[],"department":"RevOps","category":"Order Processing","aliases":[],"rawMarkdown":"### Order Error Rate\n\n**Definition:** Percentage of orders with processing errors.\n\n**Formula:**\n```\nOrder Error Rate = Orders with errors / Total orders × 100\n```\n\n**Target:** <2%\n\n**What it tells you:** Process quality and system reliability.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Billing Accuracy","slug":"billing-accuracy","definition":"Percentage of invoices generated correctly on first attempt.","formulas":["Billing Accuracy = Invoices without correction / Total invoices × 100"],"benchmarks":null,"insight":"Billing process reliability.","commonMistakes":null,"sources":[],"department":"RevOps","category":"Billing Operations","aliases":[],"rawMarkdown":"### Billing Accuracy\n\n**Definition:** Percentage of invoices generated correctly on first attempt.\n\n**Formula:**\n```\nBilling Accuracy = Invoices without correction / Total invoices × 100\n```\n\n**Target:** >98%\n\n**What it tells you:** Billing process reliability.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Invoice Cycle Time","slug":"invoice-cycle-time","definition":"Time from billing event to invoice delivery.","formulas":["Invoice Cycle Time = Median of (Invoice sent - Billing trigger date)"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"RevOps","category":"Billing Operations","aliases":[],"rawMarkdown":"### Invoice Cycle Time\n\n**Definition:** Time from billing event to invoice delivery.\n\n**Formula:**\n```\nInvoice Cycle Time = Median of (Invoice sent - Billing trigger date)\n```\n\nMeasured in calendar days. A business-day count reads lower when the interval spans a weekend or holiday, so state which one you report.\n\n**Target:** <7 calendar days (about 5 business days)\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Billing Disputes","slug":"billing-disputes","definition":"Percentage of invoices disputed by customers.","formulas":["Dispute Rate = Invoices disputed / Total invoices × 100"],"benchmarks":null,"insight":"Invoice accuracy and customer alignment.","commonMistakes":null,"sources":[],"department":"RevOps","category":"Billing Operations","aliases":[],"rawMarkdown":"### Billing Disputes\n\n**Definition:** Percentage of invoices disputed by customers.\n\n**Formula:**\n```\nDispute Rate = Invoices disputed / Total invoices × 100\n```\n\nBilling Disputes are reported per payment status as of period end.\n\n**Target:** <1%\n\n**What it tells you:** Invoice accuracy and customer alignment.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Credit Memo Rate","slug":"credit-memo-rate","definition":"Percentage of invoices requiring credit memos.","formulas":["Credit Memo Rate = Credit memos issued / Total invoices × 100"],"benchmarks":null,"insight":"Billing errors and adjustments.","commonMistakes":null,"sources":[],"department":"RevOps","category":"Billing Operations","aliases":[],"rawMarkdown":"### Credit Memo Rate\n\n**Definition:** Percentage of invoices requiring credit memos.\n\n**Formula:**\n```\nCredit Memo Rate = Credit memos issued / Total invoices × 100\n```\n\n**Target:** <2%\n\n**What it tells you:** Billing errors and adjustments.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Days Sales Outstanding (DSO)","slug":"days-sales-outstanding-dso","definition":"Average days to collect payment after invoicing.","formulas":["DSO = (Accounts Receivable / Revenue) × Days in period"],"benchmarks":"- Below 30 days: Excellent\n- 30-45 days: Good\n- 45-60 days: Average\n- Above 60 days: Collection issues","insight":null,"commonMistakes":null,"sources":[],"department":"RevOps","category":"Collections","aliases":["DSO"],"rawMarkdown":"### Days Sales Outstanding (DSO)\n\n**Definition:** Average days to collect payment after invoicing.\n\n**Formula:**\n```\nDSO = (Accounts Receivable / Revenue) × Days in period\n```\n\n**Benchmarks:**\n- Below 30 days: Excellent\n- 30-45 days: Good\n- 45-60 days: Average\n- Above 60 days: Collection issues\n\n**Note:** [Finance metrics](finance.md) links here. This is the canonical definition.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Collection Effectiveness Index (CEI)","slug":"collection-effectiveness-index-cei","definition":"The share of collectible receivables actually collected in the period. Billings stand in for credit sales. Current AR is receivables aged 30 days or less.","formulas":["CEI = (Beginning AR + Credit sales - Ending AR) / (Beginning AR + Credit sales - Ending current AR) × 100"],"benchmarks":"- Below 70%: Poor\n- 70-80%: Average\n- Above 80%: Good","insight":null,"commonMistakes":null,"sources":[],"department":"RevOps","category":"Collections","aliases":["CEI"],"rawMarkdown":"### Collection Effectiveness Index (CEI)\n\n**Definition:** The share of collectible receivables actually collected in the period. Billings stand in for credit sales. Current AR is receivables aged 30 days or less.\n\n**Formula:**\n```\nCEI = (Beginning AR + Credit sales - Ending AR) / (Beginning AR + Credit sales - Ending current AR) × 100\n```\n\n**Benchmarks:**\n- Below 70%: Poor\n- 70-80%: Average\n- Above 80%: Good\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Aging Buckets","slug":"aging-buckets","definition":"Distribution of receivables by age.","formulas":["Bucket % = AR in bucket / Total AR × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"RevOps","category":"Collections","aliases":[],"rawMarkdown":"### Aging Buckets\n\n**Definition:** Distribution of receivables by age.\n\n**Buckets:**\n- Current (0-30 days)\n- 31-60 days\n- 61-90 days\n- 90+ days\n\n**Formula:**\n```\nBucket % = AR in bucket / Total AR × 100\n```\n\nAging Buckets is reported per bucket: one share for each age bucket, each over the whole outstanding balance, so the shares sum to 100%. Age is the days from invoice date to the period end. Bounds are inclusive, so the 90+ bucket starts at 91 days.\n\n**Targets:**\n- Current: >80%\n- 31-60: <15%\n- 61-90: <4%\n- 90+: <1%\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Accounts Receivable Balance","slug":"accounts-receivable-balance","definition":"Total amount outstanding on open invoices at period end.","formulas":["AR Balance = Sum of outstanding amounts on open invoices at period end"],"benchmarks":null,"insight":"How much billed cash is still to be collected. The payment status breakdown shows how much of it sits in partly paid or written-off invoices.","commonMistakes":null,"sources":[],"department":"RevOps","category":"Collections","aliases":[],"rawMarkdown":"### Accounts Receivable Balance\n\n**Definition:** Total amount outstanding on open invoices at period end.\n\n**Formula:**\n```\nAR Balance = Sum of outstanding amounts on open invoices at period end\n```\n\n**Population:** The invoice snapshot at period end, invoices with an outstanding amount above zero.\n\nAccounts Receivable Balance is reported per payment status (unpaid, partial and so on) as of period end.\n\n**Note:** AR Balance should reconcile to `balance_sheet.accounts_receivable`, which DSO reads. Differences are unapplied cash or write-offs.\n\n**What it tells you:** How much billed cash is still to be collected. The payment status breakdown shows how much of it sits in partly paid or written-off invoices.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Bad Debt Rate","slug":"bad-debt-rate","definition":"Percentage of revenue written off as uncollectable.","formulas":["Bad Debt Rate = Bad debt expense / Revenue × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"RevOps","category":"Collections","aliases":[],"rawMarkdown":"### Bad Debt Rate\n\nSee [Finance](finance.md#bad-debt-rate) for the canonical definition: bad debt expense over GAAP revenue.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Payment Method Distribution","slug":"payment-method-distribution","definition":"Breakdown of payments by method.","formulas":["Method share = Invoiced amount in period paid by the method / Invoiced amount in period with a known method"],"benchmarks":null,"insight":"Collection risk and processing costs by method.","commonMistakes":null,"sources":[],"department":"RevOps","category":"Collections","aliases":[],"rawMarkdown":"### Payment Method Distribution\n\n**Definition:** Breakdown of payments by method.\n\n**Formula:**\n```\nMethod share = Invoiced amount in period paid by the method / Invoiced amount in period with a known method\n```\n\n**Methods:**\n- Credit card\n- ACH/Direct debit\n- Wire transfer\n- Check\n\nPayment Method Distribution is reported per method: one share for each method, with the shares summing to 100%.\n\n**What it tells you:** Collection risk and processing costs by method.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Recognized vs Billed","slug":"recognized-vs-billed","definition":"Ratio of recognized revenue to billed revenue.","formulas":["Recognized/Billed = Recognized revenue / Billed revenue"],"benchmarks":null,"insight":"Revenue recognition timing vs cash collection.","commonMistakes":null,"sources":[],"department":"RevOps","category":"Revenue Recognition","aliases":[],"rawMarkdown":"### Recognized vs Billed\n\n**Definition:** Ratio of recognized revenue to billed revenue.\n\n**Formula:**\n```\nRecognized/Billed = Recognized revenue / Billed revenue\n```\n\n**What it tells you:** Revenue recognition timing vs cash collection.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Deferred Revenue Balance","slug":"deferred-revenue-balance","definition":"Revenue billed but not yet recognized. A balance of cumulative billings less cumulative recognized revenue, independent of when cash is received.","formulas":["Deferred Revenue = Cumulative billings - Cumulative recognized revenue"],"benchmarks":null,"insight":"Revenue already billed that the company still owes in service.","commonMistakes":null,"sources":[],"department":"RevOps","category":"Revenue Recognition","aliases":[],"rawMarkdown":"### Deferred Revenue Balance\n\n**Definition:** Revenue billed but not yet recognized. A balance of cumulative billings less cumulative recognized revenue, independent of when cash is received.\n\n**Formula:**\n```\nDeferred Revenue = Cumulative billings - Cumulative recognized revenue\n```\n\n**What it tells you:** Revenue already billed that the company still owes in service.\n\nThe [Prepaid Credit Balance](finance.md#prepaid-credit-balance) is the part of the deferred revenue balance that is prepaid consumption.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Unbilled Revenue","slug":"unbilled-revenue","definition":"Revenue recognized but not yet invoiced.","formulas":["Unbilled Revenue = Recognized revenue - Billed revenue (where recognition > billing)"],"benchmarks":null,"insight":"Service already delivered that billing has to catch up on.","commonMistakes":null,"sources":[],"department":"RevOps","category":"Revenue Recognition","aliases":[],"rawMarkdown":"### Unbilled Revenue\n\n**Definition:** Revenue recognized but not yet invoiced.\n\n**Formula:**\n```\nUnbilled Revenue = Recognized revenue - Billed revenue (where recognition > billing)\n```\n\n**What it tells you:** Service already delivered that billing has to catch up on.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Revenue Recognition Accuracy","slug":"revenue-recognition-accuracy","definition":"Percentage of revenue correctly recognized per ASC 606.","formulas":["Recognition Accuracy = Revenue recognized correctly / Total revenue × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"RevOps","category":"Revenue Recognition","aliases":[],"rawMarkdown":"### Revenue Recognition Accuracy\n\n**Definition:** Percentage of revenue correctly recognized per ASC 606.\n\n**Formula:**\n```\nRecognition Accuracy = Revenue recognized correctly / Total revenue × 100\n```\n\n**Target:** 100%\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Renewal Notification Rate","slug":"renewal-notification-rate","definition":"Percentage of renewals where customer was notified on time.","formulas":["Notification Rate = Renewals notified on time / Total renewals × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"RevOps","category":"Renewal Operations","aliases":[],"rawMarkdown":"### Renewal Notification Rate\n\n**Definition:** Percentage of renewals where customer was notified on time.\n\n**Formula:**\n```\nNotification Rate = Renewals notified on time / Total renewals × 100\n```\n\n**Target:** 100%\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Auto-Renewal Rate","slug":"auto-renewal-rate","definition":"Percentage of renewals processed automatically.","formulas":["Auto-Renewal Rate = Auto-renewed contracts / Total renewals × 100"],"benchmarks":null,"insight":"Renewal process efficiency.","commonMistakes":null,"sources":[],"department":"RevOps","category":"Renewal Operations","aliases":[],"rawMarkdown":"### Auto-Renewal Rate\n\n**Definition:** Percentage of renewals processed automatically.\n\n**Formula:**\n```\nAuto-Renewal Rate = Auto-renewed contracts / Total renewals × 100\n```\n\n**What it tells you:** Renewal process efficiency.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Renewal Processing Time","slug":"renewal-processing-time","definition":"Time to process a renewal from trigger to completion.","formulas":["Processing Time = Median of (Renewal complete - Renewal trigger)"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"RevOps","category":"Renewal Operations","aliases":[],"rawMarkdown":"### Renewal Processing Time\n\n**Definition:** Time to process a renewal from trigger to completion.\n\n**Formula:**\n```\nProcessing Time = Median of (Renewal complete - Renewal trigger)\n```\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"System Sync Accuracy","slug":"system-sync-accuracy","definition":"Data consistency across RevOps systems (CRM, billing, ERP).","formulas":["Sync Accuracy = Records matching across systems / Total records × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"RevOps","category":"Systems & Data Quality","aliases":[],"rawMarkdown":"### System Sync Accuracy\n\n**Definition:** Data consistency across RevOps systems (CRM, billing, ERP).\n\n**Formula:**\n```\nSync Accuracy = Records matching across systems / Total records × 100\n```\n\n**Target:** >99%\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Data Completeness","slug":"data-completeness","definition":"Percentage of required fields populated in RevOps systems.","formulas":["Completeness = Fields populated / Required fields × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"RevOps","category":"Systems & Data Quality","aliases":[],"rawMarkdown":"### Data Completeness\n\n**Definition:** Percentage of required fields populated in RevOps systems.\n\n**Formula:**\n```\nCompleteness = Fields populated / Required fields × 100\n```\n\n**Target:** >95%\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Pipeline Value","slug":"pipeline-value","definition":"Total value of open sales opportunities, weighted by stage probability unless stated as unweighted.","formulas":["Pipeline Value = Sum of (Deal value × Stage probability) for all open opportunities","Pipeline Value = Sum of (Deal value) for all open opportunities"],"benchmarks":null,"insight":"The potential revenue if deals close at expected rates.","commonMistakes":null,"sources":[],"department":"Sales","category":"Pipeline Metrics","aliases":[],"rawMarkdown":"### Pipeline Value\n\n**Definition:** Total value of open sales opportunities, weighted by stage probability unless stated as unweighted.\n\n**Formula (weighted):**\n```\nPipeline Value = Sum of (Deal value × Stage probability) for all open opportunities\n```\n\n**Formula (unweighted):**\n```\nPipeline Value = Sum of (Deal value) for all open opportunities\n```\n\nAlways specify whether weighted or unweighted.\n\n**Weighted vs unweighted:**\n- **Weighted:** More realistic, accounts for deal stage. A $100K deal at 50% stage = $50K weighted value.\n- **Unweighted:** Simpler, shows total potential. Useful for capacity planning.\n\n**What it tells you:** The potential revenue if deals close at expected rates.\n\n**Sources:** [Clari](https://www.clari.com/blog/pipeline-coverage-best-practices/), [Salesforce](https://www.salesforce.com/blog/sales-velocity/)\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Pipeline Coverage Ratio","slug":"pipeline-coverage-ratio","definition":"The ratio of unweighted pipeline value to quota for the period.","formulas":["Pipeline Coverage = Unweighted Pipeline Value / Quota for Period"],"benchmarks":"- Below 2x: Insufficient pipeline, high risk of missing quota\n- 2-3x: Light, acceptable for high win rate teams\n- 3-4x: Healthy for typical 25-33% win rates\n- Above 4x: Strong, but may indicate pipeline hygiene issues or low win rates","insight":"Whether there's enough pipeline to hit targets given historical conversion rates.","commonMistakes":null,"sources":["Clari: Pipeline Coverage Best Practices: https://www.clari.com/blog/pipeline-coverage-best-practices/","Outreach: Sales Pipeline Coverage Ratio: https://www.outreach.io/resources/blog/sales-pipeline-coverage-ratio","Mosaic: Pipeline Coverage Ratio: https://www.mosaic.tech/financial-metrics/pipeline-coverage-ratio"],"department":"Sales","category":"Pipeline Metrics","aliases":[],"rawMarkdown":"### Pipeline Coverage Ratio\n\n**Definition:** The ratio of unweighted pipeline value to quota for the period.\n\n**Formula:**\n```\nPipeline Coverage = Unweighted Pipeline Value / Quota for Period\n```\n\nUse the unweighted Pipeline Value (open opportunities at full deal value). The 1 / Win Rate rule below already applies the conversion, so a stage-weighted pipeline would count it twice.\n\nExpress as multiple (e.g., \"3x\" or \"3:1\").\n\n**Why 3x-4x works:** The math is 1 / Win Rate. If you win 25% of deals, you need 4x coverage (1 ÷ 0.25 = 4). If you win 33%, you need 3x.\n\n**Benchmarks:**\n- Below 2x: Insufficient pipeline, high risk of missing quota\n- 2-3x: Light, acceptable for high win rate teams\n- 3-4x: Healthy for typical 25-33% win rates\n- Above 4x: Strong, but may indicate pipeline hygiene issues or low win rates\n\n**By segment:**\n- SMB/high-velocity: 2-3x may suffice\n- Mid-market: 2.5-4x typical\n- Enterprise: 3-5x (longer cycles, more stakeholders)\n\n**What it tells you:** Whether there's enough pipeline to hit targets given historical conversion rates.\n\n**Calculate your ideal:** Use your actual win rate, not generic benchmarks.\n\n**Sources:**\n- [Clari: Pipeline Coverage Best Practices](https://www.clari.com/blog/pipeline-coverage-best-practices/)\n- [Outreach: Sales Pipeline Coverage Ratio](https://www.outreach.io/resources/blog/sales-pipeline-coverage-ratio)\n- [Mosaic: Pipeline Coverage Ratio](https://www.mosaic.tech/financial-metrics/pipeline-coverage-ratio)\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Pipeline Velocity","slug":"pipeline-velocity","definition":"The speed at which pipeline converts to revenue. Also called Sales Velocity or Deal Velocity.","formulas":["Pipeline Velocity = (# Opportunities × Win Rate × Average Deal Size) / Sales Cycle Length"],"benchmarks":null,"insight":"The theoretical throughput of your sales engine. Improving any component improves velocity.","commonMistakes":null,"sources":["HubSpot: Sales Velocity: https://blog.hubspot.com/sales/sales-velocity","Salesforce: Sales Velocity: https://www.salesforce.com/blog/sales-velocity/","Drivetrain: Sales Velocity in SaaS: https://www.drivetrain.ai/strategic-finance-glossary/sales-velocity-in-saas-what-it-is-why-its-important-and-how-to-calculate-it"],"department":"Sales","category":"Pipeline Metrics","aliases":[],"rawMarkdown":"### Pipeline Velocity\n\n**Definition:** The speed at which pipeline converts to revenue. Also called Sales Velocity or Deal Velocity.\n\n**Formula:**\n```\nPipeline Velocity = (# Opportunities × Win Rate × Average Deal Size) / Sales Cycle Length\n```\n\nResult is revenue per day (or per period).\n\n**The four levers:**\n1. **Opportunities:** Number of open opportunities in pipeline\n2. **Win Rate:** Conversion rate from opportunity to close\n3. **Deal Size:** Average deal value\n4. **Cycle Length:** Days from opportunity to close\n\n**Example:** 50 opportunities × 35% win rate × $2,500 deal size ÷ 28 days = **$1,562/day**\n\n**What it tells you:** The theoretical throughput of your sales engine. Improving any component improves velocity.\n\n**How to use:** Find the lever that is holding velocity back. Too few opportunities points to lead generation; deals stuck in negotiation point to cycle length.\n\n**Sources:**\n- [HubSpot: Sales Velocity](https://blog.hubspot.com/sales/sales-velocity)\n- [Salesforce: Sales Velocity](https://www.salesforce.com/blog/sales-velocity/)\n- [Drivetrain: Sales Velocity in SaaS](https://www.drivetrain.ai/strategic-finance-glossary/sales-velocity-in-saas-what-it-is-why-its-important-and-how-to-calculate-it)\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Win Rate","slug":"win-rate","definition":"The percentage of qualified opportunities closed in the period that were won.","formulas":["Win Rate = Deals Won / (Deals Won + Deals Lost) × 100"],"benchmarks":null,"insight":"How effective the sales team is at closing qualified opportunities.","commonMistakes":["Including unqualified leads (inflates denominator, deflates rate)","Not specifying stage (win rate from MQL vs SQL vs Qualified Opp will differ dramatically)","Comparing across deal sizes without adjusting expectations"],"sources":["Walnut: B2B Benchmarks for SaaS Sales: https://www.walnut.io/blog/sales-tips/saas-and-b2b-sales-benchmarks-what-to-measure-and-how/","Outreach: Win Rate vs Close Rate: https://www.outreach.io/resources/blog/win-rate-vs-close-rate","Kixie: SaaS Win Rate Benchmark: https://www.kixie.com/sales-blog/saas-win-rate-benchmark-proven-sales-strategies/"],"department":"Sales","category":"Conversion Metrics","aliases":[],"rawMarkdown":"### Win Rate\n\n**Definition:** The percentage of qualified opportunities closed in the period that were won.\n\n**Formula:**\n```\nWin Rate = Deals Won / (Deals Won + Deals Lost) × 100\n```\n\nWin Rate is reported per acquisition channel.\n\nExclude open deals and deals disqualified before reaching qualified stage.\n\n**Overall Benchmarks:**\n- Below 15%: Low, investigate qualification or competitive issues\n- 15-25%: Average (industry average ~22-25%)\n- 25-35%: Good\n- 35-50%: Strong/top performer\n\n**By deal size:**\n- <$10K ACV: 28-35%\n- $10K-$50K: 20-28%\n- $50K-$100K: 15-22%\n- >$100K: 12-18%\n\n**By segment:**\n- SMB: 30-40%\n- Mid-market: 25-35%\n- Enterprise: 20-25%\n\n**What it tells you:** How effective the sales team is at closing qualified opportunities.\n\n**Common mistakes:**\n- Including unqualified leads (inflates denominator, deflates rate)\n- Not specifying stage (win rate from MQL vs SQL vs Qualified Opp will differ dramatically)\n- Comparing across deal sizes without adjusting expectations\n\n**Key insight:** Track your own win rate over time. Benchmarks are a rough guide to where you sit.\n\n**Sources:**\n- [Walnut: B2B Benchmarks for SaaS Sales](https://www.walnut.io/blog/sales-tips/saas-and-b2b-sales-benchmarks-what-to-measure-and-how/)\n- [Outreach: Win Rate vs Close Rate](https://www.outreach.io/resources/blog/win-rate-vs-close-rate)\n- [Kixie: SaaS Win Rate Benchmark](https://www.kixie.com/sales-blog/saas-win-rate-benchmark-proven-sales-strategies/)\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Lead-to-Opportunity Rate","slug":"lead-to-opportunity-rate","definition":"The percentage of leads that become qualified opportunities.","formulas":["Lead-to-Opportunity = Opportunities created / Leads received × 100"],"benchmarks":"- 5-15%: Typical for inbound leads\n- 1-5%: Typical for outbound/cold leads\n- Varies significantly by lead source and ICP fit","insight":"Lead quality and SDR/qualification effectiveness.","commonMistakes":null,"sources":[],"department":"Sales","category":"Conversion Metrics","aliases":[],"rawMarkdown":"### Lead-to-Opportunity Rate\n\n**Definition:** The percentage of leads that become qualified opportunities.\n\n**Formula:**\n```\nLead-to-Opportunity = Opportunities created / Leads received × 100\n```\n\n**Benchmarks:**\n- 5-15%: Typical for inbound leads\n- 1-5%: Typical for outbound/cold leads\n- Varies significantly by lead source and ICP fit\n\n**What it tells you:** Lead quality and SDR/qualification effectiveness.\n\n**Sources:** [HubSpot](https://blog.hubspot.com/sales/sales-velocity), [Databox](https://databox.com/b2b-sales-cycle-length)\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Opportunity-to-Close Rate","slug":"opportunity-to-close-rate","definition":"The percentage of qualified opportunities that close as won. Also called Close Rate.","formulas":["Opportunity-to-Close = Closed Won / (Closed Won + Closed Lost) × 100"],"benchmarks":null,"insight":"AE effectiveness at converting qualified pipeline.","commonMistakes":null,"sources":[],"department":"Sales","category":"Conversion Metrics","aliases":[],"rawMarkdown":"### Opportunity-to-Close Rate\n\n**Definition:** The percentage of qualified opportunities that close as won. Also called Close Rate.\n\n**Formula:**\n```\nOpportunity-to-Close = Closed Won / (Closed Won + Closed Lost) × 100\n```\n\n**Note:** The GASP Standard computes it as Win Rate. The two names describe the same measure, taken from the qualified opportunity stage.\n\n**What it tells you:** AE effectiveness at converting qualified pipeline.\n\n**Sources:** [Outreach](https://www.outreach.io/resources/blog/win-rate-vs-close-rate)\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"ACV (Annual Contract Value)","slug":"acv-annual-contract-value","definition":"The annualized value of a contract, normalizing multi-year deals to a single year. Aggregated, it is the average ACV of new contracts signed in the period.","formulas":["ACV = (Total Contract Value - One-time fees) / Contract term in years","Average ACV = Sum of ACV for all deals / Number of deals"],"benchmarks":null,"insight":"Deal size and customer segment. Important for CAC analysis and go-to-market strategy.","commonMistakes":null,"sources":["Paddle: Annual Contract Value: https://www.paddle.com/resources/annual-contract-value","ChurnZero: Annual Contract Value: https://churnzero.com/churnopedia/annual-contract-value-acv/","Chargebee: ACV vs ARR: https://www.chargebee.com/resources/glossaries/acv-vs-arr/"],"department":"Sales","category":"Deal Metrics","aliases":["ACV"],"rawMarkdown":"### ACV (Annual Contract Value)\n\n**Definition:** The annualized value of a contract, normalizing multi-year deals to a single year. Aggregated, it is the average ACV of new contracts signed in the period.\n\n**Formula (single contract):**\n```\nACV = (Total Contract Value - One-time fees) / Contract term in years\n```\n\n**Formula (average across deals):**\n```\nAverage ACV = Sum of ACV for all deals / Number of deals\n```\n\n**Example:** A 3-year contract worth $150K (excluding setup fees) = $50K ACV.\n\nFor monthly contracts, annualize: Monthly value × 12\n\n**Excludes:** One-time fees (setup, implementation, training)\n\n**ACV vs ARR:**\n- **ACV** = Value of a single contract, annualized\n- **ARR** = Total recurring revenue across all customers at a point in time\n\n**Typical ranges:**\n- SMB: <$5K\n- Mid-market: $25K-$100K\n- Enterprise: $100K+\n\n**What it tells you:** Deal size and customer segment. Important for CAC analysis and go-to-market strategy.\n\n**Sources:**\n- [Paddle: Annual Contract Value](https://www.paddle.com/resources/annual-contract-value)\n- [ChurnZero: Annual Contract Value](https://churnzero.com/churnopedia/annual-contract-value-acv/)\n- [Chargebee: ACV vs ARR](https://www.chargebee.com/resources/glossaries/acv-vs-arr/)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Average Deal Size","slug":"average-deal-size","definition":"The average total value of deals won in the period (total contract value, not annualized).","formulas":["Average Deal Size = Total contract value of closed deals / Number of deals"],"benchmarks":null,"insight":"Raw deal size. Useful when contract lengths vary significantly.","commonMistakes":null,"sources":[],"department":"Sales","category":"Deal Metrics","aliases":[],"rawMarkdown":"### Average Deal Size\n\n**Definition:** The average total value of deals won in the period (total contract value, not annualized).\n\n**Formula:**\n```\nAverage Deal Size = Total contract value of closed deals / Number of deals\n```\n\n**Difference from ACV:** Average Deal Size uses total contract value (TCV). ACV annualizes multi-year deals.\n\n**Example:** A 3-year, $150K deal = $150K deal size, but $50K ACV.\n\n**What it tells you:** Raw deal size. Useful when contract lengths vary significantly.\n\n**Sources:** [Paddle](https://www.paddle.com/resources/annual-contract-value), [ChurnZero](https://churnzero.com/churnopedia/annual-contract-value-acv/)\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Sales Cycle Length","slug":"sales-cycle-length","definition":"The average time from opportunity creation to close.","formulas":["Sales Cycle = Average of (Close date - Opportunity created date) for deals won in the period"],"benchmarks":"- SMB: 14-40 days\n- Mid-market: 60-90 days\n- Enterprise: 90-180+ days","insight":"How long deals take to close. Longer cycles require more pipeline coverage.","commonMistakes":null,"sources":["SaaStr: B2B Sales Cycle Benchmarks: https://www.saastr.com/dear-saastr-whats-a-good-benchmark-for-b2b-sales-cycles/","Databox: B2B Sales Cycle Length: https://databox.com/b2b-sales-cycle-length","Drivetrain: Sales Cycle Length: https://www.drivetrain.ai/strategic-finance-glossary/sales-cycle-length-scl"],"department":"Sales","category":"Deal Metrics","aliases":[],"rawMarkdown":"### Sales Cycle Length\n\n**Definition:** The average time from opportunity creation to close.\n\n**Formula:**\n```\nSales Cycle = Average of (Close date - Opportunity created date) for deals won in the period\n```\n\nMeasured in days. Report the median of the same deals beside the average, since a few long deals skew the mean.\n\n**Benchmarks by segment:**\n- SMB: 14-40 days\n- Mid-market: 60-90 days\n- Enterprise: 90-180+ days\n\n**Benchmarks by ACV:**\n- <$2K ACV: ~14 days (1-2 call close)\n- <$5K ACV: ~30-40 days\n- $5K-$25K ACV: ~60-90 days\n- $25K-$100K ACV: 90-180 days\n- >$100K ACV: 170+ days (often 6-12 months)\n- >$500K ACV: 6-18+ months (annual budget cycles)\n\n**Overall median:** ~84 days across B2B SaaS\n\n**What it tells you:** How long deals take to close. Longer cycles require more pipeline coverage.\n\n**Recent trends (2024-2025):**\n- Cycles 22% longer since 2022 due to budget scrutiny\n- Average B2B deal involves 6.8 stakeholders (up from 5.4 in 2020)\n- CFO involvement in software purchases up 40%\n- Negotiation → Close accounts for 35-40% of enterprise cycle time\n\n**Sources:**\n- [SaaStr: B2B Sales Cycle Benchmarks](https://www.saastr.com/dear-saastr-whats-a-good-benchmark-for-b2b-sales-cycles/)\n- [Databox: B2B Sales Cycle Length](https://databox.com/b2b-sales-cycle-length)\n- [Drivetrain: Sales Cycle Length](https://www.drivetrain.ai/strategic-finance-glossary/sales-cycle-length-scl)\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Quota Attainment","slug":"quota-attainment","definition":"The percentage of quota achieved by a rep or team.","formulas":["Quota Attainment = Revenue Closed / Quota × 100","Team Attainment = Total Team Revenue / Total Team Quota × 100"],"benchmarks":"- Below 50%: Below average\n- 50-80%: Average range\n- 80-100%: Strong performer\n- 100%+: Top performer / exceeding","insight":"Sales rep and team performance against targets.","commonMistakes":null,"sources":["Forrester: Quota Attainment: https://www.forrester.com/blogs/your-companys-quota-attainment-is-probably-around-50-and-thats-not-a-bad-thing/","Wall Street Prep: Quota Attainment: https://www.wallstreetprep.com/knowledge/quota-attainment/","QuotaPath: Quota Attainment Rate: https://www.quotapath.com/blog/quota-attainment-rate/"],"department":"Sales","category":"Productivity Metrics","aliases":[],"rawMarkdown":"### Quota Attainment\n\n**Definition:** The percentage of quota achieved by a rep or team.\n\n**Formula (individual):**\n```\nQuota Attainment = Revenue Closed / Quota × 100\n```\n\n**Formula (team):**\n```\nTeam Attainment = Total Team Revenue / Total Team Quota × 100\n```\n\nOr: Average of individual rep attainment rates.\n\n**Reality check:** Industry data shows most reps don't hit quota:\n- Average individual attainment: 43-50%\n- Only 24% of reps exceed annual quota\n- 69% of B2B reps fall short of quota\n\n**Benchmarks (individual rep):**\n- Below 50%: Below average\n- 50-80%: Average range\n- 80-100%: Strong performer\n- 100%+: Top performer / exceeding\n\n**Benchmarks (team/company):**\n- 50%: Average (median rep at quota)\n- 60-70%: Good\n- 80-90%: Strong\n- 90%+: Exceptional (or quotas may be too low)\n\n**What it tells you:** Sales rep and team performance against targets.\n\n**Quota setting rule of thumb:** Quota = 5x rep OTE (ranges from 3x to 8x depending on company stage).\n\n**Sources:**\n- [Forrester: Quota Attainment](https://www.forrester.com/blogs/your-companys-quota-attainment-is-probably-around-50-and-thats-not-a-bad-thing/)\n- [Wall Street Prep: Quota Attainment](https://www.wallstreetprep.com/knowledge/quota-attainment/)\n- [QuotaPath: Quota Attainment Rate](https://www.quotapath.com/blog/quota-attainment-rate/)\n\n---","signalType":"outcome","signalTypeSecondary":"operational","dualLens":null,"dualLensNote":null},{"name":"Revenue per Rep","slug":"revenue-per-rep","definition":"New revenue closed in the period divided by the number of quota-carrying reps.","formulas":["Revenue per Rep = Total New Revenue / Number of Quota-Carrying Reps"],"benchmarks":"By company stage:\n- Seed: $250K-$400K\n- Series A: $400K-$600K\n- Series B+: $600K-$1M+\n\nBy segment:\n- SMB: $400K-$600K\n- Mid-market: $600K-$800K\n- Enterprise: $800K-$1.5M+","insight":"Sales team productivity and efficiency.","commonMistakes":null,"sources":["Optifai: Revenue Per Sales Rep Benchmark 2025: https://optif.ai/learn/questions/revenue-per-sales-rep-benchmark/","Revenue.io: Revenue per Rep: https://www.revenue.io/inside-sales-glossary/what-is-revenue-per-rep"],"department":"Sales","category":"Productivity Metrics","aliases":[],"rawMarkdown":"### Revenue per Rep\n\n**Definition:** New revenue closed in the period divided by the number of quota-carrying reps.\n\n**Formula:**\n```\nRevenue per Rep = Total New Revenue / Number of Quota-Carrying Reps\n```\n\n**Benchmarks (Annual, New Business):**\n\nBy company stage:\n- Seed: $250K-$400K\n- Series A: $400K-$600K\n- Series B+: $600K-$1M+\n\nBy segment:\n- SMB: $400K-$600K\n- Mid-market: $600K-$800K\n- Enterprise: $800K-$1.5M+\n\n**Median B2B SaaS:** $500K-$700K quota capacity\n\n**Top performers:** $1M+ annually\n\n**What it tells you:** Sales team productivity and efficiency.\n\n**Factors affecting output:**\n- ACV (higher = more per rep possible)\n- Sales cycle length (longer = less per rep)\n- Market maturity and brand recognition\n- Sales support infrastructure (SDRs, tools)\n\n**Sources:**\n- [Optifai: Revenue Per Sales Rep Benchmark 2025](https://optif.ai/learn/questions/revenue-per-sales-rep-benchmark/)\n- [Revenue.io: Revenue per Rep](https://www.revenue.io/inside-sales-glossary/what-is-revenue-per-rep)\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Ramp Time","slug":"ramp-time","definition":"Time for a new sales rep to reach full productivity (carrying full quota).","formulas":["Ramp Time = Time from start date to consistently achieving quota"],"benchmarks":"- SDR: 2-3 months\n- Inside Sales/SMB AE: 3-4 months\n- Mid-market AE: 4-6 months\n- Enterprise AE: 6-9 months","insight":"How quickly new hires become productive. Impacts hiring planning and capacity forecasting.","commonMistakes":null,"sources":["Mosaic: Sales Rep Ramp: https://www.mosaic.tech/financial-metrics/sales-rep-ramp","Revenue.io: Sales Ramp Time: https://www.revenue.io/blog/heres-how-long-it-should-take-for-your-sales-reps-to-be-at-fully-ramped-quota","Everstage: Sales Ramp Time: https://www.everstage.com/blog/how-to-determine-the-right-sales-ramp-up-time-for-reps"],"department":"Sales","category":"Productivity Metrics","aliases":[],"rawMarkdown":"### Ramp Time\n\n**Definition:** Time for a new sales rep to reach full productivity (carrying full quota).\n\n**Formula:**\n```\nRamp Time = Time from start date to consistently achieving quota\n```\n\n**Common calculation:** Average sales cycle + 90 days (for onboarding/training)\n\nMeasured in months.\n\n**Benchmarks by role:**\n- SDR: 2-3 months\n- Inside Sales/SMB AE: 3-4 months\n- Mid-market AE: 4-6 months\n- Enterprise AE: 6-9 months\n\n**Industry averages:**\n- Average SaaS ramp: 3.2-5 months\n- 41% of companies report 5+ months\n- Top performers target 3-4 months\n\n**Ramp quota structure (typical):**\n- Month 1: 25% quota\n- Month 2: 50% quota\n- Month 3: 75% quota\n- Month 4+: 100% quota\n\n**What it tells you:** How quickly new hires become productive. Impacts hiring planning and capacity forecasting.\n\n**Sources:**\n- [Mosaic: Sales Rep Ramp](https://www.mosaic.tech/financial-metrics/sales-rep-ramp)\n- [Revenue.io: Sales Ramp Time](https://www.revenue.io/blog/heres-how-long-it-should-take-for-your-sales-reps-to-be-at-fully-ramped-quota)\n- [Everstage: Sales Ramp Time](https://www.everstage.com/blog/how-to-determine-the-right-sales-ramp-up-time-for-reps)\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Activity Metrics (Diagnostic)","slug":"activity-metrics-diagnostic","definition":"","formulas":[],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Sales","category":"Productivity Metrics","aliases":[],"rawMarkdown":"### Activity Metrics (Diagnostic)\n\nThese count sales inputs. Use them to diagnose a pipeline or conversion problem and keep them out of headline reporting.\n\n| Metric | Definition |\n|--------|------------|\n| Calls per day | Outbound calls made |\n| Emails per day | Outbound emails sent |\n| Meetings booked | Discovery/demo meetings scheduled |\n| Demos delivered | Product demonstrations completed |\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Ticket Volume","slug":"ticket-volume","definition":"Total number of support tickets received in a period.","formulas":["Ticket Volume = Count of tickets created in period"],"benchmarks":null,"insight":"Support demand. Trend matters more than absolute number.","commonMistakes":null,"sources":[],"department":"Support","category":"Volume Metrics","aliases":[],"rawMarkdown":"### Ticket Volume\n\n**Definition:** Total number of support tickets received in a period.\n\n**Formula:**\n```\nTicket Volume = Count of tickets created in period\n```\n\nTicket Volume is reported per ticket type. Teams that staff by channel (email, chat, phone) add that split from their help desk. Questions answered without a ticket are counted by Self-Service Rate instead.\n\n**What it tells you:** Support demand. Trend matters more than absolute number.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Tickets per Customer","slug":"tickets-per-customer","definition":"Average tickets created per active customer.","formulas":["Tickets per Customer = Total tickets / Active customers"],"benchmarks":"- Below 0.5/month: Low touch, efficient product\n- 0.5-1.0/month: Typical\n- Above 1.0/month: High touch, may indicate product issues","insight":"Support burden relative to the customer base. A rising ratio usually points to product or onboarding issues.","commonMistakes":null,"sources":[],"department":"Support","category":"Volume Metrics","aliases":[],"rawMarkdown":"### Tickets per Customer\n\n**Definition:** Average tickets created per active customer.\n\n**Formula:**\n```\nTickets per Customer = Total tickets / Active customers\n```\n\n**Benchmarks:**\n- Below 0.5/month: Low touch, efficient product\n- 0.5-1.0/month: Typical\n- Above 1.0/month: High touch, may indicate product issues\n\n**What it tells you:** Support burden relative to the customer base. A rising ratio usually points to product or onboarding issues.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Ticket Backlog","slug":"ticket-backlog","definition":"Number of tickets open or pending at the end of the period.","formulas":["Backlog = Count of open tickets"],"benchmarks":null,"insight":"Current support debt. It should hold steady or fall.","commonMistakes":null,"sources":[],"department":"Support","category":"Volume Metrics","aliases":[],"rawMarkdown":"### Ticket Backlog\n\n**Definition:** Number of tickets open or pending at the end of the period.\n\n**Formula:**\n```\nBacklog = Count of open tickets\n```\n\n**What it tells you:** Current support debt. It should hold steady or fall.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Ticket Distribution by Type","slug":"ticket-distribution-by-type","definition":"Breakdown of tickets by category.","formulas":["Type share = Tickets of the type created in period / Ticket Volume"],"benchmarks":null,"insight":"What's driving support volume. High \"how-to\" suggests onboarding or documentation gaps.","commonMistakes":null,"sources":[],"department":"Support","category":"Volume Metrics","aliases":[],"rawMarkdown":"### Ticket Distribution by Type\n\n**Definition:** Breakdown of tickets by category.\n\n**Formula:**\n```\nType share = Tickets of the type created in period / Ticket Volume\n```\n\n**Categories (typical):**\n- How-to / Usage questions\n- Bug reports\n- Feature requests\n- Billing inquiries\n- Account issues\n- Other (including outage or incident related)\n\nTicket Distribution by Type is reported per ticket type: one share for each type, with the shares summing to 100%.\n\n**What it tells you:** What's driving support volume. High \"how-to\" suggests onboarding or documentation gaps.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"First Response Time (FRT)","slug":"first-response-time-frt","definition":"Time from ticket creation to first human response.","formulas":["FRT = Median of (First response timestamp - Ticket created timestamp)"],"benchmarks":"| Channel | Target | Reality |\n|---------|--------|---------|\n| Chat | < 1 minute | Best channel for speed |\n| Email (B2B) | 4-6 hours | Industry average is 12+ hours |\n| Email (Enterprise) | < 1 hour | Premium SLA expected |\n| Phone | < 30 seconds (80% within 20 sec) | \"80/20 rule\" standard |","insight":"How quickly customers get acknowledged. Impacts satisfaction.","commonMistakes":null,"sources":["Zendesk: Customer Service Benchmark: https://www.zendesk.com/blog/first-contact-resolution-friend-foe-frenemy/","Freshworks: Customer Service Benchmark 2024: https://www.freshworks.com/resources/customer-service-benchmark-report-2024/"],"department":"Support","category":"Response Metrics","aliases":["FRT"],"rawMarkdown":"### First Response Time (FRT)\n\n**Definition:** Time from ticket creation to first human response.\n\n**Formula:**\n```\nFRT = Median of (First response timestamp - Ticket created timestamp)\n```\n\nUse median, not average (outliers skew averages).\n\n**Benchmarks:**\n| Channel | Target | Reality |\n|---------|--------|---------|\n| Chat | < 1 minute | Best channel for speed |\n| Email (B2B) | 4-6 hours | Industry average is 12+ hours |\n| Email (Enterprise) | < 1 hour | Premium SLA expected |\n| Phone | < 30 seconds (80% within 20 sec) | \"80/20 rule\" standard |\n\n**Customer expectations:** 52% expect email responses within 1 hour, 32% within 30 minutes.\n\n**What it tells you:** How quickly customers get acknowledged. Impacts satisfaction.\n\n**Sources:**\n- [Zendesk: Customer Service Benchmark](https://www.zendesk.com/blog/first-contact-resolution-friend-foe-frenemy/)\n- [Freshworks: Customer Service Benchmark 2024](https://www.freshworks.com/resources/customer-service-benchmark-report-2024/)\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"First Response SLA Adherence","slug":"first-response-sla-adherence","definition":"Percentage of tickets meeting FRT SLA target.","formulas":["FRT SLA Adherence = Tickets meeting FRT target / Total tickets × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Support","category":"Response Metrics","aliases":[],"rawMarkdown":"### First Response SLA Adherence\n\n**Definition:** Percentage of tickets meeting FRT SLA target.\n\n**Formula:**\n```\nFRT SLA Adherence = Tickets meeting FRT target / Total tickets × 100\n```\n\n**Target:** >95%\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Resolution Time (Time to Resolution)","slug":"resolution-time-time-to-resolution","definition":"Time from ticket creation to final resolution.","formulas":["Resolution Time = Median of (Resolution timestamp - Ticket created timestamp)"],"benchmarks":"- Simple issues: < 4 hours\n- Moderate issues: < 24 hours\n- Complex issues: < 72 hours","insight":"How quickly problems are actually solved.","commonMistakes":null,"sources":[],"department":"Support","category":"Resolution Metrics","aliases":[],"rawMarkdown":"### Resolution Time (Time to Resolution)\n\n**Definition:** Time from ticket creation to final resolution.\n\n**Formula:**\n```\nResolution Time = Median of (Resolution timestamp - Ticket created timestamp)\n```\n\nResolution Time is reported per ticket type.\n\n**Benchmarks:**\n- Simple issues: < 4 hours\n- Moderate issues: < 24 hours\n- Complex issues: < 72 hours\n\n**What it tells you:** How quickly problems are actually solved.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"First Contact Resolution (FCR)","slug":"first-contact-resolution-fcr","definition":"Percentage of tickets resolved in a single interaction.","formulas":["FCR = Tickets resolved without reopening or follow-up / Total tickets × 100"],"benchmarks":"- Below 60%: Low, investigate agent training or issue complexity\n- 60-70%: Below average\n- 70%: Industry average (SQM Group 2024 data)\n- 70-80%: Good, competitive for SaaS\n- 80%+: World-class","insight":"Support efficiency and agent capability.","commonMistakes":null,"sources":["SQM Group: FCR Benchmark 2024: https://www.sqmgroup.com/resources/library/blog/call-center-fcr-benchmark-2024-results-by-industry","Geckoboard: FCR Rate: https://www.geckoboard.com/best-practice/kpi-examples/first-contact-resolution-rate/"],"department":"Support","category":"Resolution Metrics","aliases":["FCR"],"rawMarkdown":"### First Contact Resolution (FCR)\n\n**Definition:** Percentage of tickets resolved in a single interaction.\n\n**Formula:**\n```\nFCR = Tickets resolved without reopening or follow-up / Total tickets × 100\n```\n\n**Benchmarks:**\n- Below 60%: Low, investigate agent training or issue complexity\n- 60-70%: Below average\n- 70%: Industry average (SQM Group 2024 data)\n- 70-80%: Good, competitive for SaaS\n- 80%+: World-class\n\n**Industry variation:** Retail/simple products achieve 73-75%. Complex tech support often 50-65%.\n\n**Impact:** FCR improvements reduce churn by up to 67%.\n\n**What it tells you:** Support efficiency and agent capability.\n\n**Sources:**\n- [SQM Group: FCR Benchmark 2024](https://www.sqmgroup.com/resources/library/blog/call-center-fcr-benchmark-2024-results-by-industry)\n- [Geckoboard: FCR Rate](https://www.geckoboard.com/best-practice/kpi-examples/first-contact-resolution-rate/)\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Resolution SLA Adherence","slug":"resolution-sla-adherence","definition":"Percentage of tickets resolved within SLA timeframe.","formulas":["Resolution SLA Adherence = Tickets meeting resolution target / Total tickets × 100"],"benchmarks":null,"insight":null,"commonMistakes":null,"sources":[],"department":"Support","category":"Resolution Metrics","aliases":[],"rawMarkdown":"### Resolution SLA Adherence\n\n**Definition:** Percentage of tickets resolved within SLA timeframe.\n\n**Formula:**\n```\nResolution SLA Adherence = Tickets meeting resolution target / Total tickets × 100\n```\n\n**Target:** >90%\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Reopen Rate","slug":"reopen-rate","definition":"Percentage of resolved tickets that are reopened.","formulas":["Reopen Rate = Tickets reopened / Tickets resolved × 100"],"benchmarks":"- Below 5%: Good\n- 5-10%: Acceptable\n- Above 10%: Investigate resolution quality","insight":"Resolution quality. High reopen rate means problems aren't actually being solved.","commonMistakes":null,"sources":[],"department":"Support","category":"Resolution Metrics","aliases":[],"rawMarkdown":"### Reopen Rate\n\n**Definition:** Percentage of resolved tickets that are reopened.\n\n**Formula:**\n```\nReopen Rate = Tickets reopened / Tickets resolved × 100\n```\n\n**Benchmarks:**\n- Below 5%: Good\n- 5-10%: Acceptable\n- Above 10%: Investigate resolution quality\n\n**What it tells you:** Resolution quality. High reopen rate means problems aren't actually being solved.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Customer Satisfaction Score (CSAT)","slug":"customer-satisfaction-score-csat","definition":"Customer rating of support interaction.","formulas":["CSAT = Positive responses / Total responses × 100"],"benchmarks":"- Below 70%: Poor, requires immediate attention\n- 70-80%: Below average (B2B SaaS average is ~68-78%)\n- 80-90%: Good\n- 90%+: Excellent\n- 95%+: World-class","insight":"Customer perception of support quality.","commonMistakes":["Low response rates (<10% makes data unreliable)","Survey fatigue","Not following up on negative feedback"],"sources":["Retently: CSAT Benchmarks 2025: https://www.retently.com/blog/customer-satisfaction-score-csat/","Fullview: CSAT Benchmarks by Industry: https://www.fullview.io/blog/csat-benchmarks-by-industry"],"department":"Support","category":"Quality Metrics","aliases":["CSAT"],"rawMarkdown":"### Customer Satisfaction Score (CSAT)\n\n**Definition:** Customer rating of support interaction.\n\n**Formula:**\n```\nCSAT = Positive responses / Total responses × 100\n```\n\nGASP uses a 5-point scale and counts the top two ratings (4 and 5) as positive.\n\n**Benchmarks:**\n- Below 70%: Poor, requires immediate attention\n- 70-80%: Below average (B2B SaaS average is ~68-78%)\n- 80-90%: Good\n- 90%+: Excellent\n- 95%+: World-class\n\n**By channel:**\n- Live chat: 87% average (highest)\n- Email: 61% average\n- Phone: 44% average\n\n**Segment variation:** Enterprise customers typically rate 72-75% (dedicated support), SMB customers 60-65%.\n\n**What it tells you:** Customer perception of support quality.\n\n**Common mistakes:**\n- Low response rates (<10% makes data unreliable)\n- Survey fatigue\n- Not following up on negative feedback\n\n**Sources:**\n- [Retently: CSAT Benchmarks 2025](https://www.retently.com/blog/customer-satisfaction-score-csat/)\n- [Fullview: CSAT Benchmarks by Industry](https://www.fullview.io/blog/csat-benchmarks-by-industry)\n\n---","signalType":"outcome","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Customer Effort Score (CES)","slug":"customer-effort-score-ces","definition":"How easy it was for the customer to get help.","formulas":["CES = Average rating on \"How easy was it to resolve your issue?\" (1-7 scale)","CES % = Respondents who agree it was easy / Total respondents × 100"],"benchmarks":"- Below 4: High effort, frustrating\n- 4-5: Moderate\n- 5-6: Good\n- Above 6: Easy, effortless","insight":"Support friction. Lower effort correlates with retention.","commonMistakes":null,"sources":["Gartner: Customer Effort Score: https://www.gartner.com/en/customer-service-support/insights/customer-effort-score","Userpilot: Customer Satisfaction Benchmarking: https://userpilot.com/blog/customer-satisfaction-benchmarking/"],"department":"Support","category":"Quality Metrics","aliases":["CES"],"rawMarkdown":"### Customer Effort Score (CES)\n\n**Definition:** How easy it was for the customer to get help.\n\n**Formula:**\n```\nCES = Average rating on \"How easy was it to resolve your issue?\" (1-7 scale)\n```\n\nOr as the percentage of respondents scoring 5 or above on the same 1-7 scale:\n```\nCES % = Respondents who agree it was easy / Total respondents × 100\n```\n\n**Benchmarks (1-7 scale):**\n- Below 4: High effort, frustrating\n- 4-5: Moderate\n- 5-6: Good\n- Above 6: Easy, effortless\n\n**Benchmarks (percentage):**\n- Below 70%: Needs improvement (per Gartner)\n- 70-90%: Good\n- Above 90%: Excellent, strong position\n\n**Why CES matters:** CES is 1.8x more effective than CSAT at predicting customer loyalty, so cutting friction does more for repeat business than raising satisfaction.\n\n**What it tells you:** Support friction. Lower effort correlates with retention.\n\n**Sources:**\n- [Gartner: Customer Effort Score](https://www.gartner.com/en/customer-service-support/insights/customer-effort-score)\n- [Userpilot: Customer Satisfaction Benchmarking](https://userpilot.com/blog/customer-satisfaction-benchmarking/)\n\n---","signalType":"leading","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Ticket Escalation Rate","slug":"ticket-escalation-rate","definition":"Percentage of tickets escalated to higher tier or engineering.","formulas":["Ticket Escalation Rate = Escalated tickets / Total tickets × 100"],"benchmarks":"- Below 5%: Well-handled at Tier 1\n- 5-15%: Normal\n- Above 15%: May indicate training gaps or product issues","insight":"Issue complexity and Tier 1 capability.","commonMistakes":null,"sources":[],"department":"Support","category":"Quality Metrics","aliases":[],"rawMarkdown":"### Ticket Escalation Rate\n\n**Definition:** Percentage of tickets escalated to higher tier or engineering.\n\n**Formula:**\n```\nTicket Escalation Rate = Escalated tickets / Total tickets × 100\n```\n\n**Benchmarks:**\n- Below 5%: Well-handled at Tier 1\n- 5-15%: Normal\n- Above 15%: May indicate training gaps or product issues\n\n**What it tells you:** Issue complexity and Tier 1 capability.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Tickets per Agent","slug":"tickets-per-agent","definition":"Average tickets handled per support agent.","formulas":["Tickets per Agent = Total tickets handled / Number of agents"],"benchmarks":"- Chat: 300-500/month\n- Email: 400-600/month\n- Phone: 200-400/month","insight":"Agent productivity and capacity planning.","commonMistakes":null,"sources":[],"department":"Support","category":"Efficiency Metrics","aliases":[],"rawMarkdown":"### Tickets per Agent\n\n**Definition:** Average tickets handled per support agent.\n\n**Formula:**\n```\nTickets per Agent = Total tickets handled / Number of agents\n```\n\n**Benchmarks:**\n- Chat: 300-500/month\n- Email: 400-600/month\n- Phone: 200-400/month\n\n**What it tells you:** Agent productivity and capacity planning.\n\n---","signalType":"operational","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Cost per Ticket","slug":"cost-per-ticket","definition":"Total support cost divided by tickets resolved.","formulas":["Cost per Ticket = Total support team cost / Total tickets resolved"],"benchmarks":"- Chat: $3-8\n- Email: $5-15\n- Phone: $10-25","insight":"Support efficiency. It should fall over time.","commonMistakes":null,"sources":[],"department":"Support","category":"Efficiency Metrics","aliases":[],"rawMarkdown":"### Cost per Ticket\n\n**Definition:** Total support cost divided by tickets resolved.\n\n**Formula:**\n```\nCost per Ticket = Total support team cost / Total tickets resolved\n```\n\n**Benchmarks:**\n- Chat: $3-8\n- Email: $5-15\n- Phone: $10-25\n\n**What it tells you:** Support efficiency. It should fall over time.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null},{"name":"Self-Service Rate (Ticket Deflection)","slug":"self-service-rate-ticket-deflection","definition":"Percentage of support needs resolved through self-service.","formulas":["Self-Service Rate = Self-service resolutions / (Self-service + Tickets) × 100"],"benchmarks":"- Below 20%: Low self-service adoption\n- 20-40%: Moderate\n- 40-60%: Good\n- Above 60%: Excellent","insight":"Documentation and tooling effectiveness.","commonMistakes":null,"sources":[],"department":"Support","category":"Efficiency Metrics","aliases":[],"rawMarkdown":"### Self-Service Rate (Ticket Deflection)\n\n**Definition:** Percentage of support needs resolved through self-service.\n\n**Formula:**\n```\nSelf-Service Rate = Self-service resolutions / (Self-service + Tickets) × 100\n```\n\nSelf-service resolutions are deflections: help center or chatbot sessions that ended without a ticket. Raw help center views overstate the rate.\n\n**Benchmarks:**\n- Below 20%: Low self-service adoption\n- 20-40%: Moderate\n- 40-60%: Good\n- Above 60%: Excellent\n\n**What it tells you:** Documentation and tooling effectiveness.\n\n---","signalType":"efficiency","signalTypeSecondary":null,"dualLens":null,"dualLensNote":null}],"definitions":[{"term":"Customer (Account, Organization)","slug":"customer-account-organization","definition":"A distinct billing entity with one or more subscriptions. The \"who\" of your business relationship.","section":"Foundational Entities","canonicalLink":null,"referenceLink":null,"body":"- **Attributes:** Legal entity, billing contact, payment methods, contract terms\n- **Key metrics at this level:** Logo Churn Rate, LTV, ARPA, NPS\n- **Industry equivalents:** Account (Stripe, Zuora, Salesforce), Organization (many B2B tools)","usedIn":[]},{"term":"Subscription (Contract, Agreement)","slug":"subscription-contract-agreement","definition":"A billable agreement between a customer and your product, with defined terms, pricing and status. The \"what and when\" of the relationship.","section":"Foundational Entities","canonicalLink":null,"referenceLink":null,"body":"- **Attributes:** Plan/tier, term (monthly/annual/multi-year), status, billing schedule\n- **Key metrics at this level:** MRR, ARR, Churned MRR, Revenue Churn Rate\n- **Industry equivalents:** Subscription (Stripe, Chargebee), Contract (Salesforce CPQ)","usedIn":[]},{"term":"License (Entitlement, Access, Quota)","slug":"license-entitlement-access-quota","definition":"A specific capability, quantity or configuration granted by a subscription. The \"how much\" of the relationship.","section":"Foundational Entities","canonicalLink":null,"referenceLink":null,"body":"- **Types:**\n  - **Feature Gates.** Binary access (on/off): SSO, API access, advanced analytics\n  - **Quantity Limits.** Numeric caps: seats, storage, API calls\n  - **Configuration.** Behavioral parameters: data retention, SLA tier\n- **Key metrics at this level:** License Utilization, Feature Adoption Rate, Core Feature Adoption\n- **Industry equivalents:** Entitlements (Stripe), Licenses (Salesforce, Microsoft), Rate Plan Charges (Zuora)","usedIn":[]},{"term":"Hierarchy Principles","slug":"hierarchy-principles","definition":"1. **Customers own subscriptions, not the reverse.** A customer churns when *all* their subscriptions end.","section":"Foundational Entities","canonicalLink":null,"referenceLink":null,"body":"2. **MRR lives at the subscription level.** Expansion and contraction are measured by subscription changes.\n3. **Licenses are derived from subscriptions.** The subscription is the source of truth; licenses are computed.\n4. **Metrics must specify their level.** \"Churn rate\" is ambiguous. Specify logo churn (customer), MRR churn (subscription) or seat churn (license).","usedIn":[]},{"term":"MRR (Monthly Recurring Revenue)","slug":"mrr-monthly-recurring-revenue","definition":"The total predictable revenue from active subscriptions, normalized to a monthly value.","section":"Revenue Terms","canonicalLink":"metrics/core.md#mrr-monthly-recurring-revenue","referenceLink":null,"body":null,"usedIn":["Core","Finance","Customer Success"]},{"term":"ARR (Annual Recurring Revenue)","slug":"arr-annual-recurring-revenue","definition":"MRR × 12. The annualized value of recurring revenue.","section":"Revenue Terms","canonicalLink":"metrics/core.md#arr-annual-recurring-revenue","referenceLink":null,"body":null,"usedIn":["Core","Finance","Sales","Customer Success","People"]},{"term":"New MRR","slug":"new-mrr","definition":"MRR added from newly acquired customers in the period.","section":"Revenue Terms","canonicalLink":"metrics/core.md#new-mrr","referenceLink":null,"body":null,"usedIn":["Core","Sales"]},{"term":"Expansion MRR","slug":"expansion-mrr","definition":"Additional MRR from existing customers (upgrades, add-ons, seat increases).","section":"Revenue Terms","canonicalLink":"metrics/core.md#expansion-mrr","referenceLink":null,"body":null,"usedIn":["Core","Customer Success"]},{"term":"Churned MRR","slug":"churned-mrr","definition":"MRR lost from customers who cancelled.","section":"Revenue Terms","canonicalLink":"metrics/core.md#churned-mrr","referenceLink":null,"body":null,"usedIn":["Core","Customer Success"]},{"term":"Contraction MRR","slug":"contraction-mrr","definition":"MRR reduction from existing customers who downgraded (but didn't churn).","section":"Revenue Terms","canonicalLink":"metrics/core.md#contraction-mrr","referenceLink":null,"body":null,"usedIn":["Core","Customer Success"]},{"term":"Carry MRR","slug":"carry-mrr","definition":"MRR from existing customers that renewed unchanged. No expansion, contraction or churn.","section":"Revenue Terms","canonicalLink":"metrics/core.md#carry-mrr","referenceLink":null,"body":"- **Formula:** Beginning MRR − Churned MRR − Contraction MRR","usedIn":["Core"]},{"term":"Net New MRR","slug":"net-new-mrr","definition":"The net change in MRR after all movements.","section":"Revenue Terms","canonicalLink":"metrics/core.md#net-new-mrr","referenceLink":null,"body":"- **Formula:** New MRR + Expansion MRR + Reactivation MRR - Churned MRR - Contraction MRR","usedIn":["Core"]},{"term":"Revenue (GAAP)","slug":"revenue-gaap","definition":"Recognized revenue according to ASC 606 accounting standards.","section":"Revenue Terms","canonicalLink":"metrics/finance.md#revenue-gaap","referenceLink":null,"body":null,"usedIn":["Finance","RevOps"]},{"term":"Bookings","slug":"bookings","definition":"Total contract value signed in a period.","section":"Revenue Terms","canonicalLink":"metrics/finance.md#bookings","referenceLink":null,"body":null,"usedIn":["Finance","Sales"]},{"term":"ACV (Annual Contract Value)","slug":"acv-annual-contract-value","definition":"The annualized value of a contract, normalizing multi-year deals to a single year. When aggregated, represents average deal size on an annual basis.","section":"Revenue Terms","canonicalLink":"metrics/sales.md#acv-annual-contract-value","referenceLink":null,"body":null,"usedIn":["Sales","Finance"]},{"term":"ARPA (Average Revenue Per Account)","slug":"arpa-average-revenue-per-account","definition":"Average monthly recurring revenue per customer account.","section":"Revenue Terms","canonicalLink":"metrics/core.md#arpa-average-revenue-per-account","referenceLink":null,"body":"- **Formula:** MRR / Active Customers","usedIn":["Core (LTV","CAC Payback)","Finance"]},{"term":"Consumption Revenue","slug":"consumption-revenue","definition":"Revenue earned as customers use the product: consumption drawn from a prepaid balance, billed as overage above a commitment or billed on demand with no commitment.","section":"Revenue Terms","canonicalLink":"metrics/finance.md#consumption-revenue","referenceLink":null,"body":null,"usedIn":["Finance"]},{"term":"Usage Run-Rate (Usage ARR)","slug":"usage-run-rate-usage-arr","definition":"On-demand consumption revenue over the trailing three months, annualised. Added to ARR it gives ARR Including Usage Run-Rate without counting any usage twice.","section":"Revenue Terms","canonicalLink":"metrics/finance.md#usage-run-rate","referenceLink":null,"body":null,"usedIn":["Finance"]},{"term":"Prepaid Credit Balance (Remaining Commitment)","slug":"prepaid-credit-balance-remaining-commitment","definition":"The prepaid commitment customers have paid for and not yet consumed or forfeited: the part of the deferred revenue balance that is prepaid consumption.","section":"Revenue Terms","canonicalLink":"metrics/finance.md#prepaid-credit-balance","referenceLink":null,"body":null,"usedIn":["Finance"]},{"term":"Credit Breakage","slug":"credit-breakage","definition":"The prepaid balance forfeited at expiry in a period. The commercial fact behind breakage revenue, which the accounting standards recognise on their own timing.","section":"Revenue Terms","canonicalLink":"metrics/finance.md#credit-breakage","referenceLink":null,"body":null,"usedIn":["Finance"]},{"term":"NRR (Net Revenue Retention)","slug":"nrr-net-revenue-retention","definition":"Percentage of revenue retained from existing customers over a period, including expansion, contraction and churn. Two methods are widely used: cohort method (preferred) and formula method. Recommended: trailing 12 months, annualized if using shorter periods.","section":"Retention Terms","canonicalLink":"metrics/core.md#net-revenue-retention-nrr","referenceLink":null,"body":"- **Adjusted variant:** Filter CEL events by [`change_nature`](cel.md#change-nature) to compute Adjusted NRR excluding temporary revenue movements.","usedIn":["Core","Customer Success"]},{"term":"GRR (Gross Revenue Retention)","slug":"grr-gross-revenue-retention","definition":"Percentage of revenue retained from existing customers, excluding expansion. Cannot exceed 100%. Two methods are widely used: cohort method (preferred) and formula method.","section":"Retention Terms","canonicalLink":"metrics/core.md#gross-revenue-retention-grr","referenceLink":null,"body":"- **Adjusted variant:** Filter CEL events by [`change_nature`](cel.md#change-nature) to compute Adjusted GRR excluding temporary revenue movements.","usedIn":["Core","Customer Success"]},{"term":"Logo Churn Rate","slug":"logo-churn-rate","definition":"Percentage of customers lost in a period.","section":"Retention Terms","canonicalLink":"metrics/core.md#logo-churn-rate-customer-churn","referenceLink":null,"body":null,"usedIn":["Core","Customer Success"]},{"term":"Revenue Churn Rate","slug":"revenue-churn-rate","definition":"Percentage of MRR lost to churn and contraction in a period. Gross (losses only, not netted against expansion).","section":"Retention Terms","canonicalLink":"metrics/core.md#revenue-churn-rate","referenceLink":null,"body":"- **Formula:** (Churned MRR + Contraction MRR) / Beginning MRR × 100","usedIn":["Core"]},{"term":"Renewal Rate","slug":"renewal-rate","definition":"Percentage of contracts renewed at term.","section":"Retention Terms","canonicalLink":"metrics/customer-success.md#renewal-rate","referenceLink":null,"body":null,"usedIn":["Customer Success","RevOps"]},{"term":"Consumption Net Revenue Retention","slug":"consumption-net-revenue-retention","definition":"The consumption revenue of the customers active at period start over twelve months, divided by the same customers' consumption revenue over the twelve months before. A second basis beside NRR, reported as Consumption NRR rather than as NRR.","section":"Retention Terms","canonicalLink":"metrics/finance.md#consumption-net-revenue-retention","referenceLink":null,"body":null,"usedIn":["Finance"]},{"term":"CAC (Customer Acquisition Cost)","slug":"cac-customer-acquisition-cost","definition":"Total cost to acquire a new customer.","section":"Efficiency Terms","canonicalLink":"metrics/core.md#cac-customer-acquisition-cost","referenceLink":null,"body":null,"usedIn":["Core","Marketing","Finance"]},{"term":"Marketing CAC","slug":"marketing-cac","definition":"Marketing-only portion of CAC (excludes sales costs).","section":"Efficiency Terms","canonicalLink":"metrics/marketing.md#marketing-cac","referenceLink":null,"body":null,"usedIn":["Marketing"]},{"term":"LTV (Customer Lifetime Value)","slug":"ltv-customer-lifetime-value","definition":"Total profit expected from a customer over their lifetime. Calculated with gross margin.","section":"Efficiency Terms","canonicalLink":"metrics/core.md#ltv-customer-lifetime-value","referenceLink":null,"body":"- **Formula:** (ARPA × Gross Margin) / Revenue Churn Rate","usedIn":["Core","Finance"]},{"term":"LTV:CAC Ratio","slug":"ltvcac-ratio","definition":"Ratio of customer lifetime value to acquisition cost.","section":"Efficiency Terms","canonicalLink":"metrics/core.md#ltvcac-ratio","referenceLink":null,"body":null,"usedIn":["Core","Finance"]},{"term":"CAC Payback Period","slug":"cac-payback-period","definition":"Time required to recover customer acquisition cost.","section":"Efficiency Terms","canonicalLink":"metrics/core.md#cac-payback-period","referenceLink":null,"body":null,"usedIn":["Core","Finance"]},{"term":"Gross Margin","slug":"gross-margin","definition":"Revenue minus cost of goods sold, as percentage of revenue.","section":"Efficiency Terms","canonicalLink":"metrics/core.md#gross-margin","referenceLink":null,"body":null,"usedIn":["Core","Finance"]},{"term":"Rule of 40","slug":"rule-of-40","definition":"ARR Growth Rate (YoY %) + EBITDA Margin (%).","section":"Efficiency Terms","canonicalLink":"metrics/core.md#rule-of-40","referenceLink":null,"body":null,"usedIn":["Core","Finance"]},{"term":"Magic Number","slug":"magic-number","definition":"Sales efficiency metric: QoQ ARR growth divided by prior quarter S&M spend.","section":"Efficiency Terms","canonicalLink":"metrics/finance.md#magic-number","referenceLink":null,"body":null,"usedIn":["Finance"]},{"term":"Burn Multiple","slug":"burn-multiple","definition":"Capital efficiency metric: Net burn divided by net new ARR. Popularized by David Sacks.","section":"Efficiency Terms","canonicalLink":"metrics/finance.md#burn-multiple","referenceLink":null,"body":null,"usedIn":["Finance"]},{"term":"Customer","slug":"customer","definition":"An entity (company/account) with a paid subscription.","section":"Customer Terms","canonicalLink":null,"referenceLink":null,"body":"- **Not:** Trial users, free tier users\n- **Counting:** One customer = one billing entity, regardless of users\n- **In formulas:** Unless otherwise specified, \"Customers\" means Active Customers","usedIn":[]},{"term":"Active Customer","slug":"active-customer","definition":"A customer in good standing at a point in time.","section":"Customer Terms","canonicalLink":null,"referenceLink":null,"body":"- **Criteria:** Not churned, not suspended, payment current\n- **Used for:** MRR counts, ARPA calculations, denominator in retention metrics","usedIn":[]},{"term":"User","slug":"user","definition":"An individual person using the product within a customer account.","section":"Customer Terms","canonicalLink":null,"referenceLink":null,"body":"- **Distinct from:** Customer (account level)","usedIn":[]},{"term":"Trial","slug":"trial","definition":"An account evaluating the product for free for a set period before it decides to pay.","section":"Customer Terms","canonicalLink":"metrics/product.md#trial-to-paid-conversion-rate","referenceLink":null,"body":"- **Outcomes:** converted (became a customer), expired (the period ended), cancelled (closed early)\n- **Not:** A customer, until it converts; a proof of concept run by sales, which is an opportunity stage","usedIn":[]},{"term":"Active User","slug":"active-user","definition":"A user who performed a qualifying action in the defined period.","section":"Customer Terms","canonicalLink":"metrics/product.md#daily-active-users-dau","referenceLink":null,"body":"- **Qualifying action:** Defined per product; must be intentional engagement","usedIn":[]},{"term":"Lead","slug":"lead","definition":"A contact who has expressed interest (form fill, signup, etc.).","section":"Customer Terms","canonicalLink":"metrics/marketing.md#leads","referenceLink":null,"body":null,"usedIn":[]},{"term":"MQL (Marketing Qualified Lead)","slug":"mql-marketing-qualified-lead","definition":"A lead meeting criteria indicating sales-readiness.","section":"Customer Terms","canonicalLink":"metrics/marketing.md#marketing-qualified-leads-mqls","referenceLink":null,"body":null,"usedIn":[]},{"term":"SQL (Sales Qualified Lead)","slug":"sql-sales-qualified-lead","definition":"An MQL accepted by sales as worth pursuing.","section":"Customer Terms","canonicalLink":"metrics/marketing.md#sales-qualified-leads-sqls","referenceLink":null,"body":null,"usedIn":[]},{"term":"Opportunity","slug":"opportunity","definition":"A qualified sales prospect in the pipeline.","section":"Customer Terms","canonicalLink":null,"referenceLink":null,"body":"- **Distinct from:** Lead, MQL, SQL (earlier funnel stages)","usedIn":[]},{"term":"NPS (Net Promoter Score)","slug":"nps-net-promoter-score","definition":"% Promoters (9-10 rating) minus % Detractors (0-6 rating).","section":"Satisfaction Terms","canonicalLink":"metrics/core.md#nps-net-promoter-score","referenceLink":null,"body":"- **Note:** Same formula everywhere, but measured for different populations (customers, project completions, partners)","usedIn":["Core","Onboarding","Partnerships","Professional Services"]},{"term":"CSAT (Customer Satisfaction Score)","slug":"csat-customer-satisfaction-score","definition":"Percentage of positive ratings on satisfaction survey.","section":"Satisfaction Terms","canonicalLink":"metrics/support.md#customer-satisfaction-score-csat","referenceLink":null,"body":"- **Note:** Same formula, different contexts (ticket, relationship, project)","usedIn":["Support","Customer Success","Onboarding","Professional Services"]},{"term":"CES (Customer Effort Score)","slug":"ces-customer-effort-score","definition":"Average rating on ease of experience (typically 1-7 scale).","section":"Satisfaction Terms","canonicalLink":"metrics/support.md#customer-effort-score-ces","referenceLink":null,"body":null,"usedIn":["Support"]},{"term":"Health Score","slug":"health-score","definition":"Composite score predicting likelihood of retention or churn.","section":"Satisfaction Terms","canonicalLink":"metrics/customer-success.md#customer-health-score","referenceLink":null,"body":null,"usedIn":["Customer Success","Product"]},{"term":"Period","slug":"period","definition":"A defined time interval for measurement. Always specify:","section":"Time Terms","canonicalLink":null,"referenceLink":null,"body":"- Daily\n- Weekly\n- Monthly (calendar month)\n- Quarterly (calendar quarter)\n- Annual (trailing 12 months or calendar year; specify which)","usedIn":[]},{"term":"Cohort","slug":"cohort","definition":"A group of customers/users defined by a shared characteristic, typically signup date.","section":"Time Terms","canonicalLink":null,"referenceLink":null,"body":"- Example: \"January 2026 cohort\" = customers who signed up in January 2026","usedIn":[]},{"term":"Trailing / Rolling","slug":"trailing-rolling","definition":"A period ending at the current date.","section":"Time Terms","canonicalLink":null,"referenceLink":null,"body":"- Example: \"Trailing 12 months\" = past 365 days from today","usedIn":[]},{"term":"YoY (Year over Year)","slug":"yoy-year-over-year","definition":"Comparison to same period in prior year.","section":"Time Terms","canonicalLink":null,"referenceLink":null,"body":"- Example: \"Q1 2026 vs Q1 2025\"","usedIn":[]},{"term":"MoM (Month over Month)","slug":"mom-month-over-month","definition":"Comparison to prior month.","section":"Time Terms","canonicalLink":null,"referenceLink":null,"body":null,"usedIn":[]},{"term":"QoQ (Quarter over Quarter)","slug":"qoq-quarter-over-quarter","definition":"Comparison to prior quarter.","section":"Time Terms","canonicalLink":null,"referenceLink":null,"body":null,"usedIn":[]},{"term":"COGS (Cost of Goods Sold)","slug":"cogs-cost-of-goods-sold","definition":"Direct costs to deliver the product/service.","section":"Financial Terms","canonicalLink":null,"referenceLink":null,"body":"- **SaaS COGS includes:** Hosting, compute, payment processing and third-party service costs (the ATL `infrastructure` cost function)\n- **SaaS COGS excludes:** Sales, marketing, R&D, G&A\n- **Support and success cost:** Outside COGS in Gross Margin. Contribution margin, the Operating form of Gross Margin (GM-O), subtracts it","usedIn":[]},{"term":"Operating Expenses (Opex)","slug":"operating-expenses-opex","definition":"Costs of running the business (excluding COGS).","section":"Financial Terms","canonicalLink":null,"referenceLink":null,"body":"- **Categories:** S&M, R&D, G&A","usedIn":[]},{"term":"EBITDA","slug":"ebitda","definition":"Earnings before interest, taxes, depreciation and amortization.","section":"Financial Terms","canonicalLink":null,"referenceLink":null,"body":"- **Formula:** Net income + Interest + Taxes + Depreciation + Amortization","usedIn":[]},{"term":"Burn Rate","slug":"burn-rate","definition":"Net cash consumed per month.","section":"Financial Terms","canonicalLink":"metrics/finance.md#cash-burn-rate","referenceLink":null,"body":null,"usedIn":[]},{"term":"Runway","slug":"runway","definition":"Months until cash runs out at current burn rate.","section":"Financial Terms","canonicalLink":"metrics/finance.md#cash-runway","referenceLink":null,"body":null,"usedIn":[]},{"term":"DSO (Days Sales Outstanding)","slug":"dso-days-sales-outstanding","definition":"Average days to collect payment after invoicing.","section":"Financial Terms","canonicalLink":"metrics/revops.md#days-sales-outstanding-dso","referenceLink":null,"body":null,"usedIn":["RevOps","Finance (same definition)"]},{"term":"Bad Debt Rate","slug":"bad-debt-rate","definition":"Percentage of revenue written off as uncollectable.","section":"Financial Terms","canonicalLink":"metrics/finance.md#bad-debt-rate","referenceLink":null,"body":null,"usedIn":["Finance","RevOps (same definition)"]},{"term":"Uptime / Availability","slug":"uptime-availability","definition":"Percentage of time service is operational.","section":"Reliability Terms","canonicalLink":"metrics/engineering.md#uptime-availability","referenceLink":null,"body":null,"usedIn":[]},{"term":"SLA (Service Level Agreement)","slug":"sla-service-level-agreement","definition":"Contractual commitment for service levels (uptime, response time, etc.).","section":"Reliability Terms","canonicalLink":null,"referenceLink":null,"body":null,"usedIn":[]},{"term":"Incident","slug":"incident","definition":"An unplanned interruption or degradation of service.","section":"Reliability Terms","canonicalLink":null,"referenceLink":null,"body":"- **Severity levels:** SEV1 (critical), SEV2 (major), SEV3 (minor)","usedIn":[]},{"term":"MTTR (Mean Time to Resolve/Recover)","slug":"mttr-mean-time-to-resolverecover","definition":"Average time from incident start to resolution.","section":"Reliability Terms","canonicalLink":"metrics/engineering.md#mean-time-to-resolve-mttr","referenceLink":null,"body":"- **Note:** DORA uses \"Mean Time to Recovery\" for the same concept","usedIn":[]},{"term":"Error Rate","slug":"error-rate","definition":"Percentage of requests resulting in errors.","section":"Reliability Terms","canonicalLink":"metrics/engineering.md#error-rate","referenceLink":null,"body":"- **Product variant:** User-facing error rate (per user action)","usedIn":[]},{"term":"Pipeline","slug":"pipeline","definition":"Total value of active sales opportunities.","section":"Pipeline Terms","canonicalLink":"metrics/sales.md#pipeline-value","referenceLink":null,"body":null,"usedIn":[]},{"term":"Pipeline Coverage","slug":"pipeline-coverage","definition":"Ratio of unweighted pipeline value to quota.","section":"Pipeline Terms","canonicalLink":"metrics/sales.md#pipeline-coverage-ratio","referenceLink":null,"body":null,"usedIn":[]},{"term":"Win Rate","slug":"win-rate","definition":"Percentage of opportunities closed as won.","section":"Pipeline Terms","canonicalLink":"metrics/sales.md#win-rate","referenceLink":null,"body":null,"usedIn":["Sales","Partnerships (partner win rate)"]},{"term":"Sales Cycle","slug":"sales-cycle","definition":"Time from opportunity creation to close.","section":"Pipeline Terms","canonicalLink":"metrics/sales.md#sales-cycle-length","referenceLink":null,"body":null,"usedIn":[]},{"term":"Session","slug":"session","definition":"A period of continuous user activity in the product.","section":"Engagement Terms","canonicalLink":null,"referenceLink":null,"body":"- **Ends:** After defined inactivity period (typically 30 minutes)","usedIn":[]},{"term":"DAU / WAU / MAU","slug":"dau-wau-mau","definition":"Daily / Weekly / Monthly Active Users.","section":"Engagement Terms","canonicalLink":"metrics/product.md","referenceLink":null,"body":null,"usedIn":[]},{"term":"Stickiness","slug":"stickiness","definition":"DAU/MAU ratio: how often users return.","section":"Engagement Terms","canonicalLink":"metrics/product.md#daumau-ratio-stickiness","referenceLink":null,"body":null,"usedIn":[]},{"term":"Feature Adoption","slug":"feature-adoption","definition":"Percentage of users using a specific feature.","section":"Engagement Terms","canonicalLink":"metrics/product.md#feature-adoption-rate","referenceLink":null,"body":null,"usedIn":[]},{"term":"Activation","slug":"activation","definition":"Moment when new user experiences core product value.","section":"Engagement Terms","canonicalLink":null,"referenceLink":null,"body":"- **Definition:** Product-specific, must be explicitly defined\n- **Canonical framework:** [Product Metrics](metrics/product.md#activation-rate)","usedIn":[]},{"term":"TTFV (Time to First Value)","slug":"ttfv-time-to-first-value","definition":"Time from contract start to achieving first meaningful value.","section":"Time-Based Metrics","canonicalLink":"metrics/onboarding.md#time-to-first-value-ttfv","referenceLink":null,"body":null,"usedIn":[]},{"term":"FRT (First Response Time)","slug":"frt-first-response-time","definition":"Time from ticket/request to first human response.","section":"Time-Based Metrics","canonicalLink":"metrics/support.md#first-response-time-frt","referenceLink":null,"body":null,"usedIn":[]},{"term":"Resolution Time","slug":"resolution-time","definition":"Time from request to final resolution.","section":"Time-Based Metrics","canonicalLink":"metrics/support.md#resolution-time-time-to-resolution","referenceLink":null,"body":null,"usedIn":[]},{"term":"Lead Time for Changes","slug":"lead-time-for-changes","definition":"Time from code commit to production deployment.","section":"Time-Based Metrics","canonicalLink":"metrics/engineering.md#lead-time-for-changes","referenceLink":null,"body":null,"usedIn":[]},{"term":"Point-in-Time vs Period","slug":"point-in-time-vs-period","definition":"- **Point-in-time:** Value at a specific moment (e.g., \"Customers as of Dec 31\")","section":"Counting Conventions","canonicalLink":null,"referenceLink":null,"body":"- **Period:** Activity during an interval (e.g., \"Customers acquired in Q4\")","usedIn":[]},{"term":"Beginning vs Ending","slug":"beginning-vs-ending","definition":"- **Beginning of period:** Value at start (for retention calculations)","section":"Counting Conventions","canonicalLink":null,"referenceLink":null,"body":"- **End of period:** Value at end (for current state)","usedIn":[]},{"term":"Unique vs Total","slug":"unique-vs-total","definition":"- **Unique:** Deduplicated count (e.g., unique users)","section":"Counting Conventions","canonicalLink":null,"referenceLink":null,"body":"- **Total:** All occurrences (e.g., total sessions)","usedIn":[]},{"term":"Revenue Metrics","slug":"revenue-metrics","definition":"| Metric | Typical Period | Notes |","section":"Measurement Period Conventions","canonicalLink":null,"referenceLink":null,"body":"|--------|---------------|-------|\n| MRR | Monthly | Point-in-time, end of month |\n| ARR | Monthly | MRR × 12, point-in-time |\n| MRR Growth Rate | Monthly | Month-over-month comparison |\n| New/Expansion/Churned/Contraction MRR | Monthly | Activity during the month |","usedIn":[]},{"term":"Retention Metrics","slug":"retention-metrics","definition":"| Metric | Typical Period | Notes |","section":"Measurement Period Conventions","canonicalLink":null,"referenceLink":null,"body":"|--------|---------------|-------|\n| NRR | Annual (trailing 12 months) | Monthly for operational tracking; annualize if using shorter periods |\n| GRR | Annual (trailing 12 months) | Same as NRR |\n| Logo Churn Rate | Monthly or Annual | Always specify which; monthly × 12 ≠ annual |\n| Revenue Churn Rate | Monthly | Annualize for comparison: (1 - monthly rate)^12 |","usedIn":[]},{"term":"Efficiency Metrics","slug":"efficiency-metrics","definition":"| Metric | Typical Period | Notes |","section":"Measurement Period Conventions","canonicalLink":null,"referenceLink":null,"body":"|--------|---------------|-------|\n| CAC | Quarterly | Lag 1-2 months for long sales cycles |\n| LTV | N/A | Lifetime calculation, not periodic |\n| CAC Payback | Quarterly | Result in months |\n| Gross Margin | Monthly or Quarterly | Aligns with financial reporting |\n| Rule of 40 | Annual | YoY growth + trailing margin |","usedIn":[]},{"term":"Engagement Metrics","slug":"engagement-metrics","definition":"| Metric | Typical Period | Notes |","section":"Measurement Period Conventions","canonicalLink":null,"referenceLink":null,"body":"|--------|---------------|-------|\n| DAU/WAU/MAU | Daily/Weekly/Monthly | Rolling windows |\n| NPS | Quarterly or Annual | Avoid survey fatigue |","usedIn":[]},{"term":"CEL (Commercial Event Ledger)","slug":"cel-commercial-event-ledger","definition":"The atomic, immutable event layer from which the GASP revenue, retention and cost metrics derive. If a commercial event is not in the CEL, it does not exist for metric purposes. Operational metrics read the other datasets in the ontology.","section":"GASP Framework Terms","canonicalLink":"cel.md#commercial-event-ledger-cel","referenceLink":null,"body":null,"usedIn":["All revenue","retention and cost metrics"]},{"term":"ATL (Attribution Taxonomy Layer)","slug":"atl-attribution-taxonomy-layer","definition":"The tagging layer that classifies CEL events by lifecycle stage, expansion type and cost function. ATL tags let each dual-lens metric compute its Operating form and its Market form from the same events.","section":"GASP Framework Terms","canonicalLink":"atl.md#attribution-taxonomy-layer-atl","referenceLink":null,"body":null,"usedIn":["Core metrics with dual-lens forms (ARR","NRR","CAC","LTV","LTV:CAC","CAC Payback","Gross Margin","Churn)"]},{"term":"Adapter","slug":"adapter","definition":"The JSON mapping file that connects GASP's canonical vocabulary to your warehouse: a table for each GASP dataset you have, a column (`schema.table.column`) for each field and optional owners for field data and metric definitions. The adapter is the only file a consuming organization writes.","section":"GASP Framework Terms","canonicalLink":null,"referenceLink":"/v1/adapter","body":null,"usedIn":[]},{"term":"Digital Twin","slug":"digital-twin","definition":"The combination of the GASP standard (metrics, relationships, ontology), your adapter (warehouse mapping) and an MCP server (agent access layer). Together they form a read-only semantic model of how a SaaS business operates. Agents query the twin instead of the source systems.","section":"GASP Framework Terms","canonicalLink":null,"referenceLink":"/v1/digital-twin","body":null,"usedIn":[]},{"term":"Ontology","slug":"ontology","definition":"The structured representation of GASP's entities, concepts, fields, datasets, source categories, temporal semantics and validation rules. The ontology sits below the metric layer and provides the canonical vocabulary that adapters, queries and agents reference.","section":"GASP Framework Terms","canonicalLink":null,"referenceLink":null,"body":null,"usedIn":[]},{"term":"Signal Type","slug":"signal-type","definition":"A classification that describes what kind of signal a metric provides. Every GASP metric has exactly one primary signal type; some carry a secondary.","section":"GASP Framework Terms","canonicalLink":null,"referenceLink":"/v1/taxonomy","body":"- **Outcome.** A result that matters on its own (ARR, NRR, Gross Margin).\n- **Leading.** Predicts a future outcome (Pipeline Value, Health Score, NPS).\n- **Efficiency.** A ratio measuring productivity (CAC Payback, LTV:CAC, Magic Number).\n- **Operational.** Operational health or throughput (Uptime, MTTR, Ticket Volume).","usedIn":[]},{"term":"Sensitivity Tier","slug":"sensitivity-tier","definition":"GASP's recommended data sensitivity classification for each metric. Aligns with ISO 27001 and OSSA `data_classification` conventions.","section":"GASP Framework Terms","canonicalLink":null,"referenceLink":"/v1/governance#sensitivity-tier","body":"- **`public`.** Shareable externally with no restriction (rare for internal SaaS metrics).\n- **`internal`.** Shareable across the organization. Default for most operational metrics.\n- **`confidential`.** Cross-functional but sensitive. Typically restricted to managers and above.\n- **`restricted`.** Highly sensitive. Executive and finance-leadership only by default.","usedIn":[]},{"term":"Access Scope","slug":"access-scope","definition":"GASP's recommended filtering pattern for each metric. Describes whether the metric is naturally filterable by user context.","section":"GASP Framework Terms","canonicalLink":null,"referenceLink":"/v1/governance#access-scope","body":"- **`unscoped`.** Same value for everyone with access (e.g. company-wide ARR).\n- **`department-scoped`.** Filtered by the viewer's department context.\n- **`owner-scoped`.** Visible only for records the viewer owns or manages. Interpretation (individual, team, territory, book, segment) lives in the adapter.","usedIn":[]},{"term":"Change Nature","slug":"change-nature","definition":"Optional CEL field that captures the intent behind a revenue movement. Does not alter metric calculations. Enables downstream analysis of revenue quality (e.g. Adjusted NRR).","section":"GASP Framework Terms","canonicalLink":null,"referenceLink":"/v1/cel#change-nature","body":"- **`permanent`.** Durable shift in the customer relationship (default when omitted).\n- **`temporary`.** Expected to reverse within a defined period.\n- **`scheduled_reversal`.** Reverses a prior `temporary` event.","usedIn":[]},{"term":"Segment","slug":"segment","definition":"The customer classification by size, vertical or fit (SMB, Mid-Market, Enterprise or the organisation's own scheme), recorded in the `segment` field. Revenue, contract and amendment events carry the segment as of the event; the customer and subscription snapshots carry it as of the snapshot. Segment is a dimension for slicing metrics rather than an ATL tag. Pricing tier lives on the plan.","section":"GASP Framework Terms","canonicalLink":"cel.md#segment-on-events","referenceLink":null,"body":null,"usedIn":["Named `by_segment` breakdowns of MRR","ARR","NRR","GRR","the churn and movement metrics","ARPA and Health Score"]},{"term":"Structured Formula","slug":"structured-formula","definition":"A decomposed representation of a metric's canonical formula, derived from formulas.json: explicit references to other metric nodes (with roles like numerator, denominator, addend) and the raw fields required. Enables agents to walk the dependency tree without parsing formula text.","section":"GASP Framework Terms","canonicalLink":null,"referenceLink":null,"body":null,"usedIn":[]},{"term":"Metric Owner","slug":"metric-owner","definition":"The named team or person responsible for a metric definition in an organization's adapter. The adapter schema recommends an owner for every metric you report and the validator lists metrics without one. When a metric value is disputed, the owner resolves the dispute. GASP provides the canonical definition; the owner decides whether their organization follows it or deviates and documents any deviation.","section":"GASP Framework Terms","canonicalLink":null,"referenceLink":"/v1/adapter#metric-owners","body":null,"usedIn":[]},{"term":"Temporal Semantics","slug":"temporal-semantics","definition":"GASP's structured description of a metric's time grain, aggregation method and reporting frequency. Each metric has a mapping (e.g. MRR = End-of-month snapshot, Daily sync).","section":"GASP Framework Terms","canonicalLink":null,"referenceLink":null,"body":null,"usedIn":[]}],"nodes":[{"id":"arr","label":"ARR","department":"Core","signalType":"outcome","level":1,"slug":"arr-annual-recurring-revenue","category":"Core","description":"The annualized value of recurring revenue. ARR represents the yearly run rate of subscription revenue."},{"id":"rule_of_40","label":"Rule of 40","department":"Core","signalType":"outcome","level":1,"slug":"rule-of-40","category":"Core","description":"A heuristic that balances growth and profitability. A healthy SaaS company's growth rate plus profit margin should equal 40% or more."},{"id":"mrr","label":"MRR","department":"Core","signalType":"outcome","level":2,"slug":"mrr-monthly-recurring-revenue","category":"Core","description":"The total predictable revenue from active subscriptions, normalized to a monthly value."},{"id":"net_new_mrr","label":"Net New MRR","department":"Core","signalType":"outcome","level":2,"slug":"net-new-mrr","category":"Core","description":"The net change in MRR after accounting for all movements."},{"id":"nrr","label":"NRR","department":"Core","signalType":"outcome","level":2,"slug":"net-revenue-retention-nrr","category":"Core","description":"The percentage of revenue retained from existing customers over a period, including expansion, contraction and churn. Also known as Net Dollar Retention (NDR)."},{"id":"grr","label":"GRR","department":"Core","signalType":"outcome","level":2,"slug":"gross-revenue-retention-grr","category":"Core","description":"The percentage of revenue retained from existing customers, excluding expansion revenue. Also known as Gross Dollar Retention."},{"id":"gross_margin","label":"Gross Margin","department":"Core","signalType":"outcome","level":2,"slug":"gross-margin","category":"Core","description":"Revenue minus cost of goods sold (COGS), as a percentage of revenue. Measures profitability after direct delivery costs."},{"id":"arpa","label":"ARPA","department":"Core","signalType":"outcome","level":2,"slug":"arpa-average-revenue-per-account","category":"Core","description":"Average monthly recurring revenue per customer."},{"id":"total_customers","label":"Total Customers","department":"Core","signalType":"outcome","level":3,"slug":"total-customers","category":"Core","description":"The number of active customers at the end of the period."},{"id":"new_customers","label":"New Customers","department":"Core","signalType":"outcome","level":3,"slug":"new-customers","category":"Core","description":"The number of customers acquired in the period: customers whose first paid subscription started in the period."},{"id":"churned_customers","label":"Churned Customers","department":"Core","signalType":"outcome","level":3,"slug":"churned-customers","category":"Core","description":"The number of customers lost in the period: customers whose last active subscription ended."},{"id":"mrr_growth_rate","label":"MRR Growth Rate","department":"Core","signalType":"outcome","level":2,"slug":"mrr-growth-rate","category":"Core","description":"The month-over-month percentage change in MRR."},{"id":"operating_margin","label":"Operating Margin","department":"Finance","signalType":"outcome","level":2,"slug":"operating-margin-ebit-margin","category":"Finance","description":"Operating income as a percentage of revenue."},{"id":"fcf","label":"Free Cash Flow","department":"Finance","signalType":"outcome","level":2,"slug":"free-cash-flow-fcf","category":"Finance","description":"Cash generated from operations minus capital expenditures."},{"id":"new_mrr","label":"New MRR","department":"Core","signalType":"outcome","level":3,"slug":"new-mrr","category":"Core","description":"MRR generated from brand new customers acquired in the period."},{"id":"expansion_mrr","label":"Expansion MRR","department":"Core","signalType":"outcome","level":3,"slug":"expansion-mrr","category":"Core","description":"Additional MRR from existing customers through upgrades, add-ons, seat increases or price increases."},{"id":"churned_mrr","label":"Churned MRR","department":"Core","signalType":"outcome","level":3,"slug":"churned-mrr","category":"Core","description":"MRR lost from customers who cancelled their subscriptions."},{"id":"contraction_mrr","label":"Contraction MRR","department":"Core","signalType":"outcome","level":3,"slug":"contraction-mrr","category":"Core","description":"MRR reduction from existing customers who downgraded but didn't churn."},{"id":"reactivation_mrr","label":"Reactivation MRR","department":"Core","signalType":"outcome","level":3,"slug":"reactivation-mrr","category":"Core","description":"MRR regained from customers who had churned and signed up again in the period."},{"id":"cac","label":"CAC","department":"Core","signalType":"efficiency","level":3,"slug":"cac-customer-acquisition-cost","category":"Core","description":"The total cost to acquire a new customer."},{"id":"ltv","label":"LTV","department":"Core","signalType":"efficiency","level":3,"slug":"ltv-customer-lifetime-value","category":"Core","description":"The gross profit expected from a customer over their lifetime. Also known as CLV (Customer Lifetime Value) or CLTV."},{"id":"ltv_cac_ratio","label":"LTV:CAC Ratio","department":"Core","signalType":"efficiency","level":3,"slug":"ltvcac-ratio","category":"Core","description":"The ratio of customer lifetime value to acquisition cost. Measures the return on investment from sales and marketing spend."},{"id":"cac_payback","label":"CAC Payback Period","department":"Core","signalType":"efficiency","level":3,"slug":"cac-payback-period","category":"Core","description":"The number of months required to recover the cost of acquiring a customer. Also called \"Months to Recover CAC\" or \"Time to Recover CAC.\""},{"id":"logo_churn_rate","label":"Logo Churn Rate","department":"Core","signalType":"outcome","level":3,"slug":"logo-churn-rate-customer-churn","category":"Core","description":"The percentage of customers lost in a period. Also called customer churn or logo churn."},{"id":"revenue_churn_rate","label":"Revenue Churn Rate","department":"Core","signalType":"outcome","level":3,"slug":"revenue-churn-rate","category":"Core","description":"The percentage of MRR lost to churn and contraction in a period. Also called MRR Churn Rate."},{"id":"nps","label":"NPS","department":"Core","signalType":"leading","level":3,"slug":"nps-net-promoter-score","category":"Core","description":"A measure of customer loyalty based on likelihood to recommend."},{"id":"pipeline_value","label":"Pipeline Value","department":"Sales","signalType":"leading","level":3,"slug":"pipeline-value","category":"Sales","description":"Total value of open sales opportunities, weighted by stage probability unless stated as unweighted."},{"id":"pipeline_coverage","label":"Pipeline Coverage","department":"Sales","signalType":"leading","level":3,"slug":"pipeline-coverage-ratio","category":"Sales","description":"The ratio of unweighted pipeline value to quota for the period."},{"id":"win_rate","label":"Win Rate","department":"Sales","signalType":"efficiency","level":3,"slug":"win-rate","category":"Sales","description":"The percentage of qualified opportunities closed in the period that were won."},{"id":"acv","label":"ACV","department":"Sales","signalType":"outcome","level":3,"slug":"acv-annual-contract-value","category":"Sales","description":"The annualized value of a contract, normalizing multi-year deals to a single year. Aggregated, it is the average ACV of new contracts signed in the period."},{"id":"quota_attainment","label":"Quota Attainment","department":"Sales","signalType":"outcome","level":3,"slug":"quota-attainment","category":"Sales","description":"The percentage of quota achieved by a rep or team."},{"id":"health_score","label":"Customer Health Score","department":"Customer Success","signalType":"leading","level":3,"slug":"customer-health-score","category":"Customer Success","description":"A composite score predicting likelihood of retention or churn."},{"id":"expansion_rate","label":"Expansion Revenue Rate","department":"Customer Success","signalType":"outcome","level":3,"slug":"expansion-revenue-rate","category":"Customer Success","description":"Expansion MRR as a percentage of beginning MRR."},{"id":"renewal_rate","label":"Renewal Rate","department":"Customer Success","signalType":"outcome","level":3,"slug":"renewal-rate","category":"Customer Success","description":"The percentage of subscriptions whose term ended in the period that renewed."},{"id":"at_risk_rate","label":"At-Risk Customer Rate","department":"Customer Success","signalType":"leading","level":3,"slug":"at-risk-customer-rate","category":"Customer Success","description":"The percentage of customers flagged as at-risk."},{"id":"magic_number","label":"Magic Number","department":"Finance","signalType":"efficiency","level":3,"slug":"magic-number","category":"Finance","description":"Sales efficiency metric measuring revenue generated per dollar of sales and marketing spend."},{"id":"burn_rate","label":"Cash Burn Rate","department":"Finance","signalType":"operational","level":3,"slug":"cash-burn-rate","category":"Finance","description":"Net cash consumed per month."},{"id":"revenue_per_employee","label":"Revenue per Employee","department":"Finance","signalType":"outcome","level":3,"slug":"revenue-per-employee","category":"Finance","description":"Annual Recurring Revenue (ARR) divided by total headcount."},{"id":"consumption_revenue","label":"Consumption Revenue","department":"Finance","signalType":"outcome","level":2,"slug":"consumption-revenue","category":"Finance","description":"Revenue earned as customers use the product: consumption drawn from a prepaid balance, billed as overage above a commitment or billed on demand with no commitment."},{"id":"usage_run_rate","label":"Usage Run-Rate","department":"Finance","signalType":"outcome","level":2,"slug":"usage-run-rate","category":"Finance","description":"On-demand consumption revenue over the trailing three months, annualised. Also called Usage ARR."},{"id":"prepaid_credit_balance","label":"Prepaid Credit Balance","department":"Finance","signalType":"operational","level":3,"slug":"prepaid-credit-balance","category":"Finance","description":"The prepaid commitment customers have paid for and not yet consumed or forfeited, as of period end. Also called Remaining Commitment."},{"id":"arr_including_usage_run_rate","label":"ARR Including Usage Run-Rate","department":"Finance","signalType":"outcome","level":1,"slug":"arr-including-usage-run-rate","category":"Finance","description":"Annual Recurring Revenue (ARR) plus Usage Run-Rate: committed recurring revenue and annualised on-demand usage together. It is the figure Datadog, MongoDB and Confluent report as ARR."},{"id":"partner_sourced_revenue","label":"Partner-Sourced Revenue","department":"Partnerships","signalType":"outcome","level":3,"slug":"partner-sourced-revenue","category":"Partnerships","description":"Revenue from deals originated by partners."},{"id":"sales_cycle","label":"Sales Cycle Length","department":"Sales","signalType":"operational","level":4,"slug":"sales-cycle-length","category":"Sales","description":"The average time from opportunity creation to close."},{"id":"mqls","label":"MQLs","department":"Marketing","signalType":"operational","level":4,"slug":"marketing-qualified-leads-mqls","category":"Marketing","description":"Leads that have demonstrated sufficient engagement and intent to warrant sales attention, based on criteria established between marketing and sales."},{"id":"sqls","label":"SQLs","department":"Marketing","signalType":"operational","level":4,"slug":"sales-qualified-leads-sqls","category":"Marketing","description":"MQLs accepted by sales as worth pursuing."},{"id":"lvr","label":"Lead Velocity Rate","department":"Marketing","signalType":"leading","level":4,"slug":"lead-velocity-rate-lvr","category":"Marketing","description":"Month-over-month growth in qualified leads (MQLs)."},{"id":"marketing_cac","label":"Marketing CAC","department":"Marketing","signalType":"efficiency","level":4,"slug":"marketing-cac","category":"Marketing","description":"Marketing-only portion of acquisition cost: go-to-market cost booked to the marketing cost centre, divided by all new customers in the period."},{"id":"cpl","label":"Cost per Lead","department":"Marketing","signalType":"efficiency","level":4,"slug":"cost-per-lead-cpl","category":"Marketing","description":"Cost to acquire a lead."},{"id":"marketing_sourced_pipeline","label":"Marketing Sourced Pipeline","department":"Marketing","signalType":"leading","level":4,"slug":"marketing-sourced-pipeline","category":"Marketing","description":"Pipeline value attributed to marketing efforts (first-touch attribution)."},{"id":"qbr_completion","label":"QBR Completion Rate","department":"Customer Success","signalType":"operational","level":4,"slug":"quarterly-business-review-qbr-completion-rate","category":"Customer Success","description":"The percentage of eligible accounts that completed a QBR."},{"id":"csat","label":"CSAT","department":"Support","signalType":"outcome","level":4,"slug":"customer-satisfaction-score-csat","category":"Support","description":"Customer rating of support interaction."},{"id":"ttfv","label":"Time to First Value","department":"Onboarding","signalType":"operational","level":4,"slug":"time-to-first-value-ttfv","category":"Onboarding","description":"Time from contract start to the customer's first meaningful value milestone."},{"id":"onboarding_completion","label":"Onboarding Completion Rate","department":"Onboarding","signalType":"outcome","level":4,"slug":"onboarding-completion-rate","category":"Onboarding","description":"Percentage of customers who complete the onboarding program."},{"id":"activation_rate","label":"Activation Rate","department":"Onboarding","signalType":"outcome","level":4,"slug":"onboarding-to-active-rate-activation-rate","category":"Onboarding","description":"Percentage of onboarded customers who become actively engaged."},{"id":"dau_mau","label":"DAU/MAU Ratio","department":"Product","signalType":"leading","level":4,"slug":"daumau-ratio-stickiness","category":"Product","description":"The ratio of daily to monthly active users, indicating how often users return."},{"id":"feature_adoption","label":"Feature Adoption Rate","department":"Product","signalType":"leading","level":4,"slug":"feature-adoption-rate","category":"Product","description":"Percentage of active users who used a specific feature in the period."},{"id":"pqas","label":"Product Qualified Accounts","department":"Product","signalType":"leading","level":4,"slug":"product-qualified-accounts-pqas","category":"Product","description":"Accounts that have demonstrated product engagement indicating sales-readiness."},{"id":"trial_to_paid_conversion_rate","label":"Trial-to-Paid Conversion Rate","department":"Product","signalType":"leading","level":4,"slug":"trial-to-paid-conversion-rate","category":"Product","description":"The percentage of trials that ended in the period and became paying customers."},{"id":"forecast_accuracy","label":"Forecast Accuracy","department":"RevOps","signalType":"operational","level":4,"slug":"forecast-accuracy","category":"RevOps","description":"How closely forecasted revenue matched actual revenue."},{"id":"dso","label":"Days Sales Outstanding","department":"RevOps","signalType":"operational","level":4,"slug":"days-sales-outstanding-dso","category":"RevOps","description":"Average days to collect payment after invoicing."},{"id":"employee_turnover","label":"Employee Turnover Rate","department":"People","signalType":"outcome","level":4,"slug":"employee-turnover-rate","category":"People","description":"Percentage of employees who left in a period."},{"id":"frt","label":"First Response Time","department":"Support","signalType":"operational","level":5,"slug":"first-response-time-frt","category":"Support","description":"Time from ticket creation to first human response."},{"id":"ticket_volume","label":"Ticket Volume","department":"Support","signalType":"operational","level":5,"slug":"ticket-volume","category":"Support","description":"Total number of support tickets received in a period."},{"id":"self_service_rate","label":"Self-Service Rate","department":"Support","signalType":"efficiency","level":5,"slug":"self-service-rate-ticket-deflection","category":"Support","description":"Percentage of support needs resolved through self-service."},{"id":"uptime","label":"Uptime","department":"Engineering","signalType":"outcome","level":5,"slug":"uptime-availability","category":"Engineering","description":"The percentage of time the service is operational."},{"id":"deployment_frequency","label":"Deployment Frequency","department":"Engineering","signalType":"operational","level":5,"slug":"deployment-frequency","category":"Engineering","description":"How often code is deployed to production."},{"id":"mttr","label":"MTTR","department":"Engineering","signalType":"operational","level":5,"slug":"mean-time-to-resolve-mttr","category":"Engineering","description":"Time from incident start to resolution."},{"id":"enps","label":"Employee NPS","department":"People","signalType":"leading","level":5,"slug":"employee-net-promoter-score-enps","category":"People","description":"Likelihood of employees recommending the company as a place to work."},{"id":"entity_customer","label":"Customer","nodeType":"entity","level":0,"definition":"customer-account-organization","description":"A distinct billing entity with one or more subscriptions. The \"who\" of your business relationship.","category":"entity"},{"id":"entity_subscription","label":"Subscription","nodeType":"entity","level":0,"definition":"subscription-contract-agreement","description":"A billable agreement between a customer and your product, with defined terms, pricing, and status. The \"what and when\" of the relationship.","category":"entity"},{"id":"entity_license","label":"License","nodeType":"entity","level":0,"definition":"license-entitlement-access-quota","description":"A specific capability, quantity, or configuration granted by a subscription. The \"how much\" of the relationship.","category":"entity"},{"id":"entity_lead","label":"Lead","nodeType":"entity","level":0,"description":"A person or company that has shown interest but has not been qualified as a sales opportunity.","category":"entity"},{"id":"entity_opportunity","label":"Opportunity","nodeType":"entity","level":0,"description":"A qualified sales prospect with an estimated value, stage, and expected close date.","category":"entity"},{"id":"entity_user","label":"User","nodeType":"entity","level":0,"description":"An individual who uses the product. In B2B, one Customer may have many Users. Usage metrics are measured at this level.","category":"entity"},{"id":"entity_ticket","label":"Ticket","nodeType":"entity","level":0,"description":"A discrete support interaction initiated by a customer or user, tracked to resolution.","category":"entity"},{"id":"entity_employee","label":"Employee","nodeType":"entity","level":0,"description":"An internal team member. People metrics and efficiency ratios (revenue per employee) are measured at this level.","category":"entity"},{"id":"entity_invoice","label":"Invoice","nodeType":"entity","level":0,"description":"A billing document representing money owed or collected. Cash flow and collections metrics are measured at this level.","category":"entity"},{"id":"entity_partner","label":"Partner","nodeType":"entity","level":0,"description":"An external organization that sources, influences, or resells deals. Partner metrics are measured at this level.","category":"entity"},{"id":"entity_project","label":"Project","nodeType":"entity","level":0,"description":"A professional services engagement with defined scope, timeline, and deliverables.","category":"entity"},{"id":"entity_plan","label":"Plan","nodeType":"entity","level":0,"description":"A pricing tier offered to customers (e.g. Starter, Pro, Enterprise). Each plan defines a price point and a set of included products and quotas.","category":"entity"},{"id":"entity_product","label":"Product","nodeType":"entity","level":0,"description":"A distinct purchasable unit within the company's offering (e.g. Analytics Module, Automation Module). A subscription may include multiple products.","category":"entity"},{"id":"entity_campaign","label":"Campaign","nodeType":"entity","level":0,"description":"A marketing initiative with defined objectives, channels, budget and dates. Campaigns source leads and influence opportunities.","category":"entity"},{"id":"entity_contact","label":"Contact","nodeType":"entity","level":0,"description":"A named individual at a customer account involved in the buying or expansion process. Distinct from User (product user) and Lead (pre-qualification).","category":"entity"},{"id":"entity_incident","label":"Incident","nodeType":"entity","level":0,"definition":"incident","description":"An unplanned interruption or degradation of service, tracked from start to resolution. Reliability metrics (MTTR, incident rate) are measured at this level.","category":"entity"},{"id":"entity_deployment","label":"Deployment","nodeType":"entity","level":0,"description":"A release of code to production. DORA delivery metrics (deployment frequency, lead time for changes, change failure rate) are measured at this level.","category":"entity"},{"id":"entity_release","label":"Release","nodeType":"entity","level":0,"description":"A versioned bundle of features shipped to customers. Delivery predictability metrics are measured at this level.","category":"entity"},{"id":"entity_issue","label":"Issue","nodeType":"entity","level":0,"description":"A tracked defect or request in the engineering backlog, with its source and the environment it was found in. Quality metrics (escaped defects, bug rate) are measured at this level.","category":"entity"},{"id":"entity_vulnerability","label":"Vulnerability","nodeType":"entity","level":0,"description":"A security weakness found in the product or its infrastructure, tracked from discovery to patch. Security remediation metrics are measured at this level.","category":"entity"},{"id":"entity_feature","label":"Feature","nodeType":"entity","level":0,"description":"A unit of product functionality with planned and actual ship dates and a first use by customers. Adoption and roadmap delivery metrics are measured at this level.","category":"entity"},{"id":"entity_requisition","label":"Requisition","nodeType":"entity","level":0,"description":"An approved request to hire for a role, open until filled or closed. Recruiting metrics (time to fill, offer acceptance rate) are measured at this level.","category":"entity"},{"id":"entity_project_milestone","label":"Project Milestone","nodeType":"entity","level":0,"description":"A dated checkpoint inside a professional services project, with a planned and an actual date. Delivery predictability is measured at this level.","category":"entity"},{"id":"entity_deliverable","label":"Deliverable","nodeType":"entity","level":0,"description":"An artefact a professional services project hands to the customer, which the customer accepts or sends back for rework. Delivery quality is measured at this level.","category":"entity"},{"id":"entity_quote","label":"Quote","nodeType":"entity","level":0,"description":"A priced offer sent to a prospect or customer before an order. Quote turnaround and discounting are measured at this level.","category":"entity"},{"id":"entity_order","label":"Order","nodeType":"entity","level":0,"description":"An accepted quote in fulfilment, from receipt to completion. Order accuracy and fulfilment time are measured at this level.","category":"entity"},{"id":"entity_kb_article","label":"Knowledge Article","nodeType":"entity","level":0,"description":"A self-service help article. Ticket deflection and self-service rates are measured at this level.","category":"entity"},{"id":"entity_deal_registration","label":"Deal Registration","nodeType":"entity","level":0,"description":"A partner's claim on an opportunity it sourced, moving from qualification to close. Partner pipeline and conflict metrics are measured at this level.","category":"entity"},{"id":"concept_revenue","label":"Revenue (GAAP)","nodeType":"concept","level":0,"definition":"revenue-gaap","description":"Recognized revenue under accrual accounting. The financial outcome of delivering on subscription obligations.","category":"concept"},{"id":"concept_bookings","label":"Bookings","nodeType":"concept","level":0,"definition":"bookings","description":"The total value of new contracts signed in a period. A forward-looking commitment that converts to revenue over the contract term.","category":"concept"},{"id":"concept_cogs","label":"COGS","nodeType":"concept","level":0,"definition":"cogs-cost-of-goods-sold","description":"Cost of Goods Sold: the direct cost of delivering the product, infrastructure only (hosting, compute, payment processing, delivery software). Support, success engineering, implementation and onboarding are subtracted in Gross Margin's Operating form, not in COGS. Subtracted from revenue in Gross Margin.","category":"concept"},{"id":"concept_cohort","label":"Cohort","nodeType":"concept","level":0,"definition":"cohort","description":"A time-bound grouping of customers by acquisition period. Used for retention and expansion analysis to isolate vintage effects.","category":"concept"},{"id":"concept_pipeline","label":"Pipeline","nodeType":"concept","level":0,"definition":"pipeline","description":"The aggregate weighted value of active opportunities. Represents potential future bookings at various probability stages.","category":"concept"},{"id":"concept_segment","label":"Segment","nodeType":"concept","level":0,"definition":"segment","description":"A classification of customers by size, vertical or fit (e.g. SMB, Mid-Market, Enterprise). Used for cohort analysis and benchmark comparison. Recorded in the segment field, which revenue, contract and amendment events carry as of the event and the customer and subscription snapshots carry as of the snapshot.","category":"concept"},{"id":"concept_tcv","label":"TCV","nodeType":"concept","level":0,"description":"The total value of a contract over its full term, including one-time fees and multi-year commitments. Distinct from Bookings (period-attributable) and ACV (annualized).","category":"concept"}],"edges":[{"source":"net_new_mrr","target":"mrr","type":"drives"},{"source":"mqls","target":"sqls","type":"drives"},{"source":"sqls","target":"pipeline_value","type":"drives"},{"source":"marketing_cac","target":"cac","type":"drives"},{"source":"pipeline_value","target":"new_mrr","type":"drives"},{"source":"win_rate","target":"new_mrr","type":"drives"},{"source":"acv","target":"new_mrr","type":"drives"},{"source":"quota_attainment","target":"new_mrr","type":"drives"},{"source":"sales_cycle","target":"win_rate","type":"reduces"},{"source":"partner_sourced_revenue","target":"pipeline_value","type":"drives"},{"source":"partner_sourced_revenue","target":"new_mrr","type":"drives"},{"source":"pqas","target":"pipeline_value","type":"drives"},{"source":"feature_adoption","target":"pqas","type":"drives"},{"source":"acv","target":"arpa","type":"drives"},{"source":"ttfv","target":"onboarding_completion","type":"reduces"},{"source":"onboarding_completion","target":"activation_rate","type":"drives"},{"source":"activation_rate","target":"feature_adoption","type":"drives"},{"source":"feature_adoption","target":"dau_mau","type":"drives"},{"source":"feature_adoption","target":"health_score","type":"drives"},{"source":"dau_mau","target":"health_score","type":"drives"},{"source":"health_score","target":"renewal_rate","type":"drives"},{"source":"health_score","target":"logo_churn_rate","type":"reduces"},{"source":"health_score","target":"at_risk_rate","type":"reduces"},{"source":"health_score","target":"expansion_mrr","type":"drives"},{"source":"nps","target":"logo_churn_rate","type":"predicts","inverse":true},{"source":"nps","target":"churned_mrr","type":"predicts","inverse":true},{"source":"csat","target":"nps","type":"drives"},{"source":"ticket_volume","target":"csat","type":"reduces"},{"source":"frt","target":"csat","type":"reduces"},{"source":"qbr_completion","target":"health_score","type":"drives"},{"source":"qbr_completion","target":"expansion_mrr","type":"drives"},{"source":"renewal_rate","target":"grr","type":"drives"},{"source":"logo_churn_rate","target":"churned_mrr","type":"drives"},{"source":"at_risk_rate","target":"logo_churn_rate","type":"predicts"},{"source":"pqas","target":"expansion_mrr","type":"drives"},{"source":"uptime","target":"csat","type":"drives"},{"source":"uptime","target":"nps","type":"drives"},{"source":"mttr","target":"uptime","type":"reduces"},{"source":"deployment_frequency","target":"feature_adoption","type":"drives"},{"source":"gross_margin","target":"fcf","type":"drives"},{"source":"operating_margin","target":"fcf","type":"drives"},{"source":"burn_rate","target":"fcf","type":"reduces"},{"source":"mrr","target":"burn_rate","type":"reduces"},{"source":"gross_margin","target":"burn_rate","type":"reduces"},{"source":"deployment_frequency","target":"mttr","type":"reduces"},{"source":"dso","target":"fcf","type":"reduces"},{"source":"forecast_accuracy","target":"pipeline_coverage","type":"drives"},{"source":"new_customers","target":"new_mrr","type":"drives"},{"source":"churned_customers","target":"churned_mrr","type":"drives"},{"source":"trial_to_paid_conversion_rate","target":"new_customers","type":"drives"},{"source":"enps","target":"employee_turnover","type":"reduces"},{"source":"employee_turnover","target":"revenue_per_employee","type":"reduces"},{"source":"employee_turnover","target":"quota_attainment","type":"reduces"},{"source":"mrr","target":"arpa","type":"component"},{"source":"total_customers","target":"arpa","type":"component"},{"source":"mrr","target":"arr","type":"component"},{"source":"arr","target":"arr_including_usage_run_rate","type":"component"},{"source":"usage_run_rate","target":"arr_including_usage_run_rate","type":"component"},{"source":"new_customers","target":"cac","type":"component"},{"source":"arpa","target":"cac_payback","type":"component"},{"source":"cac","target":"cac_payback","type":"component"},{"source":"gross_margin","target":"cac_payback","type":"component"},{"source":"expansion_mrr","target":"expansion_rate","type":"component"},{"source":"mrr","target":"expansion_rate","type":"component"},{"source":"churned_mrr","target":"grr","type":"component"},{"source":"contraction_mrr","target":"grr","type":"component"},{"source":"mrr","target":"grr","type":"component"},{"source":"churned_customers","target":"logo_churn_rate","type":"component"},{"source":"total_customers","target":"logo_churn_rate","type":"component"},{"source":"arpa","target":"ltv","type":"component"},{"source":"gross_margin","target":"ltv","type":"component"},{"source":"revenue_churn_rate","target":"ltv","type":"component"},{"source":"cac","target":"ltv_cac_ratio","type":"component"},{"source":"ltv","target":"ltv_cac_ratio","type":"component"},{"source":"mqls","target":"lvr","type":"component"},{"source":"arr","target":"magic_number","type":"component"},{"source":"mrr","target":"mrr_growth_rate","type":"component"},{"source":"churned_mrr","target":"net_new_mrr","type":"component"},{"source":"contraction_mrr","target":"net_new_mrr","type":"component"},{"source":"expansion_mrr","target":"net_new_mrr","type":"component"},{"source":"new_mrr","target":"net_new_mrr","type":"component"},{"source":"reactivation_mrr","target":"net_new_mrr","type":"component"},{"source":"churned_mrr","target":"nrr","type":"component"},{"source":"contraction_mrr","target":"nrr","type":"component"},{"source":"expansion_mrr","target":"nrr","type":"component"},{"source":"mrr","target":"nrr","type":"component"},{"source":"gross_margin","target":"operating_margin","type":"component"},{"source":"churned_mrr","target":"revenue_churn_rate","type":"component"},{"source":"contraction_mrr","target":"revenue_churn_rate","type":"component"},{"source":"mrr","target":"revenue_churn_rate","type":"component"},{"source":"arr","target":"revenue_per_employee","type":"component"},{"source":"arr","target":"rule_of_40","type":"component"},{"source":"ticket_volume","target":"self_service_rate","type":"component"},{"source":"activation_rate","target":"entity_customer","type":"measures"},{"source":"acv","target":"entity_customer","type":"measures"},{"source":"arpa","target":"entity_customer","type":"measures"},{"source":"arr_including_usage_run_rate","target":"entity_customer","type":"measures"},{"source":"at_risk_rate","target":"entity_customer","type":"measures"},{"source":"cac","target":"entity_customer","type":"measures"},{"source":"cac_payback","target":"entity_customer","type":"measures"},{"source":"churned_customers","target":"entity_customer","type":"measures"},{"source":"churned_mrr","target":"entity_customer","type":"measures"},{"source":"consumption_revenue","target":"entity_customer","type":"measures"},{"source":"contraction_mrr","target":"entity_customer","type":"measures"},{"source":"expansion_mrr","target":"entity_customer","type":"measures"},{"source":"expansion_rate","target":"entity_customer","type":"measures"},{"source":"grr","target":"entity_customer","type":"measures"},{"source":"health_score","target":"entity_customer","type":"measures"},{"source":"logo_churn_rate","target":"entity_customer","type":"measures"},{"source":"ltv","target":"entity_customer","type":"measures"},{"source":"ltv_cac_ratio","target":"entity_customer","type":"measures"},{"source":"marketing_cac","target":"entity_customer","type":"measures"},{"source":"net_new_mrr","target":"entity_customer","type":"measures"},{"source":"new_customers","target":"entity_customer","type":"measures"},{"source":"new_mrr","target":"entity_customer","type":"measures"},{"source":"nrr","target":"entity_customer","type":"measures"},{"source":"onboarding_completion","target":"entity_customer","type":"measures"},{"source":"pqas","target":"entity_customer","type":"measures"},{"source":"prepaid_credit_balance","target":"entity_customer","type":"measures"},{"source":"qbr_completion","target":"entity_customer","type":"measures"},{"source":"reactivation_mrr","target":"entity_customer","type":"measures"},{"source":"revenue_churn_rate","target":"entity_customer","type":"measures"},{"source":"total_customers","target":"entity_customer","type":"measures"},{"source":"trial_to_paid_conversion_rate","target":"entity_customer","type":"measures"},{"source":"ttfv","target":"entity_customer","type":"measures"},{"source":"usage_run_rate","target":"entity_customer","type":"measures"},{"source":"acv","target":"entity_subscription","type":"measures"},{"source":"arpa","target":"entity_subscription","type":"measures"},{"source":"arr","target":"entity_subscription","type":"measures"},{"source":"arr_including_usage_run_rate","target":"entity_subscription","type":"measures"},{"source":"cac","target":"entity_subscription","type":"measures"},{"source":"cac_payback","target":"entity_subscription","type":"measures"},{"source":"churned_customers","target":"entity_subscription","type":"measures"},{"source":"churned_mrr","target":"entity_subscription","type":"measures"},{"source":"consumption_revenue","target":"entity_subscription","type":"measures"},{"source":"contraction_mrr","target":"entity_subscription","type":"measures"},{"source":"expansion_mrr","target":"entity_subscription","type":"measures"},{"source":"expansion_rate","target":"entity_subscription","type":"measures"},{"source":"grr","target":"entity_subscription","type":"measures"},{"source":"logo_churn_rate","target":"entity_subscription","type":"measures"},{"source":"ltv","target":"entity_subscription","type":"measures"},{"source":"ltv_cac_ratio","target":"entity_subscription","type":"measures"},{"source":"magic_number","target":"entity_subscription","type":"measures"},{"source":"marketing_cac","target":"entity_subscription","type":"measures"},{"source":"mrr","target":"entity_subscription","type":"measures"},{"source":"mrr_growth_rate","target":"entity_subscription","type":"measures"},{"source":"net_new_mrr","target":"entity_subscription","type":"measures"},{"source":"new_customers","target":"entity_subscription","type":"measures"},{"source":"new_mrr","target":"entity_subscription","type":"measures"},{"source":"nrr","target":"entity_subscription","type":"measures"},{"source":"prepaid_credit_balance","target":"entity_subscription","type":"measures"},{"source":"reactivation_mrr","target":"entity_subscription","type":"measures"},{"source":"renewal_rate","target":"entity_subscription","type":"measures"},{"source":"revenue_churn_rate","target":"entity_subscription","type":"measures"},{"source":"revenue_per_employee","target":"entity_subscription","type":"measures"},{"source":"rule_of_40","target":"entity_subscription","type":"measures"},{"source":"usage_run_rate","target":"entity_subscription","type":"measures"},{"source":"cpl","target":"entity_lead","type":"measures"},{"source":"lvr","target":"entity_lead","type":"measures"},{"source":"mqls","target":"entity_lead","type":"measures"},{"source":"sqls","target":"entity_lead","type":"measures"},{"source":"marketing_sourced_pipeline","target":"entity_opportunity","type":"measures"},{"source":"partner_sourced_revenue","target":"entity_opportunity","type":"measures"},{"source":"pipeline_coverage","target":"entity_opportunity","type":"measures"},{"source":"pipeline_value","target":"entity_opportunity","type":"measures"},{"source":"sales_cycle","target":"entity_opportunity","type":"measures"},{"source":"win_rate","target":"entity_opportunity","type":"measures"},{"source":"dau_mau","target":"entity_user","type":"measures"},{"source":"feature_adoption","target":"entity_user","type":"measures"},{"source":"frt","target":"entity_ticket","type":"measures"},{"source":"self_service_rate","target":"entity_ticket","type":"measures"},{"source":"ticket_volume","target":"entity_ticket","type":"measures"},{"source":"employee_turnover","target":"entity_employee","type":"measures"},{"source":"pipeline_coverage","target":"entity_employee","type":"measures"},{"source":"quota_attainment","target":"entity_employee","type":"measures"},{"source":"revenue_per_employee","target":"entity_employee","type":"measures"},{"source":"mttr","target":"entity_incident","type":"measures"},{"source":"deployment_frequency","target":"entity_deployment","type":"measures"},{"source":"feature_adoption","target":"entity_feature","type":"measures"},{"source":"self_service_rate","target":"entity_kb_article","type":"measures"},{"source":"entity_customer","target":"entity_subscription","type":"owns"},{"source":"entity_subscription","target":"entity_license","type":"grants"},{"source":"entity_customer","target":"entity_user","type":"engages_via"},{"source":"entity_customer","target":"entity_ticket","type":"submits"},{"source":"entity_lead","target":"entity_opportunity","type":"converts_to"},{"source":"entity_opportunity","target":"entity_customer","type":"converts_to"},{"source":"entity_partner","target":"entity_opportunity","type":"sources"},{"source":"entity_employee","target":"entity_customer","type":"manages"},{"source":"entity_project","target":"entity_customer","type":"serves"},{"source":"entity_subscription","target":"concept_revenue","type":"generates"},{"source":"entity_subscription","target":"entity_invoice","type":"generates"},{"source":"entity_opportunity","target":"concept_bookings","type":"produces"},{"source":"entity_opportunity","target":"concept_pipeline","type":"contributes_to"},{"source":"entity_subscription","target":"concept_cogs","type":"incurs"},{"source":"entity_customer","target":"concept_cohort","type":"belongs_to"},{"source":"entity_customer","target":"entity_customer","type":"parent_of"},{"source":"entity_subscription","target":"entity_plan","type":"priced_by"},{"source":"entity_license","target":"entity_product","type":"grants"},{"source":"entity_customer","target":"entity_contact","type":"represented_by"},{"source":"entity_campaign","target":"entity_lead","type":"sources"},{"source":"entity_customer","target":"concept_segment","type":"belongs_to"},{"source":"entity_opportunity","target":"concept_tcv","type":"produces"},{"source":"entity_deployment","target":"entity_incident","type":"generates"},{"source":"entity_feature","target":"entity_release","type":"belongs_to"},{"source":"entity_project","target":"entity_project_milestone","type":"owns"},{"source":"entity_project","target":"entity_deliverable","type":"produces"},{"source":"entity_quote","target":"entity_order","type":"converts_to"},{"source":"entity_partner","target":"entity_deal_registration","type":"submits"},{"source":"entity_deal_registration","target":"entity_opportunity","type":"converts_to"},{"source":"entity_requisition","target":"entity_employee","type":"converts_to"}],"dataRequirements":[{"metric":"MRR (Monthly Recurring Revenue)","formulaId":"mrr","fields":["mrr","snapshot_date","subscription_status"],"fieldTypes":{"mrr":"decimal","snapshot_date":"date","subscription_status":"string"},"datasets":["subscription"],"source":"Billing","frequency":"Daily sync","grain":"End-of-month snapshot","exampleQuery":"SELECT (SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_end AND subscription_status = 'active') AS mrr","description":"The total predictable revenue from active subscriptions, normalized to a monthly value.","department":"Core","staged":false,"placeholders":["mrr@subscription","snapshot_date@subscription","subscription_status@subscription"]},{"metric":"ARR (Annual Recurring Revenue)","formulaId":"arr","fields":["mrr","snapshot_date","subscription_status"],"fieldTypes":{"mrr":"decimal","snapshot_date":"date","subscription_status":"string"},"datasets":["subscription"],"source":"Billing","frequency":"Monthly","grain":"End-of-month snapshot","exampleQuery":"SELECT (((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_end AND subscription_status = 'active')) * 12) AS arr","description":"The annualized value of recurring revenue. ARR represents the yearly run rate of subscription revenue.","department":"Core","staged":false,"placeholders":["mrr@subscription","snapshot_date@subscription","subscription_status@subscription"],"forms":{"O":{"fields":["customer_id","customer_status","event_date","expansion_classification","mrr","mrr_change","snapshot_date","subscription_status"],"datasets":["customer","revenue_event","subscription"],"staged":true},"M":{"fields":["mrr","snapshot_date","subscription_status"],"datasets":["subscription"],"staged":false}}},{"metric":"ARPA (Average Revenue Per Account)","formulaId":"arpa","fields":["customer_id","customer_status","mrr","snapshot_date","subscription_status"],"fieldTypes":{"customer_id":"string","customer_status":"string","mrr":"decimal","snapshot_date":"date","subscription_status":"string"},"datasets":["customer","subscription"],"source":"Billing","frequency":"Daily sync","grain":"End-of-month snapshot","exampleQuery":"SELECT (CAST(((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_end AND subscription_status = 'active')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND customer_status = 'active')), 0)) AS arpa","description":"Average monthly recurring revenue per customer.","department":"Core","staged":false,"placeholders":["customer_id@customer","customer_status@customer","mrr@subscription","snapshot_date@customer","snapshot_date@subscription","subscription_status@subscription"]},{"metric":"MRR Growth Rate","formulaId":"mrr_growth_rate","fields":["mrr","snapshot_date","subscription_status"],"fieldTypes":{"mrr":"decimal","snapshot_date":"date","subscription_status":"string"},"datasets":["subscription"],"source":"Billing","frequency":"Daily sync","grain":"End-of-month snapshot","exampleQuery":"SELECT (CAST((((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_end AND subscription_status = 'active')) - ((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = (((:period_end + INTERVAL '1 day') - INTERVAL '1 month') - INTERVAL '1 day') AND subscription_status = 'active'))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = (((:period_end + INTERVAL '1 day') - INTERVAL '1 month') - INTERVAL '1 day') AND subscription_status = 'active')), 0)) AS mrr_growth_rate","description":"The month-over-month percentage change in MRR.","department":"Core","staged":true,"placeholders":["mrr@subscription","snapshot_date@subscription","subscription_status@subscription"]},{"metric":"New MRR","formulaId":"new_mrr","fields":["event_date","event_type","mrr_change"],"fieldTypes":{"event_date":"date","event_type":"string","mrr_change":"decimal"},"datasets":["revenue_event"],"source":"Billing","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'new') AS new_mrr","description":"MRR generated from brand new customers acquired in the period.","department":"Core","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr_change@revenue_event"]},{"metric":"Expansion MRR","formulaId":"expansion_mrr","fields":["event_date","event_type","mrr_change"],"fieldTypes":{"event_date":"date","event_type":"string","mrr_change":"decimal"},"datasets":["revenue_event"],"source":"Billing","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'expansion') AS expansion_mrr","description":"Additional MRR from existing customers through upgrades, add-ons, seat increases or price increases.","department":"Core","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr_change@revenue_event"]},{"metric":"Churned MRR","formulaId":"churned_mrr","fields":["event_date","event_type","mrr_change"],"fieldTypes":{"event_date":"date","event_type":"string","mrr_change":"decimal"},"datasets":["revenue_event"],"source":"Billing","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'churn')) AS churned_mrr","description":"MRR lost from customers who cancelled their subscriptions.","department":"Core","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr_change@revenue_event"]},{"metric":"Contraction MRR","formulaId":"contraction_mrr","fields":["event_date","event_type","mrr_change"],"fieldTypes":{"event_date":"date","event_type":"string","mrr_change":"decimal"},"datasets":["revenue_event"],"source":"Billing","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'contraction')) AS contraction_mrr","description":"MRR reduction from existing customers who downgraded but didn't churn.","department":"Core","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr_change@revenue_event"]},{"metric":"Reactivation MRR","formulaId":"reactivation_mrr","fields":["event_date","event_type","mrr_change"],"fieldTypes":{"event_date":"date","event_type":"string","mrr_change":"decimal"},"datasets":["revenue_event"],"source":"Billing","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'reactivation') AS reactivation_mrr","description":"MRR regained from customers who had churned and signed up again in the period.","department":"Core","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr_change@revenue_event"]},{"metric":"Carry MRR","formulaId":"carry_mrr","fields":["event_date","event_type","mrr","mrr_change","snapshot_date","subscription_status"],"fieldTypes":{"event_date":"date","event_type":"string","mrr":"decimal","mrr_change":"decimal","snapshot_date":"date","subscription_status":"string"},"datasets":["revenue_event","subscription"],"source":"Billing","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT ((((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_start AND subscription_status = 'active')) - ((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'churn')))) - ((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'contraction')))) AS carry_mrr","description":"The part of beginning MRR that existing customers kept paying in the period: beginning MRR less churned and contraction MRR, before any expansion.","department":"Core","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr@subscription","mrr_change@revenue_event","snapshot_date@subscription","subscription_status@subscription"]},{"metric":"Net New MRR","formulaId":"net_new_mrr","fields":["event_date","event_type","mrr_change"],"fieldTypes":{"event_date":"date","event_type":"string","mrr_change":"decimal"},"datasets":["revenue_event"],"source":"Billing","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT ((((((SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'new')) + ((SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'expansion'))) + ((SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'reactivation'))) - ((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'churn')))) - ((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'contraction')))) AS net_new_mrr","description":"The net change in MRR after accounting for all movements.","department":"Core","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr_change@revenue_event"]},{"metric":"Total Customers","formulaId":"total_customers","fields":["customer_id","customer_status","snapshot_date"],"fieldTypes":{"customer_id":"string","customer_status":"string","snapshot_date":"date"},"datasets":["customer"],"source":"Billing","frequency":"Daily sync","grain":"End-of-month snapshot","exampleQuery":"SELECT (SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND customer_status = 'active') AS total_customers","description":"The number of active customers at the end of the period.","department":"Core","staged":false,"placeholders":["customer_id@customer","customer_status@customer","snapshot_date@customer"]},{"metric":"New Customers","formulaId":"new_customers","fields":["customer_id","event_date","event_type"],"fieldTypes":{"customer_id":"string","event_date":"date","event_type":"string"},"datasets":["revenue_event"],"source":"Billing","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT COUNT(DISTINCT customer_id) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'new') AS new_customers","description":"The number of customers acquired in the period: customers whose first paid subscription started in the period.","department":"Core","staged":false,"placeholders":["customer_id@revenue_event","event_date@revenue_event","event_type@revenue_event"]},{"metric":"Churned Customers","formulaId":"churned_customers","fields":["customer_id","event_date","event_type"],"fieldTypes":{"customer_id":"string","event_date":"date","event_type":"string"},"datasets":["revenue_event"],"source":"Billing","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT COUNT(DISTINCT customer_id) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'churn') AS churned_customers","description":"The number of customers lost in the period: customers whose last active subscription ended.","department":"Core","staged":false,"placeholders":["customer_id@revenue_event","event_date@revenue_event","event_type@revenue_event"]},{"metric":"Net Revenue Retention (NRR)","formulaId":"nrr","fields":["customer_id","customer_status","event_date","event_type","mrr","mrr_change","snapshot_date","subscription_status"],"fieldTypes":{"customer_id":"string","customer_status":"string","event_date":"date","event_type":"string","mrr":"decimal","mrr_change":"decimal","snapshot_date":"date","subscription_status":"string"},"datasets":["customer","revenue_event","subscription"],"source":"Billing","frequency":"Monthly","grain":"Customer cohort at period start","exampleQuery":"SELECT (CAST((((((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active'))) + ((SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'expansion' AND customer_id IN (SELECT customer_id FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active')))) - ((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active'))))) - ((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active'))))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active'))), 0)) AS nrr","description":"The percentage of revenue retained from existing customers over a period, including expansion, contraction and churn. Also known as Net Dollar Retention (NDR).","department":"Core","staged":true,"placeholders":["customer_id@customer","customer_id@revenue_event","customer_id@subscription","customer_status@customer","event_date@revenue_event","event_type@revenue_event","mrr@subscription","mrr_change@revenue_event","snapshot_date@customer","snapshot_date@subscription","subscription_status@subscription"],"forms":{"O":{"fields":["customer_id","customer_status","event_date","event_type","expansion_classification","mrr","mrr_change","snapshot_date","subscription_status"],"datasets":["customer","revenue_event","subscription"],"staged":true},"M":{"fields":["customer_id","customer_status","event_date","event_type","expansion_classification","mrr","mrr_change","snapshot_date","subscription_status"],"datasets":["customer","revenue_event","subscription"],"staged":true}}},{"metric":"Gross Revenue Retention (GRR)","formulaId":"grr","fields":["customer_id","customer_status","event_date","event_type","mrr","mrr_change","snapshot_date","subscription_status"],"fieldTypes":{"customer_id":"string","customer_status":"string","event_date":"date","event_type":"string","mrr":"decimal","mrr_change":"decimal","snapshot_date":"date","subscription_status":"string"},"datasets":["customer","revenue_event","subscription"],"source":"Billing","frequency":"Monthly","grain":"Customer cohort at period start","exampleQuery":"SELECT (CAST(((((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active'))) - ((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active'))))) - ((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active'))))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active'))), 0)) AS grr","description":"The percentage of revenue retained from existing customers, excluding expansion revenue. Also known as Gross Dollar Retention.","department":"Core","staged":true,"placeholders":["customer_id@customer","customer_id@revenue_event","customer_id@subscription","customer_status@customer","event_date@revenue_event","event_type@revenue_event","mrr@subscription","mrr_change@revenue_event","snapshot_date@customer","snapshot_date@subscription","subscription_status@subscription"]},{"metric":"Logo Churn Rate (Customer Churn)","formulaId":"logo_churn_rate","fields":["customer_id","customer_status","event_date","event_type","snapshot_date"],"fieldTypes":{"customer_id":"string","customer_status":"string","event_date":"date","event_type":"string","snapshot_date":"date"},"datasets":["customer","revenue_event"],"source":"Billing","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST(((SELECT COUNT(DISTINCT customer_id) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'churn')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active')), 0)) AS logo_churn_rate","description":"The percentage of customers lost in a period. Also called customer churn or logo churn.","department":"Core","staged":false,"placeholders":["customer_id@customer","customer_id@revenue_event","customer_status@customer","event_date@revenue_event","event_type@revenue_event","snapshot_date@customer"]},{"metric":"Revenue Churn Rate","formulaId":"revenue_churn_rate","fields":["event_date","event_type","mrr","mrr_change","snapshot_date","subscription_status"],"fieldTypes":{"event_date":"date","event_type":"string","mrr":"decimal","mrr_change":"decimal","snapshot_date":"date","subscription_status":"string"},"datasets":["revenue_event","subscription"],"source":"Billing","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'churn'))) + ((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'contraction')))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_start AND subscription_status = 'active')), 0)) AS revenue_churn_rate","description":"The percentage of MRR lost to churn and contraction in a period. Also called MRR Churn Rate.","department":"Core","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr@subscription","mrr_change@revenue_event","snapshot_date@subscription","subscription_status@subscription"]},{"metric":"NPS (Net Promoter Score)","formulaId":"nps","fields":["nps_score","survey_date","survey_type"],"fieldTypes":{"nps_score":"integer","survey_date":"date","survey_type":"string"},"datasets":["survey_response"],"source":"Survey Tool","frequency":"Per response","grain":"Per survey response","exampleQuery":"SELECT ((CAST(((SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND (survey_type = 'customer' AND nps_score >= 9)) - (SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND (survey_type = 'customer' AND nps_score <= 6))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND survey_type = 'customer'), 0)) * 100) AS nps","description":"A measure of customer loyalty based on likelihood to recommend.","department":"Core","staged":false,"placeholders":["nps_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},{"metric":"CAC (Customer Acquisition Cost)","formulaId":"cac","fields":["cost","cost_function","customer_id","event_date","event_type"],"fieldTypes":{"cost":"decimal","cost_function":"string","customer_id":"string","event_date":"date","event_type":"string"},"datasets":["cost_event","revenue_event"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'gtm') AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'new')), 0)) AS cac","description":"The total cost to acquire a new customer.","department":"Core","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","customer_id@revenue_event","event_date@cost_event","event_date@revenue_event","event_type@revenue_event"],"forms":{"O":{"fields":["cost","cost_function","customer_id","event_date","event_type"],"datasets":["cost_event","revenue_event"],"staged":false},"M":{"fields":["cost","cost_function","customer_id","event_date","event_type"],"datasets":["cost_event","revenue_event"],"staged":false}}},{"metric":"LTV (Customer Lifetime Value)","formulaId":"ltv","fields":["cost","cost_function","customer_id","customer_status","event_date","event_type","mrr","mrr_change","period_start","revenue","snapshot_date","subscription_status"],"fieldTypes":{"cost":"decimal","cost_function":"string","customer_id":"string","customer_status":"string","event_date":"date","event_type":"string","mrr":"decimal","mrr_change":"decimal","period_start":"date","revenue":"decimal","snapshot_date":"date","subscription_status":"string"},"datasets":["cost_event","customer","financials","revenue_event","subscription"],"source":"Billing","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((((CAST(((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_end AND subscription_status = 'active')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end) - (SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'infrastructure')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end), 0)))) AS DOUBLE PRECISION) / NULLIF(((CAST((((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'churn'))) + ((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'contraction')))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_start AND subscription_status = 'active')), 0))), 0)) AS ltv","description":"The gross profit expected from a customer over their lifetime. Also known as CLV (Customer Lifetime Value) or CLTV.","department":"Core","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","customer_id@customer","customer_status@customer","event_date@cost_event","event_date@revenue_event","event_type@revenue_event","mrr@subscription","mrr_change@revenue_event","period_start@financials","revenue@financials","snapshot_date@customer","snapshot_date@subscription","subscription_status@subscription"],"forms":{"O":{"fields":["cost","cost_function","customer_id","customer_status","event_date","event_type","mrr","mrr_change","period_start","revenue","snapshot_date","subscription_status"],"datasets":["cost_event","customer","financials","revenue_event","subscription"],"staged":false},"M":{"fields":["cost","cost_function","customer_id","customer_status","event_date","event_type","mrr","mrr_change","period_start","revenue","snapshot_date","subscription_status"],"datasets":["cost_event","customer","financials","revenue_event","subscription"],"staged":false}}},{"metric":"LTV:CAC Ratio","formulaId":"ltv_cac_ratio","fields":["cost","cost_function","customer_id","customer_status","event_date","event_type","mrr","mrr_change","period_start","revenue","snapshot_date","subscription_status"],"fieldTypes":{"cost":"decimal","cost_function":"string","customer_id":"string","customer_status":"string","event_date":"date","event_type":"string","mrr":"decimal","mrr_change":"decimal","period_start":"date","revenue":"decimal","snapshot_date":"date","subscription_status":"string"},"datasets":["cost_event","customer","financials","revenue_event","subscription"],"source":"Billing","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST(((CAST((((CAST(((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_end AND subscription_status = 'active')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end) - (SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'infrastructure')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end), 0)))) AS DOUBLE PRECISION) / NULLIF(((CAST((((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'churn'))) + ((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'contraction')))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_start AND subscription_status = 'active')), 0))), 0))) AS DOUBLE PRECISION) / NULLIF(((CAST((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'gtm') AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'new')), 0))), 0)) AS ltv_cac_ratio","description":"The ratio of customer lifetime value to acquisition cost. Measures the return on investment from sales and marketing spend.","department":"Core","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","customer_id@customer","customer_id@revenue_event","customer_status@customer","event_date@cost_event","event_date@revenue_event","event_type@revenue_event","mrr@subscription","mrr_change@revenue_event","period_start@financials","revenue@financials","snapshot_date@customer","snapshot_date@subscription","subscription_status@subscription"],"forms":{"O":{"fields":["cost","cost_function","customer_id","customer_status","event_date","event_type","mrr","mrr_change","period_start","revenue","snapshot_date","subscription_status"],"datasets":["cost_event","customer","financials","revenue_event","subscription"],"staged":false},"M":{"fields":["cost","cost_function","customer_id","customer_status","event_date","event_type","mrr","mrr_change","period_start","revenue","snapshot_date","subscription_status"],"datasets":["cost_event","customer","financials","revenue_event","subscription"],"staged":false}}},{"metric":"CAC Payback Period","formulaId":"cac_payback","fields":["cost","cost_function","customer_id","customer_status","event_date","event_type","mrr","period_start","revenue","snapshot_date","subscription_status"],"fieldTypes":{"cost":"decimal","cost_function":"string","customer_id":"string","customer_status":"string","event_date":"date","event_type":"string","mrr":"decimal","period_start":"date","revenue":"decimal","snapshot_date":"date","subscription_status":"string"},"datasets":["cost_event","customer","financials","revenue_event","subscription"],"source":"Billing","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST(((CAST((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'gtm') AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'new')), 0))) AS DOUBLE PRECISION) / NULLIF((((CAST(((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_end AND subscription_status = 'active')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end) - (SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'infrastructure')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end), 0)))), 0)) AS cac_payback","description":"The number of months required to recover the cost of acquiring a customer. Also called \"Months to Recover CAC\" or \"Time to Recover CAC.\"","department":"Core","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","customer_id@customer","customer_id@revenue_event","customer_status@customer","event_date@cost_event","event_date@revenue_event","event_type@revenue_event","mrr@subscription","period_start@financials","revenue@financials","snapshot_date@customer","snapshot_date@subscription","subscription_status@subscription"],"forms":{"O":{"fields":["cost","cost_function","customer_id","customer_status","event_date","event_type","mrr","period_start","revenue","snapshot_date","subscription_status"],"datasets":["cost_event","customer","financials","revenue_event","subscription"],"staged":false},"M":{"fields":["cost","cost_function","customer_id","customer_status","event_date","event_type","mrr","period_start","revenue","snapshot_date","subscription_status"],"datasets":["cost_event","customer","financials","revenue_event","subscription"],"staged":false}}},{"metric":"Gross Margin","formulaId":"gross_margin","fields":["cost","cost_function","event_date","period_start","revenue"],"fieldTypes":{"cost":"decimal","cost_function":"string","event_date":"date","period_start":"date","revenue":"decimal"},"datasets":["cost_event","financials"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end) - (SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'infrastructure')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end), 0)) AS gross_margin","description":"Revenue minus cost of goods sold (COGS), as a percentage of revenue. Measures profitability after direct delivery costs.","department":"Core","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","period_start@financials","revenue@financials"],"forms":{"O":{"fields":["cost","cost_function","event_date","period_start","revenue"],"datasets":["cost_event","financials"],"staged":false},"M":{"fields":["cost","cost_function","event_date","period_start","revenue"],"datasets":["cost_event","financials"],"staged":false}}},{"metric":"Rule of 40","formulaId":"rule_of_40","fields":["ebitda","mrr","period_start","revenue","snapshot_date","subscription_status"],"fieldTypes":{"ebitda":"decimal","mrr":"decimal","period_start":"date","revenue":"decimal","snapshot_date":"date","subscription_status":"string"},"datasets":["financials","subscription"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT ((CAST((((((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_end AND subscription_status = 'active')) * 12)) - ((((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = (((:period_end + INTERVAL '1 day') - INTERVAL '1 year') - INTERVAL '1 day') AND subscription_status = 'active')) * 12))) AS DOUBLE PRECISION) / NULLIF(((((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = (((:period_end + INTERVAL '1 day') - INTERVAL '1 year') - INTERVAL '1 day') AND subscription_status = 'active')) * 12)), 0)) + ((CAST((SELECT COALESCE(SUM(ebitda), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end)), 0)))) AS rule_of_40","description":"A heuristic that balances growth and profitability. A healthy SaaS company's growth rate plus profit margin should equal 40% or more.","department":"Core","staged":true,"placeholders":["ebitda@financials","mrr@subscription","period_start@financials","revenue@financials","snapshot_date@subscription","subscription_status@subscription"]},{"metric":"Logo Retention Rate","formulaId":"logo_retention_rate","fields":["customer_id","customer_status","event_date","event_type","snapshot_date"],"fieldTypes":{"customer_id":"string","customer_status":"string","event_date":"date","event_type":"string","snapshot_date":"date"},"datasets":["customer","revenue_event"],"source":"Billing","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (1 - ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'churn')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active')), 0)))) AS logo_retention_rate","description":"The percentage of customers retained over a period.","department":"Customer Success","staged":false,"placeholders":["customer_id@customer","customer_id@revenue_event","customer_status@customer","event_date@revenue_event","event_type@revenue_event","snapshot_date@customer"]},{"metric":"Customer Health Score","formulaId":"health_score","fields":["composite_score","customer_status","snapshot_date"],"fieldTypes":{"composite_score":"decimal","customer_status":"string","snapshot_date":"date"},"datasets":["customer"],"source":"CS Platform","frequency":"Weekly","grain":"Weekly snapshot","exampleQuery":"SELECT (SELECT AVG(composite_score) FROM customer WHERE snapshot_date = :period_end AND customer_status = 'active') AS health_score","description":"A composite score predicting likelihood of retention or churn.","department":"Customer Success","staged":false,"placeholders":["composite_score@customer","customer_status@customer","snapshot_date@customer"]},{"metric":"Health Score Coverage","formulaId":"health_score_coverage","fields":["composite_score","customer_id","customer_status","snapshot_date"],"fieldTypes":{"composite_score":"decimal","customer_id":"string","customer_status":"string","snapshot_date":"date"},"datasets":["customer"],"source":"CS Platform","frequency":"Weekly","grain":"Weekly snapshot","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND composite_score IS NOT NULL) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND customer_status = 'active'), 0)) AS health_score_coverage","description":"The percentage of active customers that have a health score.","department":"Customer Success","staged":false,"placeholders":["composite_score@customer","customer_id@customer","customer_status@customer","snapshot_date@customer"]},{"metric":"At-Risk Customer Rate","formulaId":"at_risk_rate","fields":["composite_score","customer_id","snapshot_date"],"fieldTypes":{"composite_score":"decimal","customer_id":"string","snapshot_date":"date"},"datasets":["customer"],"source":"CS Platform","frequency":"Weekly","grain":"Weekly snapshot","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND composite_score < 40) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND composite_score IS NOT NULL), 0)) AS at_risk_rate","description":"The percentage of customers flagged as at-risk.","department":"Customer Success","staged":false,"placeholders":["composite_score@customer","customer_id@customer","snapshot_date@customer"]},{"metric":"Quarterly Business Review (QBR) Completion Rate","formulaId":"qbr_completion","fields":["customer_id","qbr_completed","qbr_due","snapshot_date"],"fieldTypes":{"customer_id":"string","qbr_completed":"boolean","qbr_due":"boolean","snapshot_date":"date"},"datasets":["customer"],"source":"CS Platform","frequency":"Quarterly","grain":"Quarterly snapshot","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND qbr_completed = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND qbr_due = TRUE), 0)) AS qbr_completion","description":"The percentage of eligible accounts that completed a QBR.","department":"Customer Success","staged":false,"placeholders":["customer_id@customer","qbr_completed@customer","qbr_due@customer","snapshot_date@customer"]},{"metric":"Executive Sponsor Coverage","formulaId":"executive_sponsor_coverage","fields":["contact_engaged","contact_role","customer_id","customer_status","snapshot_date"],"fieldTypes":{"contact_engaged":"boolean","contact_role":"string","customer_id":"string","customer_status":"string","snapshot_date":"date"},"datasets":["contact","customer"],"source":"CRM","frequency":"Weekly","grain":"Weekly snapshot","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT customer_id) FROM contact WHERE snapshot_date = :period_end AND (contact_role = 'executive_sponsor' AND contact_engaged = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND customer_status = 'active'), 0)) AS executive_sponsor_coverage","description":"The percentage of active accounts with an engaged contact whose role is executive sponsor.","department":"Customer Success","staged":false,"placeholders":["contact_engaged@contact","contact_role@contact","customer_id@contact","customer_id@customer","customer_status@customer","snapshot_date@contact","snapshot_date@customer"]},{"metric":"Contact Coverage","formulaId":"contact_coverage","fields":["contact_engaged","contact_id","customer_id","customer_status","snapshot_date"],"fieldTypes":{"contact_engaged":"boolean","contact_id":"string","customer_id":"string","customer_status":"string","snapshot_date":"date"},"datasets":["contact","customer"],"source":"CRM","frequency":"Weekly","grain":"Weekly snapshot","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT contact_id) FROM contact WHERE snapshot_date = :period_end AND contact_engaged = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND customer_status = 'active'), 0)) AS contact_coverage","description":"Average number of engaged contacts per active account.","department":"Customer Success","staged":false,"placeholders":["contact_engaged@contact","contact_id@contact","customer_id@customer","customer_status@customer","snapshot_date@contact","snapshot_date@customer"]},{"metric":"Expansion Revenue Rate","formulaId":"expansion_rate","fields":["event_date","event_type","mrr","mrr_change","snapshot_date","subscription_status"],"fieldTypes":{"event_date":"date","event_type":"string","mrr":"decimal","mrr_change":"decimal","snapshot_date":"date","subscription_status":"string"},"datasets":["revenue_event","subscription"],"source":"Billing","frequency":"Monthly","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST(((SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'expansion')) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_start AND subscription_status = 'active')), 0)) AS expansion_rate","description":"Expansion MRR as a percentage of beginning MRR.","department":"Customer Success","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr@subscription","mrr_change@revenue_event","snapshot_date@subscription","subscription_status@subscription"]},{"metric":"License Utilization","formulaId":"license_utilization","fields":["license_status","seats_assigned","seats_purchased","snapshot_date"],"fieldTypes":{"license_status":"string","seats_assigned":"integer","seats_purchased":"integer","snapshot_date":"date"},"datasets":["license"],"source":"Billing","frequency":"Monthly","grain":"End-of-month snapshot","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(seats_assigned), 0) FROM license WHERE snapshot_date = :period_end AND license_status = 'active') AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(seats_purchased), 0) FROM license WHERE snapshot_date = :period_end AND license_status = 'active'), 0)) AS license_utilization","description":"The share of purchased seats that are assigned to a user, across active licenses at period end.","department":"Customer Success","staged":false,"placeholders":["license_status@license","seats_assigned@license","seats_purchased@license","snapshot_date@license"]},{"metric":"Upsell Rate","formulaId":"upsell_rate","fields":["amendment_type","customer_id","event_date","snapshot_date","upgrade_eligible"],"fieldTypes":{"amendment_type":"string","customer_id":"string","event_date":"date","snapshot_date":"date","upgrade_eligible":"boolean"},"datasets":["amendment_event","customer"],"source":"Billing","frequency":"Monthly","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT customer_id) FROM amendment_event WHERE event_date >= :period_start AND event_date <= :period_end AND amendment_type = 'upgrade') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_start AND upgrade_eligible = TRUE), 0)) AS upsell_rate","description":"The percentage of customers eligible for an upgrade at period start who upgraded in the period.","department":"Customer Success","staged":false,"placeholders":["amendment_type@amendment_event","customer_id@amendment_event","customer_id@customer","event_date@amendment_event","snapshot_date@customer","upgrade_eligible@customer"]},{"metric":"Cross-sell Rate","formulaId":"cross_sell_rate","fields":["amendment_type","customer_id","customer_status","event_date","snapshot_date"],"fieldTypes":{"amendment_type":"string","customer_id":"string","customer_status":"string","event_date":"date","snapshot_date":"date"},"datasets":["amendment_event","customer"],"source":"Billing","frequency":"Monthly","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT customer_id) FROM amendment_event WHERE event_date >= :period_start AND event_date <= :period_end AND amendment_type = 'cross_sell') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active'), 0)) AS cross_sell_rate","description":"The percentage of customers active at period start who bought an additional product in the period.","department":"Customer Success","staged":false,"placeholders":["amendment_type@amendment_event","customer_id@amendment_event","customer_id@customer","customer_status@customer","event_date@amendment_event","snapshot_date@customer"]},{"metric":"Renewal Rate","formulaId":"renewal_rate","fields":["contract_end","renewed","snapshot_date","subscription_id"],"fieldTypes":{"contract_end":"date","renewed":"boolean","snapshot_date":"date","subscription_id":"string"},"datasets":["subscription"],"source":"Billing","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT subscription_id) FROM subscription WHERE snapshot_date = :period_end AND (renewed = TRUE AND (contract_end >= :period_start AND contract_end <= :period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT subscription_id) FROM subscription WHERE snapshot_date = :period_end AND (contract_end >= :period_start AND contract_end <= :period_end)), 0)) AS renewal_rate","description":"The percentage of subscriptions whose term ended in the period that renewed.","department":"Customer Success","staged":false,"placeholders":["contract_end@subscription","renewed@subscription","snapshot_date@subscription","subscription_id@subscription"]},{"metric":"Renewal Forecast Accuracy","formulaId":"renewal_forecast_accuracy","fields":["contract_end","forecast_renewal_amount","renewal_amount","renewed","snapshot_date"],"fieldTypes":{"contract_end":"date","forecast_renewal_amount":"decimal","renewal_amount":"decimal","renewed":"boolean","snapshot_date":"date"},"datasets":["subscription"],"source":"Billing","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (1 - (CAST(ABS(((SELECT COALESCE(SUM(forecast_renewal_amount), 0) FROM subscription WHERE snapshot_date = :period_end AND (contract_end >= :period_start AND contract_end <= :period_end)) - (SELECT COALESCE(SUM(renewal_amount), 0) FROM subscription WHERE snapshot_date = :period_end AND ((contract_end >= :period_start AND contract_end <= :period_end) AND renewed = TRUE)))) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(renewal_amount), 0) FROM subscription WHERE snapshot_date = :period_end AND ((contract_end >= :period_start AND contract_end <= :period_end) AND renewed = TRUE)), 0))) AS renewal_forecast_accuracy","description":"How closely the forecast renewal value matched the value actually renewed, for contracts ending in the period.","department":"Customer Success","staged":false,"placeholders":["contract_end@subscription","forecast_renewal_amount@subscription","renewal_amount@subscription","renewed@subscription","snapshot_date@subscription"]},{"metric":"Days to Renewal","formulaId":"days_to_renewal","fields":["contract_end","snapshot_date"],"fieldTypes":{"contract_end":"date","snapshot_date":"date"},"datasets":["subscription"],"source":"Billing","frequency":"Daily sync","grain":"End-of-month snapshot","exampleQuery":"SELECT (SELECT AVG((contract_end - snapshot_date)) FROM subscription WHERE snapshot_date = :period_end) AS days_to_renewal","description":"Average number of days until upcoming renewals.","department":"Customer Success","staged":false,"placeholders":["contract_end@subscription","snapshot_date@subscription"]},{"metric":"Accounts per CSM","formulaId":"accounts_per_csm","fields":["csm_id","customer_id","snapshot_date"],"fieldTypes":{"csm_id":"string","customer_id":"string","snapshot_date":"date"},"datasets":["customer"],"source":"CS Platform","frequency":"Weekly","grain":"Weekly snapshot","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT csm_id) FROM customer WHERE snapshot_date = :period_end), 0)) AS accounts_per_csm","description":"The number of accounts assigned to each Customer Success Manager.","department":"Customer Success","staged":false,"placeholders":["csm_id@customer","customer_id@customer","snapshot_date@customer"]},{"metric":"ARR per CSM","formulaId":"arr_per_csm","fields":["csm_id","mrr","snapshot_date","subscription_status"],"fieldTypes":{"csm_id":"string","mrr":"decimal","snapshot_date":"date","subscription_status":"string"},"datasets":["customer","subscription"],"source":"Billing","frequency":"Monthly","grain":"End-of-month snapshot","exampleQuery":"SELECT (CAST(((((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_end AND subscription_status = 'active')) * 12)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT csm_id) FROM customer WHERE snapshot_date = :period_end), 0)) AS arr_per_csm","description":"Total ARR managed by each CSM.","department":"Customer Success","staged":false,"placeholders":["csm_id@customer","mrr@subscription","snapshot_date@customer","snapshot_date@subscription","subscription_status@subscription"]},{"metric":"Uptime (Availability)","formulaId":"uptime","fields":["downtime_minutes","period_start"],"fieldTypes":{"downtime_minutes":"integer","period_start":"date"},"datasets":["service_metrics"],"source":"Monitoring","frequency":"Real-time","grain":"Per service per interval, aggregate per period","exampleQuery":"SELECT (1 - (CAST((SELECT COALESCE(SUM(downtime_minutes), 0) FROM service_metrics WHERE period_start >= :period_start AND period_start <= :period_end) AS DOUBLE PRECISION) / NULLIF(((:period_end - :period_start + 1) * 1440), 0))) AS uptime","description":"The percentage of time the service is operational.","department":"Engineering","staged":false,"placeholders":["downtime_minutes@service_metrics","period_start@service_metrics"]},{"metric":"SLA Adherence","formulaId":"sla_adherence","fields":["period_start","service_id","sla_met"],"fieldTypes":{"period_start":"date","service_id":"string","sla_met":"boolean"},"datasets":["service_metrics"],"source":"Monitoring","frequency":"Real-time","grain":"Per service per interval, aggregate per period","exampleQuery":"SELECT (CAST((SELECT COUNT(service_id) FROM service_metrics WHERE period_start >= :period_start AND period_start <= :period_end AND sla_met = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(service_id) FROM service_metrics WHERE period_start >= :period_start AND period_start <= :period_end), 0)) AS sla_adherence","description":"Percentage of time SLA commitments were met.","department":"Engineering","staged":false,"placeholders":["period_start@service_metrics","service_id@service_metrics","sla_met@service_metrics"]},{"metric":"Error Rate","formulaId":"error_rate","fields":["error_count","period_start","request_count"],"fieldTypes":{"error_count":"integer","period_start":"date","request_count":"integer"},"datasets":["service_metrics"],"source":"Monitoring","frequency":"Daily","grain":"Per service per interval, aggregate daily","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(error_count), 0) FROM service_metrics WHERE period_start >= :period_start AND period_start <= :period_end) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(request_count), 0) FROM service_metrics WHERE period_start >= :period_start AND period_start <= :period_end), 0)) AS error_rate","description":"Percentage of requests that result in errors.","department":"Engineering","staged":false,"placeholders":["error_count@service_metrics","period_start@service_metrics","request_count@service_metrics"]},{"metric":"Latency (Response Time)","formulaId":"latency_response_time","fields":["period_start","response_time_ms"],"fieldTypes":{"period_start":"date","response_time_ms":"integer"},"datasets":["service_metrics"],"source":"Monitoring","frequency":"Daily","grain":"Per service per interval, aggregate daily","exampleQuery":"SELECT (SELECT PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY response_time_ms) FROM service_metrics WHERE period_start >= :period_start AND period_start <= :period_end) AS latency_response_time","description":"Time taken to respond to requests.","department":"Engineering","staged":false,"placeholders":["period_start@service_metrics","response_time_ms@service_metrics"]},{"metric":"Incident Count","formulaId":"incident_count","fields":["incident_id","started_at"],"fieldTypes":{"incident_id":"string","started_at":"timestamp"},"datasets":["incident"],"source":"Incident Management","frequency":"Per incident","grain":"Per event","exampleQuery":"SELECT (SELECT COUNT(DISTINCT incident_id) FROM incident WHERE started_at >= :period_start AND started_at < (:period_end + INTERVAL '1 day')) AS incident_count","description":"Number of incidents in a period.","department":"Engineering","staged":false,"placeholders":["incident_id@incident","started_at@incident"]},{"metric":"Mean Time to Detect (MTTD)","formulaId":"mean_time_to_detect_mttd","fields":["detected_at","started_at"],"fieldTypes":{"detected_at":"timestamp","started_at":"timestamp"},"datasets":["incident"],"source":"Incident Management","frequency":"Per incident","grain":"Per event","exampleQuery":"SELECT ((SELECT AVG((EXTRACT(EPOCH FROM (detected_at - started_at)) / 86400.0)) FROM incident WHERE started_at >= :period_start AND started_at < (:period_end + INTERVAL '1 day')) * 1440) AS mean_time_to_detect_mttd","description":"Time from incident start to detection.","department":"Engineering","staged":false,"placeholders":["detected_at@incident","started_at@incident"]},{"metric":"Mean Time to Acknowledge (MTTA)","formulaId":"mean_time_to_acknowledge_mtta","fields":["acknowledged_at","detected_at","started_at"],"fieldTypes":{"acknowledged_at":"timestamp","detected_at":"timestamp","started_at":"timestamp"},"datasets":["incident"],"source":"Incident Management","frequency":"Per incident","grain":"Per event","exampleQuery":"SELECT ((SELECT AVG((EXTRACT(EPOCH FROM (acknowledged_at - detected_at)) / 86400.0)) FROM incident WHERE started_at >= :period_start AND started_at < (:period_end + INTERVAL '1 day')) * 1440) AS mean_time_to_acknowledge_mtta","description":"Time from detection (the alert firing) to a person acknowledging the incident.","department":"Engineering","staged":false,"placeholders":["acknowledged_at@incident","detected_at@incident","started_at@incident"]},{"metric":"Mean Time to Resolve (MTTR)","formulaId":"mttr","fields":["resolved_at","started_at"],"fieldTypes":{"resolved_at":"timestamp","started_at":"timestamp"},"datasets":["incident"],"source":"Incident Management","frequency":"Per deploy","grain":"Per event","exampleQuery":"SELECT ((SELECT AVG((EXTRACT(EPOCH FROM (resolved_at - started_at)) / 86400.0)) FROM incident WHERE started_at >= :period_start AND started_at < (:period_end + INTERVAL '1 day')) * 1440) AS mttr","description":"Time from incident start to resolution.","department":"Engineering","staged":false,"placeholders":["resolved_at@incident","started_at@incident"]},{"metric":"Change Failure Rate","formulaId":"change_failure_rate","fields":["deploy_date","deployment_id","incident_id"],"fieldTypes":{"deploy_date":"timestamp","deployment_id":"string","incident_id":"string"},"datasets":["deployment"],"source":"CI/CD","frequency":"Per deploy","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT deployment_id) FROM deployment WHERE deploy_date >= :period_start AND deploy_date < (:period_end + INTERVAL '1 day') AND incident_id IS NOT NULL) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT deployment_id) FROM deployment WHERE deploy_date >= :period_start AND deploy_date < (:period_end + INTERVAL '1 day')), 0)) AS change_failure_rate","description":"Percentage of deployments that cause incidents.","department":"Engineering","staged":false,"placeholders":["deploy_date@deployment","deployment_id@deployment","incident_id@deployment"]},{"metric":"Deployment Frequency","formulaId":"deployment_frequency","fields":["deploy_date","deployment_id"],"fieldTypes":{"deploy_date":"timestamp","deployment_id":"string"},"datasets":["deployment"],"source":"CI/CD","frequency":"Per deploy","grain":"Per event","exampleQuery":"SELECT (SELECT COUNT(DISTINCT deployment_id) FROM deployment WHERE deploy_date >= :period_start AND deploy_date < (:period_end + INTERVAL '1 day')) AS deployment_frequency","description":"How often code is deployed to production.","department":"Engineering","staged":false,"placeholders":["deploy_date@deployment","deployment_id@deployment"]},{"metric":"Lead Time for Changes","formulaId":"lead_time_for_changes","fields":["committed_at","deploy_date"],"fieldTypes":{"committed_at":"timestamp","deploy_date":"timestamp"},"datasets":["deployment"],"source":"CI/CD","frequency":"Per deploy","grain":"Per event","exampleQuery":"SELECT ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (EXTRACT(EPOCH FROM (deploy_date - committed_at)) / 86400.0)) FROM deployment WHERE deploy_date >= :period_start AND deploy_date < (:period_end + INTERVAL '1 day')) * 24) AS lead_time_for_changes","description":"Time from code commit to production deployment.","department":"Engineering","staged":false,"placeholders":["committed_at@deployment","deploy_date@deployment"]},{"metric":"Mean Time to Recovery (MTTR)","formulaId":"mean_time_to_recovery_mttr","fields":["recovery_time","started_at"],"fieldTypes":{"recovery_time":"integer","started_at":"timestamp"},"datasets":["incident"],"source":"Incident Management","frequency":"Per deploy","grain":"Per event","exampleQuery":"SELECT (SELECT AVG(recovery_time) FROM incident WHERE started_at >= :period_start AND started_at < (:period_end + INTERVAL '1 day')) AS mean_time_to_recovery_mttr","description":"Time to restore service after a failure.","department":"Engineering","staged":false,"placeholders":["recovery_time@incident","started_at@incident"]},{"metric":"Infrastructure Utilization","formulaId":"infrastructure_utilization","fields":["period_start","utilization"],"fieldTypes":{"period_start":"date","utilization":"decimal"},"datasets":["service_metrics"],"source":"Cloud Provider","frequency":"Daily","grain":"Per service per interval, aggregate daily","exampleQuery":"SELECT (SELECT AVG(utilization) FROM service_metrics WHERE period_start >= :period_start AND period_start <= :period_end) AS infrastructure_utilization","description":"Percentage of provisioned capacity being used.","department":"Engineering","staged":false,"placeholders":["period_start@service_metrics","utilization@service_metrics"]},{"metric":"Infrastructure Cost per Customer","formulaId":"infrastructure_cost_per_customer","fields":["cost","cost_function","customer_id","customer_status","event_date","snapshot_date"],"fieldTypes":{"cost":"decimal","cost_function":"string","customer_id":"string","customer_status":"string","event_date":"date","snapshot_date":"date"},"datasets":["cost_event","customer"],"source":"Finance / ERP","frequency":"Daily","grain":"Per service per interval, aggregate daily","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'infrastructure') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND customer_status = 'active'), 0)) AS infrastructure_cost_per_customer","description":"Total infrastructure cost divided by active customers.","department":"Engineering","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","customer_id@customer","customer_status@customer","event_date@cost_event","snapshot_date@customer"]},{"metric":"Headroom","formulaId":"headroom","fields":["period_start","utilization"],"fieldTypes":{"period_start":"date","utilization":"decimal"},"datasets":["service_metrics"],"source":"Cloud Provider","frequency":"Daily","grain":"Per service per interval, aggregate daily","exampleQuery":"SELECT (1 - ((SELECT AVG(utilization) FROM service_metrics WHERE period_start >= :period_start AND period_start <= :period_end))) AS headroom","description":"Available capacity before scaling is required.","department":"Engineering","staged":false,"placeholders":["period_start@service_metrics","utilization@service_metrics"]},{"metric":"Vulnerability Count","formulaId":"vulnerability_count","fields":["snapshot_date","vulnerability_id","vulnerability_status"],"fieldTypes":{"snapshot_date":"date","vulnerability_id":"string","vulnerability_status":"string"},"datasets":["vulnerability"],"source":"Security Scanner","frequency":"Daily","grain":"Daily snapshot","exampleQuery":"SELECT (SELECT COUNT(DISTINCT vulnerability_id) FROM vulnerability WHERE snapshot_date = :period_end AND vulnerability_status = 'open') AS vulnerability_count","description":"Number of known vulnerabilities still open in your systems.","department":"Engineering","staged":false,"placeholders":["snapshot_date@vulnerability","vulnerability_id@vulnerability","vulnerability_status@vulnerability"]},{"metric":"Time to Patch","formulaId":"time_to_patch","fields":["discovered_at","patched_at","snapshot_date"],"fieldTypes":{"discovered_at":"timestamp","patched_at":"timestamp","snapshot_date":"date"},"datasets":["vulnerability"],"source":"Security Scanner","frequency":"Per incident","grain":"Per event","exampleQuery":"SELECT ((SELECT AVG((EXTRACT(EPOCH FROM (patched_at - discovered_at)) / 86400.0)) FROM vulnerability WHERE snapshot_date = :period_end AND (patched_at >= :period_start AND patched_at < (:period_end + INTERVAL '1 day'))) * 24) AS time_to_patch","description":"Time from a vulnerability being discovered to its patch being deployed, for patches deployed in the period.","department":"Engineering","staged":false,"placeholders":["discovered_at@vulnerability","patched_at@vulnerability","snapshot_date@vulnerability"]},{"metric":"Security Incident Count","formulaId":"security_incident_count","fields":["incident_id","incident_type","started_at"],"fieldTypes":{"incident_id":"string","incident_type":"string","started_at":"timestamp"},"datasets":["incident"],"source":"Incident Management","frequency":"Per incident","grain":"Per event","exampleQuery":"SELECT (SELECT COUNT(DISTINCT incident_id) FROM incident WHERE started_at >= :period_start AND started_at < (:period_end + INTERVAL '1 day') AND incident_type = 'security') AS security_incident_count","description":"Number of security incidents in a period.","department":"Engineering","staged":false,"placeholders":["incident_id@incident","incident_type@incident","started_at@incident"]},{"metric":"Revenue (GAAP)","formulaId":"revenue_gaap","fields":["period_start","revenue"],"fieldTypes":{"period_start":"date","revenue":"decimal"},"datasets":["financials"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end) AS revenue_gaap","description":"Recognized revenue according to accounting standards.","department":"Finance","staged":false,"placeholders":["period_start@financials","revenue@financials"]},{"metric":"Bookings","formulaId":"bookings","fields":["contract_event_type","event_date","tcv"],"fieldTypes":{"contract_event_type":"string","event_date":"date","tcv":"decimal"},"datasets":["contract_event"],"source":"Billing","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT COALESCE(SUM(tcv), 0) FROM contract_event WHERE event_date >= :period_start AND event_date <= :period_end AND contract_event_type IN ('new_contract', 'renewal', 'amendment')) AS bookings","description":"Total contract value signed in a period.","department":"Finance","staged":false,"placeholders":["contract_event_type@contract_event","event_date@contract_event","tcv@contract_event"]},{"metric":"Billings","formulaId":"billings","fields":["invoice_amount","invoice_date","snapshot_date"],"fieldTypes":{"invoice_amount":"decimal","invoice_date":"date","snapshot_date":"date"},"datasets":["invoice"],"source":"Billing","frequency":"Per transaction","grain":"Per event","exampleQuery":"SELECT (SELECT COALESCE(SUM(invoice_amount), 0) FROM invoice WHERE snapshot_date = :period_end AND (invoice_date >= :period_start AND invoice_date <= :period_end)) AS billings","description":"Amounts invoiced in a period.","department":"Finance","staged":false,"placeholders":["invoice_amount@invoice","invoice_date@invoice","snapshot_date@invoice"]},{"metric":"Consumption Revenue","formulaId":"consumption_revenue","fields":["credit_amount","credit_event_type","event_date"],"fieldTypes":{"credit_amount":"decimal","credit_event_type":"string","event_date":"date"},"datasets":["credit_event"],"source":"Billing","frequency":"Daily sync","grain":"Per credit event, aggregate monthly","exampleQuery":"SELECT (-(SELECT COALESCE(SUM(credit_amount), 0) FROM credit_event WHERE event_date >= :period_start AND event_date <= :period_end AND credit_event_type = 'consumption')) AS consumption_revenue","description":"Revenue earned as customers use the product: consumption drawn from a prepaid balance, billed as overage above a commitment or billed on demand with no commitment.","department":"Finance","staged":false,"placeholders":["credit_amount@credit_event","credit_event_type@credit_event","event_date@credit_event"]},{"metric":"Usage Run-Rate","formulaId":"usage_run_rate","fields":["consumption_basis","credit_amount","credit_event_type","event_date"],"fieldTypes":{"consumption_basis":"string","credit_amount":"decimal","credit_event_type":"string","event_date":"date"},"datasets":["credit_event"],"source":"Billing","frequency":"Monthly","grain":"On-demand consumption in the trailing 3 months ending at period end, annualised","exampleQuery":"SELECT ((-(SELECT COALESCE(SUM(credit_amount), 0) FROM credit_event WHERE event_date >= ((:period_end + INTERVAL '1 day') - INTERVAL '3 month') AND event_date <= :period_end AND (credit_event_type = 'consumption' AND consumption_basis = 'on_demand'))) * 4) AS usage_run_rate","description":"On-demand consumption revenue over the trailing three months, annualised. Also called Usage ARR.","department":"Finance","staged":false,"placeholders":["consumption_basis@credit_event","credit_amount@credit_event","credit_event_type@credit_event","event_date@credit_event"]},{"metric":"Prepaid Credit Balance","formulaId":"prepaid_credit_balance","fields":["consumption_basis","credit_amount","credit_event_type","event_date"],"fieldTypes":{"consumption_basis":"string","credit_amount":"decimal","credit_event_type":"string","event_date":"date"},"datasets":["credit_event"],"source":"Billing","frequency":"Monthly","grain":"Cumulative balance at period end","exampleQuery":"SELECT (SELECT COALESCE(SUM(credit_amount), 0) FROM credit_event WHERE event_date <= :period_end AND (credit_event_type IN ('purchase', 'expiry', 'adjustment') OR consumption_basis = 'committed')) AS prepaid_credit_balance","description":"The prepaid commitment customers have paid for and not yet consumed or forfeited, as of period end. Also called Remaining Commitment.","department":"Finance","staged":false,"placeholders":["consumption_basis@credit_event","credit_amount@credit_event","credit_event_type@credit_event","event_date@credit_event"]},{"metric":"ARR Including Usage Run-Rate","formulaId":"arr_including_usage_run_rate","fields":["consumption_basis","credit_amount","credit_event_type","event_date","mrr","snapshot_date","subscription_status"],"fieldTypes":{"consumption_basis":"string","credit_amount":"decimal","credit_event_type":"string","event_date":"date","mrr":"decimal","snapshot_date":"date","subscription_status":"string"},"datasets":["credit_event","subscription"],"source":"Billing","frequency":"Monthly","grain":"On-demand consumption in the trailing 3 months ending at period end, annualised","exampleQuery":"SELECT (((((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_end AND subscription_status = 'active')) * 12)) + (((-(SELECT COALESCE(SUM(credit_amount), 0) FROM credit_event WHERE event_date >= ((:period_end + INTERVAL '1 day') - INTERVAL '3 month') AND event_date <= :period_end AND (credit_event_type = 'consumption' AND consumption_basis = 'on_demand'))) * 4))) AS arr_including_usage_run_rate","description":"Annual Recurring Revenue (ARR) plus Usage Run-Rate: committed recurring revenue and annualised on-demand usage together. It is the figure Datadog, MongoDB and Confluent report as ARR.","department":"Finance","staged":false,"placeholders":["consumption_basis@credit_event","credit_amount@credit_event","credit_event_type@credit_event","event_date@credit_event","mrr@subscription","snapshot_date@subscription","subscription_status@subscription"]},{"metric":"Credit Breakage","formulaId":"credit_breakage","fields":["credit_amount","credit_event_type","event_date"],"fieldTypes":{"credit_amount":"decimal","credit_event_type":"string","event_date":"date"},"datasets":["credit_event"],"source":"Billing","frequency":"Daily sync","grain":"Per credit event, aggregate monthly","exampleQuery":"SELECT (-(SELECT COALESCE(SUM(credit_amount), 0) FROM credit_event WHERE event_date >= :period_start AND event_date <= :period_end AND credit_event_type = 'expiry')) AS credit_breakage","description":"The prepaid balance forfeited at expiry in the period.","department":"Finance","staged":false,"placeholders":["credit_amount@credit_event","credit_event_type@credit_event","event_date@credit_event"]},{"metric":"Consumption Revenue Growth Rate","formulaId":"consumption_revenue_growth_rate","fields":["credit_amount","credit_event_type","event_date"],"fieldTypes":{"credit_amount":"decimal","credit_event_type":"string","event_date":"date"},"datasets":["credit_event"],"source":"Billing","frequency":"Daily sync","grain":"Per credit event, aggregate monthly","exampleQuery":"SELECT (CAST((((-(SELECT COALESCE(SUM(credit_amount), 0) FROM credit_event WHERE event_date >= :period_start AND event_date <= :period_end AND credit_event_type = 'consumption'))) - ((-(SELECT COALESCE(SUM(credit_amount), 0) FROM credit_event WHERE event_date >= (:period_start - INTERVAL '1 month') AND event_date <= (((:period_end + INTERVAL '1 day') - INTERVAL '1 month') - INTERVAL '1 day') AND credit_event_type = 'consumption')))) AS DOUBLE PRECISION) / NULLIF(((-(SELECT COALESCE(SUM(credit_amount), 0) FROM credit_event WHERE event_date >= (:period_start - INTERVAL '1 month') AND event_date <= (((:period_end + INTERVAL '1 day') - INTERVAL '1 month') - INTERVAL '1 day') AND credit_event_type = 'consumption'))), 0)) AS consumption_revenue_growth_rate","description":"The month-over-month change in Consumption Revenue.","department":"Finance","staged":true,"placeholders":["credit_amount@credit_event","credit_event_type@credit_event","event_date@credit_event"]},{"metric":"Consumption Net Revenue Retention","formulaId":"consumption_net_revenue_retention","fields":["credit_amount","credit_event_type","customer_id","customer_status","event_date","snapshot_date"],"fieldTypes":{"credit_amount":"decimal","credit_event_type":"string","customer_id":"string","customer_status":"string","event_date":"date","snapshot_date":"date"},"datasets":["credit_event","customer"],"source":"Billing","frequency":"Monthly","grain":"Customer cohort at period start","exampleQuery":"SELECT (CAST(((-(SELECT COALESCE(SUM(credit_amount), 0) FROM credit_event WHERE event_date >= :period_start AND event_date <= :period_end AND credit_event_type = 'consumption' AND customer_id IN (SELECT customer_id FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active')))) AS DOUBLE PRECISION) / NULLIF(((-(SELECT COALESCE(SUM(credit_amount), 0) FROM credit_event WHERE event_date >= (:period_start - INTERVAL '12 month') AND event_date <= (((:period_end + INTERVAL '1 day') - INTERVAL '12 month') - INTERVAL '1 day') AND credit_event_type = 'consumption' AND customer_id IN (SELECT customer_id FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active')))), 0)) AS consumption_net_revenue_retention","description":"The consumption revenue of the customers active at period start, over a twelve-month period, divided by the same customers' consumption revenue over the twelve months before. Consumption Net Revenue Retention (Consumption NRR) reads year two over year one, Snowflake's basis.","department":"Finance","staged":true,"placeholders":["credit_amount@credit_event","credit_event_type@credit_event","customer_id@credit_event","customer_id@customer","customer_status@customer","event_date@credit_event","snapshot_date@customer"]},{"metric":"Revenue per Employee","formulaId":"revenue_per_employee","fields":["employee_id","employee_status","mrr","snapshot_date","subscription_status"],"fieldTypes":{"employee_id":"string","employee_status":"string","mrr":"decimal","snapshot_date":"date","subscription_status":"string"},"datasets":["employee","subscription"],"source":"HRIS","frequency":"Monthly","grain":"End-of-month snapshot","exampleQuery":"SELECT (CAST(((((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_end AND subscription_status = 'active')) * 12)) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND employee_status = 'active')), 0)) AS revenue_per_employee","description":"Annual Recurring Revenue (ARR) divided by total headcount.","department":"Finance","staged":false,"placeholders":["employee_id@employee","employee_status@employee","mrr@subscription","snapshot_date@employee","snapshot_date@subscription","subscription_status@subscription"]},{"metric":"Operating Margin (EBIT Margin)","formulaId":"operating_margin","fields":["cost","cost_function","event_date","period_start","revenue"],"fieldTypes":{"cost":"decimal","cost_function":"string","event_date":"date","period_start":"date","revenue":"decimal"},"datasets":["cost_event","financials"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (((CAST(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end) - (SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'infrastructure')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end), 0))) - ((CAST((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function <> 'infrastructure') AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end)), 0)))) AS operating_margin","description":"Operating income as a percentage of revenue.","department":"Finance","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","period_start@financials","revenue@financials"]},{"metric":"EBITDA Margin","formulaId":"ebitda_margin","fields":["ebitda","period_start","revenue"],"fieldTypes":{"ebitda":"decimal","period_start":"date","revenue":"decimal"},"datasets":["financials"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(ebitda), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end)), 0)) AS ebitda_margin","description":"Earnings before interest, taxes, depreciation and amortization as a percentage of revenue.","department":"Finance","staged":false,"placeholders":["ebitda@financials","period_start@financials","revenue@financials"]},{"metric":"Net Income Margin","formulaId":"net_income_margin","fields":["net_income","period_start","revenue"],"fieldTypes":{"net_income":"decimal","period_start":"date","revenue":"decimal"},"datasets":["financials"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(net_income), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end)), 0)) AS net_income_margin","description":"Net income as a percentage of revenue.","department":"Finance","staged":false,"placeholders":["net_income@financials","period_start@financials","revenue@financials"]},{"metric":"Cash Burn Rate","formulaId":"burn_rate","fields":["cash_balance","snapshot_date"],"fieldTypes":{"cash_balance":"decimal","snapshot_date":"date"},"datasets":["balance_sheet"],"source":"Finance / ERP","frequency":"Monthly","grain":"End-of-month snapshot","exampleQuery":"SELECT (CAST(((SELECT COALESCE(SUM(cash_balance), 0) FROM balance_sheet WHERE snapshot_date = :period_start) - (SELECT COALESCE(SUM(cash_balance), 0) FROM balance_sheet WHERE snapshot_date = :period_end)) AS DOUBLE PRECISION) / NULLIF((CAST((:period_end - :period_start + 1) AS DOUBLE PRECISION) / 30.4375), 0)) AS burn_rate","description":"Net cash consumed per month.","department":"Finance","staged":false,"placeholders":["cash_balance@balance_sheet","snapshot_date@balance_sheet"]},{"metric":"Cash Runway","formulaId":"cash_runway","fields":["cash_balance","snapshot_date"],"fieldTypes":{"cash_balance":"decimal","snapshot_date":"date"},"datasets":["balance_sheet"],"source":"Finance / ERP","frequency":"Monthly","grain":"End-of-month snapshot","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(cash_balance), 0) FROM balance_sheet WHERE snapshot_date = :period_end) AS DOUBLE PRECISION) / NULLIF(((CAST(((SELECT COALESCE(SUM(cash_balance), 0) FROM balance_sheet WHERE snapshot_date = :period_start) - (SELECT COALESCE(SUM(cash_balance), 0) FROM balance_sheet WHERE snapshot_date = :period_end)) AS DOUBLE PRECISION) / NULLIF((CAST((:period_end - :period_start + 1) AS DOUBLE PRECISION) / 30.4375), 0))), 0)) AS cash_runway","description":"Time until cash runs out at current burn rate.","department":"Finance","staged":false,"placeholders":["cash_balance@balance_sheet","snapshot_date@balance_sheet"]},{"metric":"Free Cash Flow (FCF)","formulaId":"fcf","fields":["capital_expenditures","operating_cash_flow","period_start"],"fieldTypes":{"capital_expenditures":"decimal","operating_cash_flow":"decimal","period_start":"date"},"datasets":["financials"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT ((SELECT COALESCE(SUM(operating_cash_flow), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end) - (SELECT COALESCE(SUM(capital_expenditures), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end)) AS fcf","description":"Cash generated from operations minus capital expenditures.","department":"Finance","staged":false,"placeholders":["capital_expenditures@financials","operating_cash_flow@financials","period_start@financials"]},{"metric":"Free Cash Flow Margin","formulaId":"free_cash_flow_margin","fields":["capital_expenditures","operating_cash_flow","period_start","revenue"],"fieldTypes":{"capital_expenditures":"decimal","operating_cash_flow":"decimal","period_start":"date","revenue":"decimal"},"datasets":["financials"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((((SELECT COALESCE(SUM(operating_cash_flow), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end) - (SELECT COALESCE(SUM(capital_expenditures), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end)), 0)) AS free_cash_flow_margin","description":"FCF as a percentage of revenue.","department":"Finance","staged":false,"placeholders":["capital_expenditures@financials","operating_cash_flow@financials","period_start@financials","revenue@financials"]},{"metric":"Magic Number","formulaId":"magic_number","fields":["cost","cost_function","event_date","mrr","snapshot_date","subscription_status"],"fieldTypes":{"cost":"decimal","cost_function":"string","event_date":"date","mrr":"decimal","snapshot_date":"date","subscription_status":"string"},"datasets":["cost_event","subscription"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((((((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_end AND subscription_status = 'active')) * 12)) - ((((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = (((:period_end + INTERVAL '1 day') - INTERVAL '3 month') - INTERVAL '1 day') AND subscription_status = 'active')) * 12))) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= (((((:period_end + INTERVAL '1 day') - INTERVAL '3 month') - INTERVAL '1 day') + INTERVAL '1 day') - INTERVAL '3 month') AND event_date <= (((:period_end + INTERVAL '1 day') - INTERVAL '3 month') - INTERVAL '1 day') AND cost_function = 'gtm'), 0)) AS magic_number","description":"Sales efficiency metric measuring revenue generated per dollar of sales and marketing spend.","department":"Finance","staged":true,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","mrr@subscription","snapshot_date@subscription","subscription_status@subscription"]},{"metric":"Burn Multiple","formulaId":"burn_multiple","fields":["cash_balance","event_date","event_type","mrr_change","snapshot_date"],"fieldTypes":{"cash_balance":"decimal","event_date":"date","event_type":"string","mrr_change":"decimal","snapshot_date":"date"},"datasets":["balance_sheet","revenue_event"],"source":"Billing","frequency":"Monthly","grain":"End-of-month snapshot","exampleQuery":"SELECT (CAST(((CAST(((SELECT COALESCE(SUM(cash_balance), 0) FROM balance_sheet WHERE snapshot_date = :period_start) - (SELECT COALESCE(SUM(cash_balance), 0) FROM balance_sheet WHERE snapshot_date = :period_end)) AS DOUBLE PRECISION) / NULLIF((CAST((:period_end - :period_start + 1) AS DOUBLE PRECISION) / 30.4375), 0))) AS DOUBLE PRECISION) / NULLIF(((((((((SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'new')) + ((SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'expansion'))) + ((SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'reactivation'))) - ((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'churn')))) - ((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'contraction'))))) * 12), 0)) AS burn_multiple","description":"Net burn divided by net new ARR. Popularized by David Sacks.","department":"Finance","staged":false,"placeholders":["cash_balance@balance_sheet","event_date@revenue_event","event_type@revenue_event","mrr_change@revenue_event","snapshot_date@balance_sheet"]},{"metric":"Opex Ratio","formulaId":"opex_ratio","fields":["cost","cost_function","event_date","period_start","revenue"],"fieldTypes":{"cost":"decimal","cost_function":"string","event_date":"date","period_start":"date","revenue":"decimal"},"datasets":["cost_event","financials"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function <> 'infrastructure') AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end)), 0)) AS opex_ratio","description":"Operating expenses as a percentage of revenue.","department":"Finance","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","period_start@financials","revenue@financials"]},{"metric":"S&M as % of Revenue","formulaId":"sm_as_of_revenue","fields":["cost","cost_function","event_date","period_start","revenue"],"fieldTypes":{"cost":"decimal","cost_function":"string","event_date":"date","period_start":"date","revenue":"decimal"},"datasets":["cost_event","financials"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'gtm') AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end)), 0)) AS sm_as_of_revenue","description":"Sales and marketing spend as percentage of revenue.","department":"Finance","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","period_start@financials","revenue@financials"]},{"metric":"R&D as % of Revenue","formulaId":"rd_as_of_revenue","fields":["cost","cost_function","event_date","period_start","revenue"],"fieldTypes":{"cost":"decimal","cost_function":"string","event_date":"date","period_start":"date","revenue":"decimal"},"datasets":["cost_event","financials"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'research_development') AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end)), 0)) AS rd_as_of_revenue","description":"Research and development spend as percentage of revenue.","department":"Finance","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","period_start@financials","revenue@financials"]},{"metric":"G&A as % of Revenue","formulaId":"ga_as_of_revenue","fields":["cost","cost_function","event_date","period_start","revenue"],"fieldTypes":{"cost":"decimal","cost_function":"string","event_date":"date","period_start":"date","revenue":"decimal"},"datasets":["cost_event","financials"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'general_administrative') AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end)), 0)) AS ga_as_of_revenue","description":"General and administrative spend as percentage of revenue.","department":"Finance","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","period_start@financials","revenue@financials"]},{"metric":"Collection Rate","formulaId":"collection_rate","fields":["invoice_amount","invoice_date","payment_date","snapshot_date"],"fieldTypes":{"invoice_amount":"decimal","invoice_date":"date","payment_date":"date","snapshot_date":"date"},"datasets":["invoice"],"source":"Billing","frequency":"Per transaction","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(invoice_amount), 0) FROM invoice WHERE snapshot_date = :period_end AND ((invoice_date >= :period_start AND invoice_date <= :period_end) AND payment_date IS NOT NULL)) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(invoice_amount), 0) FROM invoice WHERE snapshot_date = :period_end AND (invoice_date >= :period_start AND invoice_date <= :period_end))), 0)) AS collection_rate","description":"Percentage of invoiced amounts collected.","department":"Finance","staged":false,"placeholders":["invoice_amount@invoice","invoice_date@invoice","payment_date@invoice","snapshot_date@invoice"]},{"metric":"Bad Debt Rate","formulaId":"bad_debt_rate","fields":["bad_debt_expense","period_start","revenue"],"fieldTypes":{"bad_debt_expense":"decimal","period_start":"date","revenue":"decimal"},"datasets":["financials"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(bad_debt_expense), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end)), 0)) AS bad_debt_rate","description":"Percentage of revenue written off as uncollectable.","department":"Finance","staged":false,"placeholders":["bad_debt_expense@financials","period_start@financials","revenue@financials"]},{"metric":"Visitors","formulaId":"visitors","fields":["period_start","unique_visitors"],"fieldTypes":{"period_start":"date","unique_visitors":"integer"},"datasets":["web_traffic"],"source":"Web Analytics","frequency":"Daily","grain":"Daily aggregate","exampleQuery":"SELECT (SELECT COALESCE(SUM(unique_visitors), 0) FROM web_traffic WHERE period_start >= :period_start AND period_start <= :period_end) AS visitors","description":"Unique visitors to owned properties (website, app).","department":"Marketing","staged":false,"placeholders":["period_start@web_traffic","unique_visitors@web_traffic"]},{"metric":"Visitor-to-Lead Rate","formulaId":"visitor_to_lead_rate","fields":["lead_created_date","lead_id","period_start","snapshot_date","unique_visitors"],"fieldTypes":{"lead_created_date":"date","lead_id":"string","period_start":"date","snapshot_date":"date","unique_visitors":"integer"},"datasets":["lead","web_traffic"],"source":"CRM","frequency":"Daily","grain":"Daily aggregate","exampleQuery":"SELECT (CAST(((SELECT COUNT(DISTINCT lead_id) FROM lead WHERE snapshot_date = :period_end AND (lead_created_date >= :period_start AND lead_created_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(unique_visitors), 0) FROM web_traffic WHERE period_start >= :period_start AND period_start <= :period_end)), 0)) AS visitor_to_lead_rate","description":"Percentage of website visitors who become leads.","department":"Marketing","staged":false,"placeholders":["lead_created_date@lead","lead_id@lead","period_start@web_traffic","snapshot_date@lead","unique_visitors@web_traffic"]},{"metric":"Leads","formulaId":"leads","fields":["lead_created_date","lead_id","snapshot_date"],"fieldTypes":{"lead_created_date":"date","lead_id":"string","snapshot_date":"date"},"datasets":["lead"],"source":"CRM","frequency":"Daily","grain":"Per lead stage date, aggregate daily","exampleQuery":"SELECT (SELECT COUNT(DISTINCT lead_id) FROM lead WHERE snapshot_date = :period_end AND (lead_created_date >= :period_start AND lead_created_date <= :period_end)) AS leads","description":"Contacts who have expressed interest (form fill, signup, etc.).","department":"Marketing","staged":false,"placeholders":["lead_created_date@lead","lead_id@lead","snapshot_date@lead"]},{"metric":"Marketing Qualified Leads (MQLs)","formulaId":"mqls","fields":["lead_id","mql_date","snapshot_date"],"fieldTypes":{"lead_id":"string","mql_date":"date","snapshot_date":"date"},"datasets":["lead"],"source":"Marketing Automation","frequency":"Daily","grain":"Per lead stage date, aggregate daily","exampleQuery":"SELECT (SELECT COUNT(DISTINCT lead_id) FROM lead WHERE snapshot_date = :period_end AND (mql_date >= :period_start AND mql_date <= :period_end)) AS mqls","description":"Leads that have demonstrated sufficient engagement and intent to warrant sales attention, based on criteria established between marketing and sales.","department":"Marketing","staged":false,"placeholders":["lead_id@lead","mql_date@lead","snapshot_date@lead"]},{"metric":"Lead-to-MQL Rate","formulaId":"lead_to_mql_rate","fields":["lead_created_date","lead_id","mql_date","snapshot_date"],"fieldTypes":{"lead_created_date":"date","lead_id":"string","mql_date":"date","snapshot_date":"date"},"datasets":["lead"],"source":"Marketing Automation","frequency":"Daily","grain":"Per lead stage date, aggregate daily","exampleQuery":"SELECT (CAST(((SELECT COUNT(DISTINCT lead_id) FROM lead WHERE snapshot_date = :period_end AND (mql_date >= :period_start AND mql_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM lead WHERE snapshot_date = :period_end AND (lead_created_date >= :period_start AND lead_created_date <= :period_end))), 0)) AS lead_to_mql_rate","description":"Percentage of leads that become MQLs.","department":"Marketing","staged":false,"placeholders":["lead_created_date@lead","lead_id@lead","mql_date@lead","snapshot_date@lead"]},{"metric":"Sales Qualified Leads (SQLs)","formulaId":"sqls","fields":["lead_id","snapshot_date","sql_date"],"fieldTypes":{"lead_id":"string","snapshot_date":"date","sql_date":"date"},"datasets":["lead"],"source":"CRM","frequency":"Daily","grain":"Per lead stage date, aggregate daily","exampleQuery":"SELECT (SELECT COUNT(DISTINCT lead_id) FROM lead WHERE snapshot_date = :period_end AND (sql_date >= :period_start AND sql_date <= :period_end)) AS sqls","description":"MQLs accepted by sales as worth pursuing.","department":"Marketing","staged":false,"placeholders":["lead_id@lead","snapshot_date@lead","sql_date@lead"]},{"metric":"MQL-to-SQL Rate","formulaId":"mql_to_sql_rate","fields":["lead_id","mql_date","snapshot_date","sql_date"],"fieldTypes":{"lead_id":"string","mql_date":"date","snapshot_date":"date","sql_date":"date"},"datasets":["lead"],"source":"CRM","frequency":"Daily","grain":"Per lead stage date, aggregate daily","exampleQuery":"SELECT (CAST(((SELECT COUNT(DISTINCT lead_id) FROM lead WHERE snapshot_date = :period_end AND (sql_date >= :period_start AND sql_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM lead WHERE snapshot_date = :period_end AND (mql_date >= :period_start AND mql_date <= :period_end))), 0)) AS mql_to_sql_rate","description":"Percentage of MQLs accepted by sales as qualified.","department":"Marketing","staged":false,"placeholders":["lead_id@lead","mql_date@lead","snapshot_date@lead","sql_date@lead"]},{"metric":"SQL-to-Opportunity Rate","formulaId":"sql_to_opportunity_rate","fields":["lead_id","opportunity_created_date","opportunity_id","snapshot_date","sql_date"],"fieldTypes":{"lead_id":"string","opportunity_created_date":"date","opportunity_id":"string","snapshot_date":"date","sql_date":"date"},"datasets":["lead","opportunity"],"source":"CRM","frequency":"Daily","grain":"Per lead stage date, aggregate daily","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND (opportunity_created_date >= :period_start AND opportunity_created_date <= :period_end)) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM lead WHERE snapshot_date = :period_end AND (sql_date >= :period_start AND sql_date <= :period_end))), 0)) AS sql_to_opportunity_rate","description":"Percentage of SQLs that become pipeline opportunities.","department":"Marketing","staged":false,"placeholders":["lead_id@lead","opportunity_created_date@opportunity","opportunity_id@opportunity","snapshot_date@lead","snapshot_date@opportunity","sql_date@lead"]},{"metric":"Lead Velocity Rate (LVR)","formulaId":"lvr","fields":["lead_id","mql_date","snapshot_date"],"fieldTypes":{"lead_id":"string","mql_date":"date","snapshot_date":"date"},"datasets":["lead"],"source":"Marketing Automation","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((((SELECT COUNT(DISTINCT lead_id) FROM lead WHERE snapshot_date = :period_end AND (mql_date >= :period_start AND mql_date <= :period_end))) - ((SELECT COUNT(DISTINCT lead_id) FROM lead WHERE snapshot_date = (((:period_end + INTERVAL '1 day') - INTERVAL '1 month') - INTERVAL '1 day') AND (mql_date >= (:period_start - INTERVAL '1 month') AND mql_date <= (((:period_end + INTERVAL '1 day') - INTERVAL '1 month') - INTERVAL '1 day'))))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM lead WHERE snapshot_date = (((:period_end + INTERVAL '1 day') - INTERVAL '1 month') - INTERVAL '1 day') AND (mql_date >= (:period_start - INTERVAL '1 month') AND mql_date <= (((:period_end + INTERVAL '1 day') - INTERVAL '1 month') - INTERVAL '1 day')))), 0)) AS lvr","description":"Month-over-month growth in qualified leads (MQLs).","department":"Marketing","staged":true,"placeholders":["lead_id@lead","mql_date@lead","snapshot_date@lead"]},{"metric":"Marketing CAC","formulaId":"marketing_cac","fields":["cost","cost_centre","cost_function","customer_id","event_date","event_type"],"fieldTypes":{"cost":"decimal","cost_centre":"string","cost_function":"string","customer_id":"string","event_date":"date","event_type":"string"},"datasets":["cost_event","revenue_event"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND (cost_function = 'gtm' AND cost_centre = 'marketing')) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'new'), 0)) AS marketing_cac","description":"Marketing-only portion of acquisition cost: go-to-market cost booked to the marketing cost centre, divided by all new customers in the period.","department":"Marketing","staged":false,"placeholders":["cost@cost_event","cost_centre@cost_event","cost_function@cost_event","customer_id@revenue_event","event_date@cost_event","event_date@revenue_event","event_type@revenue_event"]},{"metric":"CAC by Channel","formulaId":"cac_by_channel","fields":["ad_spend","channel","close_date","opportunity_id","opportunity_stage","period_start","snapshot_date"],"fieldTypes":{"ad_spend":"decimal","channel":"string","close_date":"date","opportunity_id":"string","opportunity_stage":"string","period_start":"date","snapshot_date":"date"},"datasets":["campaign","opportunity"],"source":"CRM","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT _d.channel AS channel, (CAST((SELECT COALESCE(SUM(ad_spend), 0) FROM campaign WHERE period_start >= :period_start AND period_start <= :period_end AND channel = _d.channel) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND (opportunity_stage = 'closed_won' AND (close_date >= :period_start AND close_date <= :period_end)) AND channel = _d.channel), 0)) AS cac_by_channel\nFROM (SELECT 'paid_ads' AS channel UNION ALL SELECT 'organic_search' AS channel UNION ALL SELECT 'email' AS channel UNION ALL SELECT 'events' AS channel UNION ALL SELECT 'content' AS channel UNION ALL SELECT 'referral' AS channel UNION ALL SELECT 'marketplace' AS channel UNION ALL SELECT 'direct' AS channel UNION ALL SELECT 'other' AS channel) _d","description":"Customer acquisition cost broken down by marketing channel.","department":"Marketing","staged":false,"placeholders":["ad_spend@campaign","channel@campaign","channel@opportunity","close_date@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","period_start@campaign","snapshot_date@opportunity"],"breakdown":{"field":"channel"}},{"metric":"Cost per Lead (CPL)","formulaId":"cpl","fields":["cost","cost_centre","cost_function","event_date","lead_created_date","lead_id","snapshot_date"],"fieldTypes":{"cost":"decimal","cost_centre":"string","cost_function":"string","event_date":"date","lead_created_date":"date","lead_id":"string","snapshot_date":"date"},"datasets":["cost_event","lead"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND (cost_function = 'gtm' AND cost_centre = 'marketing')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM lead WHERE snapshot_date = :period_end AND (lead_created_date >= :period_start AND lead_created_date <= :period_end))), 0)) AS cpl","description":"Cost to acquire a lead.","department":"Marketing","staged":false,"placeholders":["cost@cost_event","cost_centre@cost_event","cost_function@cost_event","event_date@cost_event","lead_created_date@lead","lead_id@lead","snapshot_date@lead"]},{"metric":"Cost per MQL","formulaId":"cost_per_mql","fields":["cost","cost_centre","cost_function","event_date","lead_id","mql_date","snapshot_date"],"fieldTypes":{"cost":"decimal","cost_centre":"string","cost_function":"string","event_date":"date","lead_id":"string","mql_date":"date","snapshot_date":"date"},"datasets":["cost_event","lead"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND (cost_function = 'gtm' AND cost_centre = 'marketing')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM lead WHERE snapshot_date = :period_end AND (mql_date >= :period_start AND mql_date <= :period_end))), 0)) AS cost_per_mql","description":"Cost to acquire a marketing qualified lead.","department":"Marketing","staged":false,"placeholders":["cost@cost_event","cost_centre@cost_event","cost_function@cost_event","event_date@cost_event","lead_id@lead","mql_date@lead","snapshot_date@lead"]},{"metric":"Marketing Sourced Pipeline","formulaId":"marketing_sourced_pipeline","fields":["marketing_source","opportunity_amount","opportunity_stage","snapshot_date"],"fieldTypes":{"marketing_source":"string","opportunity_amount":"decimal","opportunity_stage":"string","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Daily","grain":"Daily snapshot","exampleQuery":"SELECT (SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND (marketing_source = 'marketing' AND opportunity_stage NOT IN ('closed_won', 'closed_lost'))) AS marketing_sourced_pipeline","description":"Pipeline value attributed to marketing efforts (first-touch attribution).","department":"Marketing","staged":false,"placeholders":["marketing_source@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},{"metric":"Marketing Sourced Revenue","formulaId":"marketing_sourced_revenue","fields":["close_date","marketing_source","opportunity_amount","opportunity_stage","snapshot_date"],"fieldTypes":{"close_date":"date","marketing_source":"string","opportunity_amount":"decimal","opportunity_stage":"string","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND ((marketing_source = 'marketing' AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end))) AS marketing_sourced_revenue","description":"Closed revenue attributed to marketing efforts (first-touch attribution).","department":"Marketing","staged":false,"placeholders":["close_date@opportunity","marketing_source@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},{"metric":"Marketing Influenced Pipeline/Revenue","formulaId":"marketing_influenced_pipelinerevenue","fields":["marketing_influenced","opportunity_amount","opportunity_stage","snapshot_date"],"fieldTypes":{"marketing_influenced":"boolean","opportunity_amount":"decimal","opportunity_stage":"string","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Daily","grain":"Daily snapshot","exampleQuery":"SELECT (SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND (marketing_influenced = TRUE AND opportunity_stage NOT IN ('closed_won', 'closed_lost'))) AS marketing_influenced_pipelinerevenue","description":"Pipeline or revenue where marketing touched the deal at any point (multi-touch attribution).","department":"Marketing","staged":false,"placeholders":["marketing_influenced@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},{"metric":"Organic Traffic","formulaId":"organic_traffic","fields":["period_start","traffic_source","unique_visitors"],"fieldTypes":{"period_start":"date","traffic_source":"string","unique_visitors":"integer"},"datasets":["web_traffic"],"source":"Web Analytics","frequency":"Daily","grain":"Daily aggregate","exampleQuery":"SELECT (SELECT COALESCE(SUM(unique_visitors), 0) FROM web_traffic WHERE period_start >= :period_start AND period_start <= :period_end AND traffic_source = 'organic_search') AS organic_traffic","description":"Visitors from unpaid search.","department":"Marketing","staged":false,"placeholders":["period_start@web_traffic","traffic_source@web_traffic","unique_visitors@web_traffic"]},{"metric":"Paid Media Efficiency (ROAS)","formulaId":"paid_media_efficiency_roas","fields":["ad_spend","channel","close_date","opportunity_amount","opportunity_stage","period_start","snapshot_date"],"fieldTypes":{"ad_spend":"decimal","channel":"string","close_date":"date","opportunity_amount":"decimal","opportunity_stage":"string","period_start":"date","snapshot_date":"date"},"datasets":["campaign","opportunity"],"source":"CRM","frequency":"Daily","grain":"Daily aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND ((channel = 'paid_ads' AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(ad_spend), 0) FROM campaign WHERE period_start >= :period_start AND period_start <= :period_end AND channel = 'paid_ads'), 0)) AS paid_media_efficiency_roas","description":"Return on ad spend: closed won revenue from the paid ads channel in the period, divided by paid ad spend.","department":"Marketing","staged":false,"placeholders":["ad_spend@campaign","channel@campaign","channel@opportunity","close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","period_start@campaign","snapshot_date@opportunity"]},{"metric":"Share of Voice","formulaId":"share_of_voice","fields":["is_competitor","mention_count","period_start"],"fieldTypes":{"is_competitor":"boolean","mention_count":"integer","period_start":"date"},"datasets":["brand_mention"],"source":"Web Analytics","frequency":"Daily","grain":"Daily aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(mention_count), 0) FROM brand_mention WHERE period_start >= :period_start AND period_start <= :period_end AND is_competitor = FALSE) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(mention_count), 0) FROM brand_mention WHERE period_start >= :period_start AND period_start <= :period_end), 0)) AS share_of_voice","description":"Brand mentions relative to competitors.","department":"Marketing","staged":false,"placeholders":["is_competitor@brand_mention","mention_count@brand_mention","period_start@brand_mention"]},{"metric":"NPS (Marketing context)","formulaId":"nps_marketing_context","fields":["nps_score","survey_date","survey_type"],"fieldTypes":{"nps_score":"integer","survey_date":"date","survey_type":"string"},"datasets":["survey_response"],"source":"Survey Tool","frequency":"Per response","grain":"Per survey response","exampleQuery":"SELECT ((CAST(((SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND (survey_type = 'prospect' AND nps_score >= 9)) - (SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND (survey_type = 'prospect' AND nps_score <= 6))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND survey_type = 'prospect'), 0)) * 100) AS nps_marketing_context","description":"Net Promoter Score for prospects/market (vs customers).","department":"Marketing","staged":false,"placeholders":["nps_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},{"metric":"Time to First Value (TTFV)","formulaId":"ttfv","fields":["contract_start","milestone_date","onboarding_milestone"],"fieldTypes":{"contract_start":"date","milestone_date":"date","onboarding_milestone":"string"},"datasets":["onboarding_milestone"],"source":"CS Platform","frequency":"Daily","grain":"Per event","exampleQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (milestone_date - contract_start)) FROM onboarding_milestone WHERE milestone_date >= :period_start AND milestone_date <= :period_end AND onboarding_milestone = 'first_value') AS ttfv","description":"Time from contract start to the customer's first meaningful value milestone.","department":"Onboarding","staged":false,"placeholders":["contract_start@onboarding_milestone","milestone_date@onboarding_milestone","onboarding_milestone@onboarding_milestone"]},{"metric":"Time to Go-Live","formulaId":"time_to_go_live","fields":["contract_start","milestone_date","onboarding_milestone"],"fieldTypes":{"contract_start":"date","milestone_date":"date","onboarding_milestone":"string"},"datasets":["onboarding_milestone"],"source":"CS Platform","frequency":"Daily","grain":"Per event","exampleQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (milestone_date - contract_start)) FROM onboarding_milestone WHERE milestone_date >= :period_start AND milestone_date <= :period_end AND onboarding_milestone = 'go_live') AS time_to_go_live","description":"Time from contract to production deployment.","department":"Onboarding","staged":false,"placeholders":["contract_start@onboarding_milestone","milestone_date@onboarding_milestone","onboarding_milestone@onboarding_milestone"]},{"metric":"Time to Full Adoption","formulaId":"time_to_full_adoption","fields":["contract_start","milestone_date","onboarding_milestone"],"fieldTypes":{"contract_start":"date","milestone_date":"date","onboarding_milestone":"string"},"datasets":["onboarding_milestone"],"source":"CS Platform","frequency":"Daily","grain":"Per event","exampleQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (milestone_date - contract_start)) FROM onboarding_milestone WHERE milestone_date >= :period_start AND milestone_date <= :period_end AND onboarding_milestone = 'full_adoption') AS time_to_full_adoption","description":"Time from contract to using all purchased features/modules.","department":"Onboarding","staged":false,"placeholders":["contract_start@onboarding_milestone","milestone_date@onboarding_milestone","onboarding_milestone@onboarding_milestone"]},{"metric":"Onboarding Duration","formulaId":"onboarding_duration","fields":["onboarding_completion_date","onboarding_start_date","snapshot_date"],"fieldTypes":{"onboarding_completion_date":"date","onboarding_start_date":"date","snapshot_date":"date"},"datasets":["onboarding"],"source":"CS Platform","frequency":"Per onboarding","grain":"Per event","exampleQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (onboarding_completion_date - onboarding_start_date)) FROM onboarding WHERE snapshot_date = :period_end AND (onboarding_completion_date >= :period_start AND onboarding_completion_date <= :period_end)) AS onboarding_duration","description":"Time from onboarding start to onboarding completion, for onboardings completed in the period.","department":"Onboarding","staged":false,"placeholders":["onboarding_completion_date@onboarding","onboarding_start_date@onboarding","snapshot_date@onboarding"]},{"metric":"Onboarding Completion Rate","formulaId":"onboarding_completion","fields":["onboarding_completion_date","onboarding_id","onboarding_start_date","snapshot_date"],"fieldTypes":{"onboarding_completion_date":"date","onboarding_id":"string","onboarding_start_date":"date","snapshot_date":"date"},"datasets":["onboarding"],"source":"CS Platform","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT onboarding_id) FROM onboarding WHERE snapshot_date = :period_end AND (onboarding_completion_date >= :period_start AND onboarding_completion_date <= :period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM onboarding WHERE snapshot_date = :period_end AND (onboarding_start_date >= :period_start AND onboarding_start_date <= :period_end)), 0)) AS onboarding_completion","description":"Percentage of customers who complete the onboarding program.","department":"Onboarding","staged":false,"placeholders":["onboarding_completion_date@onboarding","onboarding_id@onboarding","onboarding_start_date@onboarding","snapshot_date@onboarding"]},{"metric":"Onboarding Milestone Completion Rate","formulaId":"onboarding_milestone_completion_rate","fields":["milestone_date","milestone_due_date","onboarding_id"],"fieldTypes":{"milestone_date":"date","milestone_due_date":"date","onboarding_id":"string"},"datasets":["onboarding_milestone"],"source":"CS Platform","frequency":"Per milestone","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(onboarding_id) FROM onboarding_milestone WHERE (((milestone_due_date >= :period_start AND milestone_due_date <= :period_end) AND milestone_date IS NOT NULL) AND milestone_date <= :period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(onboarding_id) FROM onboarding_milestone WHERE (milestone_due_date >= :period_start AND milestone_due_date <= :period_end)), 0)) AS onboarding_milestone_completion_rate","description":"Percentage of due onboarding milestones that customers reach.","department":"Onboarding","staged":false,"placeholders":["milestone_date@onboarding_milestone","milestone_due_date@onboarding_milestone","onboarding_id@onboarding_milestone"]},{"metric":"On-Time Completion Rate","formulaId":"on_time_completion_rate","fields":["onboarding_completion_date","onboarding_id","snapshot_date","target_date"],"fieldTypes":{"onboarding_completion_date":"date","onboarding_id":"string","snapshot_date":"date","target_date":"date"},"datasets":["onboarding"],"source":"CS Platform","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT onboarding_id) FROM onboarding WHERE snapshot_date = :period_end AND ((onboarding_completion_date >= :period_start AND onboarding_completion_date <= :period_end) AND onboarding_completion_date <= target_date)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM onboarding WHERE snapshot_date = :period_end AND (onboarding_completion_date >= :period_start AND onboarding_completion_date <= :period_end)), 0)) AS on_time_completion_rate","description":"Percentage of customers completing onboarding within target timeframe.","department":"Onboarding","staged":false,"placeholders":["onboarding_completion_date@onboarding","onboarding_id@onboarding","snapshot_date@onboarding","target_date@onboarding"]},{"metric":"Session Attendance Rate","formulaId":"session_attendance_rate","fields":["attendees","onboarding_session_date"],"fieldTypes":{"attendees":"integer","onboarding_session_date":"date"},"datasets":["onboarding_session"],"source":"CS Platform","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(onboarding_session_date) FROM onboarding_session WHERE onboarding_session_date >= :period_start AND onboarding_session_date <= :period_end AND attendees > 0) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(onboarding_session_date) FROM onboarding_session WHERE onboarding_session_date >= :period_start AND onboarding_session_date <= :period_end), 0)) AS session_attendance_rate","description":"Percentage of scheduled onboarding sessions attended.","department":"Onboarding","staged":false,"placeholders":["attendees@onboarding_session","onboarding_session_date@onboarding_session"]},{"metric":"Task Completion Rate","formulaId":"task_completion_rate","fields":["snapshot_date","steps_completed","steps_total"],"fieldTypes":{"snapshot_date":"date","steps_completed":"integer","steps_total":"integer"},"datasets":["onboarding"],"source":"CS Platform","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(steps_completed), 0) FROM onboarding WHERE snapshot_date = :period_end) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(steps_total), 0) FROM onboarding WHERE snapshot_date = :period_end), 0)) AS task_completion_rate","description":"Percentage of assigned onboarding tasks completed by customer.","department":"Onboarding","staged":false,"placeholders":["snapshot_date@onboarding","steps_completed@onboarding","steps_total@onboarding"]},{"metric":"Onboarding CSAT","formulaId":"onboarding_csat","fields":["satisfaction_score","survey_date","survey_type"],"fieldTypes":{"satisfaction_score":"integer","survey_date":"date","survey_type":"string"},"datasets":["survey_response"],"source":"Survey Tool","frequency":"Per response","grain":"Per survey response","exampleQuery":"SELECT (CAST((SELECT COUNT(satisfaction_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND (survey_type = 'onboarding' AND satisfaction_score >= 4)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(satisfaction_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND survey_type = 'onboarding'), 0)) AS onboarding_csat","description":"Customer satisfaction with the onboarding experience.","department":"Onboarding","staged":false,"placeholders":["satisfaction_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},{"metric":"Onboarding NPS","formulaId":"onboarding_nps","fields":["nps_score","survey_date","survey_type"],"fieldTypes":{"nps_score":"integer","survey_date":"date","survey_type":"string"},"datasets":["survey_response"],"source":"Survey Tool","frequency":"Per response","grain":"Per survey response","exampleQuery":"SELECT ((CAST(((SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND (survey_type = 'onboarding' AND nps_score >= 9)) - (SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND (survey_type = 'onboarding' AND nps_score <= 6))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND survey_type = 'onboarding'), 0)) * 100) AS onboarding_nps","description":"Net Promoter Score specifically for onboarding experience.","department":"Onboarding","staged":false,"placeholders":["nps_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},{"metric":"Onboardings per Resource","formulaId":"onboardings_per_resource","fields":["onboarding_completion_date","onboarding_id","resource_id","snapshot_date"],"fieldTypes":{"onboarding_completion_date":"date","onboarding_id":"string","resource_id":"string","snapshot_date":"date"},"datasets":["onboarding"],"source":"CS Platform","frequency":"Per onboarding","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT onboarding_id) FROM onboarding WHERE snapshot_date = :period_end AND (onboarding_completion_date >= :period_start AND onboarding_completion_date <= :period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT resource_id) FROM onboarding WHERE snapshot_date = :period_end AND (onboarding_completion_date >= :period_start AND onboarding_completion_date <= :period_end)), 0)) AS onboardings_per_resource","description":"Number of onboardings handled per implementation resource.","department":"Onboarding","staged":false,"placeholders":["onboarding_completion_date@onboarding","onboarding_id@onboarding","resource_id@onboarding","snapshot_date@onboarding"]},{"metric":"Cost per Onboarding","formulaId":"cost_per_onboarding","fields":["cost","cost_function","event_date","onboarding_completion_date","onboarding_id","snapshot_date"],"fieldTypes":{"cost":"decimal","cost_function":"string","event_date":"date","onboarding_completion_date":"date","onboarding_id":"string","snapshot_date":"date"},"datasets":["cost_event","onboarding"],"source":"Finance / ERP","frequency":"Per onboarding","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'onboarding') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM onboarding WHERE snapshot_date = :period_end AND (onboarding_completion_date >= :period_start AND onboarding_completion_date <= :period_end)), 0)) AS cost_per_onboarding","description":"Total onboarding cost divided by customers onboarded.","department":"Onboarding","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","onboarding_completion_date@onboarding","onboarding_id@onboarding","snapshot_date@onboarding"]},{"metric":"Time Spent per Onboarding","formulaId":"time_spent_per_onboarding","fields":["hours","onboarding_completion_date","onboarding_id","snapshot_date"],"fieldTypes":{"hours":"decimal","onboarding_completion_date":"date","onboarding_id":"string","snapshot_date":"date"},"datasets":["onboarding"],"source":"CS Platform","frequency":"Per onboarding","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(hours), 0) FROM onboarding WHERE snapshot_date = :period_end AND (onboarding_completion_date >= :period_start AND onboarding_completion_date <= :period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM onboarding WHERE snapshot_date = :period_end AND (onboarding_completion_date >= :period_start AND onboarding_completion_date <= :period_end)), 0)) AS time_spent_per_onboarding","description":"Total hours invested per customer onboarding.","department":"Onboarding","staged":false,"placeholders":["hours@onboarding","onboarding_completion_date@onboarding","onboarding_id@onboarding","snapshot_date@onboarding"]},{"metric":"Onboarding-to-Active Rate (Activation Rate)","formulaId":"activation_rate","fields":["activation_date","customer_id","onboarding_completion_date","snapshot_date"],"fieldTypes":{"activation_date":"date","customer_id":"string","onboarding_completion_date":"date","snapshot_date":"date"},"datasets":["customer"],"source":"CS Platform","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND ((onboarding_completion_date >= :period_start AND onboarding_completion_date <= :period_end) AND activation_date IS NOT NULL)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND (onboarding_completion_date >= :period_start AND onboarding_completion_date <= :period_end)), 0)) AS activation_rate","description":"Percentage of onboarded customers who become actively engaged.","department":"Onboarding","staged":false,"placeholders":["activation_date@customer","customer_id@customer","onboarding_completion_date@customer","snapshot_date@customer"]},{"metric":"30-Day Retention (Post-Onboarding)","formulaId":"day_30_retention_post_onboarding","fields":["customer_id","customer_status","last_active_date","onboarding_completion_date","snapshot_date"],"fieldTypes":{"customer_id":"string","customer_status":"string","last_active_date":"date","onboarding_completion_date":"date","snapshot_date":"date"},"datasets":["customer"],"source":"Billing","frequency":"Daily","grain":"Monthly cohort","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND ((onboarding_completion_date IS NOT NULL AND customer_status = 'active') AND (last_active_date - onboarding_completion_date) >= 30)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND onboarding_completion_date IS NOT NULL), 0)) AS day_30_retention_post_onboarding","description":"Percentage of customers still active 30 days after onboarding completion.","department":"Onboarding","staged":false,"placeholders":["customer_id@customer","customer_status@customer","last_active_date@customer","onboarding_completion_date@customer","snapshot_date@customer"]},{"metric":"Feature Adoption at Go-Live","formulaId":"feature_adoption_at_go_live","fields":["event_date","feature_id","snapshot_date","usage_count"],"fieldTypes":{"event_date":"date","feature_id":"string","snapshot_date":"date","usage_count":"integer"},"datasets":["feature","product_event"],"source":"Product Analytics","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT feature_id) FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end AND usage_count > 0) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT feature_id) FROM feature WHERE snapshot_date = :period_end), 0)) AS feature_adoption_at_go_live","description":"Percentage of available features being used at go-live.","department":"Onboarding","staged":false,"placeholders":["event_date@product_event","feature_id@feature","feature_id@product_event","snapshot_date@feature","usage_count@product_event"]},{"metric":"Total Active Partners","formulaId":"total_active_partners","fields":["partner_id","partner_status","snapshot_date"],"fieldTypes":{"partner_id":"string","partner_status":"string","snapshot_date":"date"},"datasets":["partner"],"source":"Partner Management","frequency":"Monthly","grain":"End-of-month snapshot","exampleQuery":"SELECT (SELECT COUNT(DISTINCT partner_id) FROM partner WHERE snapshot_date = :period_end AND partner_status = 'active') AS total_active_partners","description":"Number of partners actively engaged in the program.","department":"Partnerships","staged":false,"placeholders":["partner_id@partner","partner_status@partner","snapshot_date@partner"]},{"metric":"Partner Tier Distribution","formulaId":"partner_tier_distribution","fields":["partner_id","partner_tier","snapshot_date"],"fieldTypes":{"partner_id":"string","partner_tier":"string","snapshot_date":"date"},"datasets":["partner"],"source":"Partner Management","frequency":"Monthly","grain":"End-of-month snapshot","exampleQuery":"SELECT _d.partner_tier AS partner_tier, (CAST((SELECT COUNT(DISTINCT partner_id) FROM partner WHERE snapshot_date = :period_end AND partner_tier = _d.partner_tier) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM partner WHERE snapshot_date = :period_end), 0)) AS partner_tier_distribution\nFROM (SELECT 'registered' AS partner_tier UNION ALL SELECT 'silver' AS partner_tier UNION ALL SELECT 'gold' AS partner_tier UNION ALL SELECT 'platinum' AS partner_tier) _d","description":"Breakdown of partners by program tier.","department":"Partnerships","staged":false,"placeholders":["partner_id@partner","partner_tier@partner","snapshot_date@partner"],"breakdown":{"field":"partner_tier"}},{"metric":"Partner Activation Rate","formulaId":"partner_activation_rate","fields":["partner_id","partner_recruited_date","partner_status","snapshot_date"],"fieldTypes":{"partner_id":"string","partner_recruited_date":"date","partner_status":"string","snapshot_date":"date"},"datasets":["partner"],"source":"Partner Management","frequency":"Monthly","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT partner_id) FROM partner WHERE snapshot_date = :period_end AND ((partner_recruited_date >= :period_start AND partner_recruited_date <= :period_end) AND partner_status = 'active')) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM partner WHERE snapshot_date = :period_end AND (partner_recruited_date >= :period_start AND partner_recruited_date <= :period_end)), 0)) AS partner_activation_rate","description":"Percentage of recruited partners who become productive.","department":"Partnerships","staged":false,"placeholders":["partner_id@partner","partner_recruited_date@partner","partner_status@partner","snapshot_date@partner"]},{"metric":"Partner Churn Rate","formulaId":"partner_churn_rate","fields":["partner_churn_date","partner_id","partner_status","snapshot_date"],"fieldTypes":{"partner_churn_date":"date","partner_id":"string","partner_status":"string","snapshot_date":"date"},"datasets":["partner"],"source":"Partner Management","frequency":"Monthly","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT partner_id) FROM partner WHERE snapshot_date = :period_end AND (partner_churn_date >= :period_start AND partner_churn_date <= :period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM partner WHERE snapshot_date = :period_start AND partner_status = 'active'), 0)) AS partner_churn_rate","description":"Percentage of partners who leave or become inactive.","department":"Partnerships","staged":false,"placeholders":["partner_churn_date@partner","partner_id@partner","partner_status@partner","snapshot_date@partner"]},{"metric":"Partner-Sourced Revenue","formulaId":"partner_sourced_revenue","fields":["close_date","opportunity_amount","opportunity_stage","partner_sourced","snapshot_date"],"fieldTypes":{"close_date":"date","opportunity_amount":"decimal","opportunity_stage":"string","partner_sourced":"boolean","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Monthly","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end))) AS partner_sourced_revenue","description":"Revenue from deals originated by partners.","department":"Partnerships","staged":false,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","partner_sourced@opportunity","snapshot_date@opportunity"]},{"metric":"Partner-Influenced Revenue","formulaId":"partner_influenced_revenue","fields":["close_date","opportunity_amount","opportunity_stage","partner_id","snapshot_date"],"fieldTypes":{"close_date":"date","opportunity_amount":"decimal","opportunity_stage":"string","partner_id":"string","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Monthly","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end))) AS partner_influenced_revenue","description":"Revenue from deals where partners were involved (but may not have originated).","department":"Partnerships","staged":false,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","partner_id@opportunity","snapshot_date@opportunity"]},{"metric":"Channel Revenue Percentage","formulaId":"channel_revenue_percentage","fields":["close_date","opportunity_amount","opportunity_stage","partner_sourced","period_start","revenue","snapshot_date"],"fieldTypes":{"close_date":"date","opportunity_amount":"decimal","opportunity_stage":"string","partner_sourced":"boolean","period_start":"date","revenue":"decimal","snapshot_date":"date"},"datasets":["financials","opportunity"],"source":"CRM","frequency":"Monthly","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST(((SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end)))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end)), 0)) AS channel_revenue_percentage","description":"Partner-sourced revenue as a percentage of total recognised (GAAP) revenue.","department":"Partnerships","staged":false,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","partner_sourced@opportunity","period_start@financials","revenue@financials","snapshot_date@opportunity"]},{"metric":"Partner Revenue Growth","formulaId":"partner_revenue_growth","fields":["close_date","opportunity_amount","opportunity_stage","partner_sourced","snapshot_date"],"fieldTypes":{"close_date":"date","opportunity_amount":"decimal","opportunity_stage":"string","partner_sourced":"boolean","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Monthly","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((((SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end)))) - ((SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = (((:period_end + INTERVAL '1 day') - INTERVAL '1 year') - INTERVAL '1 day') AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= (:period_start - INTERVAL '1 year') AND close_date <= (((:period_end + INTERVAL '1 day') - INTERVAL '1 year') - INTERVAL '1 day')))))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = (((:period_end + INTERVAL '1 day') - INTERVAL '1 year') - INTERVAL '1 day') AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= (:period_start - INTERVAL '1 year') AND close_date <= (((:period_end + INTERVAL '1 day') - INTERVAL '1 year') - INTERVAL '1 day'))))), 0)) AS partner_revenue_growth","description":"Year-over-year growth in partner-sourced revenue.","department":"Partnerships","staged":true,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","partner_sourced@opportunity","snapshot_date@opportunity"]},{"metric":"Average Partner Revenue","formulaId":"average_partner_revenue","fields":["close_date","opportunity_amount","opportunity_stage","partner_id","partner_status","snapshot_date"],"fieldTypes":{"close_date":"date","opportunity_amount":"decimal","opportunity_stage":"string","partner_id":"string","partner_status":"string","snapshot_date":"date"},"datasets":["opportunity","partner"],"source":"CRM","frequency":"Monthly","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST(((SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end)))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT partner_id) FROM partner WHERE snapshot_date = :period_end AND partner_status = 'active')), 0)) AS average_partner_revenue","description":"Average revenue per active partner.","department":"Partnerships","staged":false,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","partner_id@opportunity","partner_id@partner","partner_status@partner","snapshot_date@opportunity","snapshot_date@partner"]},{"metric":"Partner Deal Registration Volume","formulaId":"partner_deal_registration_volume","fields":["registration_date","registration_id","snapshot_date"],"fieldTypes":{"registration_date":"date","registration_id":"string","snapshot_date":"date"},"datasets":["deal_registration"],"source":"Partner Management","frequency":"Per registration","grain":"Per event","exampleQuery":"SELECT (SELECT COUNT(DISTINCT registration_id) FROM deal_registration WHERE snapshot_date = :period_end AND (registration_date >= :period_start AND registration_date <= :period_end)) AS partner_deal_registration_volume","description":"Number of deals registered by partners.","department":"Partnerships","staged":false,"placeholders":["registration_date@deal_registration","registration_id@deal_registration","snapshot_date@deal_registration"]},{"metric":"Deal Registration-to-Close Rate","formulaId":"deal_registration_to_close_rate","fields":["close_date","opportunity_stage","registration_date","registration_id","snapshot_date"],"fieldTypes":{"close_date":"date","opportunity_stage":"string","registration_date":"date","registration_id":"string","snapshot_date":"date"},"datasets":["deal_registration"],"source":"Partner Management","frequency":"Per registration","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT registration_id) FROM deal_registration WHERE snapshot_date = :period_end AND (opportunity_stage = 'closed_won' AND (close_date >= :period_start AND close_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT registration_id) FROM deal_registration WHERE snapshot_date = :period_end AND (registration_date >= :period_start AND registration_date <= :period_end)), 0)) AS deal_registration_to_close_rate","description":"Percentage of registered deals that close.","department":"Partnerships","staged":false,"placeholders":["close_date@deal_registration","opportunity_stage@deal_registration","registration_date@deal_registration","registration_id@deal_registration","snapshot_date@deal_registration"]},{"metric":"Partner Win Rate","formulaId":"partner_win_rate","fields":["close_date","opportunity_id","opportunity_stage","partner_id","snapshot_date"],"fieldTypes":{"close_date":"date","opportunity_id":"string","opportunity_stage":"string","partner_id":"string","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND ((partner_id IS NOT NULL AND opportunity_stage IN ('closed_won', 'closed_lost')) AND (close_date >= :period_start AND close_date <= :period_end))), 0)) AS partner_win_rate","description":"Win rate on partner-involved opportunities.","department":"Partnerships","staged":false,"placeholders":["close_date@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","partner_id@opportunity","snapshot_date@opportunity"]},{"metric":"Partner Deal Size","formulaId":"partner_deal_size","fields":["close_date","opportunity_amount","opportunity_id","opportunity_stage","partner_sourced","snapshot_date"],"fieldTypes":{"close_date":"date","opportunity_amount":"decimal","opportunity_id":"string","opportunity_stage":"string","partner_sourced":"boolean","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST(((SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end)))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end))), 0)) AS partner_deal_size","description":"Average deal size for partner-sourced deals.","department":"Partnerships","staged":false,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","partner_sourced@opportunity","snapshot_date@opportunity"]},{"metric":"Partner Sales Cycle","formulaId":"partner_sales_cycle","fields":["close_date","opportunity_stage","registration_date","snapshot_date"],"fieldTypes":{"close_date":"date","opportunity_stage":"string","registration_date":"date","snapshot_date":"date"},"datasets":["deal_registration"],"source":"Partner Management","frequency":"Per registration","grain":"Per event","exampleQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (close_date - registration_date)) FROM deal_registration WHERE snapshot_date = :period_end AND (opportunity_stage = 'closed_won' AND (close_date >= :period_start AND close_date <= :period_end))) AS partner_sales_cycle","description":"Median sales cycle for registered partner deals that closed won in the period, from registration to close.","department":"Partnerships","staged":false,"placeholders":["close_date@deal_registration","opportunity_stage@deal_registration","registration_date@deal_registration","snapshot_date@deal_registration"]},{"metric":"Certification Rate","formulaId":"certification_rate","fields":["certification_status","partner_id","partner_status","snapshot_date"],"fieldTypes":{"certification_status":"string","partner_id":"string","partner_status":"string","snapshot_date":"date"},"datasets":["partner"],"source":"Partner Management","frequency":"Monthly","grain":"End-of-month snapshot","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT partner_id) FROM partner WHERE snapshot_date = :period_end AND certification_status = 'certified') AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT partner_id) FROM partner WHERE snapshot_date = :period_end AND partner_status = 'active')), 0)) AS certification_rate","description":"Percentage of partners with current certifications.","department":"Partnerships","staged":false,"placeholders":["certification_status@partner","partner_id@partner","partner_status@partner","snapshot_date@partner"]},{"metric":"Training Completion","formulaId":"training_completion","fields":["partner_id","snapshot_date","training_completed"],"fieldTypes":{"partner_id":"string","snapshot_date":"date","training_completed":"boolean"},"datasets":["partner"],"source":"Partner Management","frequency":"Monthly","grain":"End-of-month snapshot","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT partner_id) FROM partner WHERE snapshot_date = :period_end AND training_completed = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM partner WHERE snapshot_date = :period_end), 0)) AS training_completion","description":"Percentage of partners completing required training.","department":"Partnerships","staged":false,"placeholders":["partner_id@partner","snapshot_date@partner","training_completed@partner"]},{"metric":"Joint Marketing Activities","formulaId":"joint_marketing_activities","fields":["activity_date","activity_id","partner_activity_type"],"fieldTypes":{"activity_date":"date","activity_id":"string","partner_activity_type":"string"},"datasets":["partner_activity"],"source":"Partner Management","frequency":"Monthly","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT COUNT(activity_id) FROM partner_activity WHERE activity_date >= :period_start AND activity_date <= :period_end AND partner_activity_type IN ('webinar', 'event', 'content', 'campaign')) AS joint_marketing_activities","description":"Number of co-marketing activities with partners.","department":"Partnerships","staged":false,"placeholders":["activity_date@partner_activity","activity_id@partner_activity","partner_activity_type@partner_activity"]},{"metric":"Partner NPS","formulaId":"partner_nps","fields":["nps_score","survey_date","survey_type"],"fieldTypes":{"nps_score":"integer","survey_date":"date","survey_type":"string"},"datasets":["survey_response"],"source":"Survey Tool","frequency":"Quarterly","grain":"Per survey response, aggregate quarterly","exampleQuery":"SELECT ((CAST(((SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND (survey_type = 'partner' AND nps_score >= 9)) - (SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND (survey_type = 'partner' AND nps_score <= 6))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND survey_type = 'partner'), 0)) * 100) AS partner_nps","description":"Net Promoter Score from partner satisfaction surveys.","department":"Partnerships","staged":false,"placeholders":["nps_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},{"metric":"Partner Margin / Commission","formulaId":"partner_margin_commission","fields":["close_date","cost","cost_function","event_date","opportunity_amount","opportunity_stage","partner_sourced","snapshot_date"],"fieldTypes":{"close_date":"date","cost":"decimal","cost_function":"string","event_date":"date","opportunity_amount":"decimal","opportunity_stage":"string","partner_sourced":"boolean","snapshot_date":"date"},"datasets":["cost_event","opportunity"],"source":"CRM","frequency":"Monthly","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'partner_commission') AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end)))), 0)) AS partner_margin_commission","description":"Compensation paid to partners.","department":"Partnerships","staged":false,"placeholders":["close_date@opportunity","cost@cost_event","cost_function@cost_event","event_date@cost_event","opportunity_amount@opportunity","opportunity_stage@opportunity","partner_sourced@opportunity","snapshot_date@opportunity"]},{"metric":"Cost of Partner Acquisition","formulaId":"cost_of_partner_acquisition","fields":["cost","cost_function","event_date","partner_id","partner_recruited_date","snapshot_date"],"fieldTypes":{"cost":"decimal","cost_function":"string","event_date":"date","partner_id":"string","partner_recruited_date":"date","snapshot_date":"date"},"datasets":["cost_event","partner"],"source":"Finance / ERP","frequency":"Monthly","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'partner_program') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM partner WHERE snapshot_date = :period_end AND (partner_recruited_date >= :period_start AND partner_recruited_date <= :period_end)), 0)) AS cost_of_partner_acquisition","description":"Cost to recruit and onboard a new partner.","department":"Partnerships","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","partner_id@partner","partner_recruited_date@partner","snapshot_date@partner"]},{"metric":"Partner Lifetime Value","formulaId":"partner_lifetime_value","fields":["close_date","opportunity_amount","opportunity_stage","partner_churn_date","partner_id","partner_status","snapshot_date"],"fieldTypes":{"close_date":"date","opportunity_amount":"decimal","opportunity_stage":"string","partner_churn_date":"date","partner_id":"string","partner_status":"string","snapshot_date":"date"},"datasets":["opportunity","partner"],"source":"Partner Management","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST(((CAST(((SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end)))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT partner_id) FROM partner WHERE snapshot_date = :period_end AND partner_status = 'active')), 0))) AS DOUBLE PRECISION) / NULLIF(((CAST((SELECT COUNT(DISTINCT partner_id) FROM partner WHERE snapshot_date = :period_end AND (partner_churn_date >= :period_start AND partner_churn_date <= :period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM partner WHERE snapshot_date = :period_start AND partner_status = 'active'), 0))), 0)) AS partner_lifetime_value","description":"Expected revenue from a partner over its lifetime.","department":"Partnerships","staged":false,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","partner_churn_date@partner","partner_id@opportunity","partner_id@partner","partner_status@partner","snapshot_date@opportunity","snapshot_date@partner"]},{"metric":"Partner ROI","formulaId":"partner_roi","fields":["close_date","cost","cost_function","event_date","opportunity_amount","opportunity_stage","partner_sourced","snapshot_date"],"fieldTypes":{"close_date":"date","cost":"decimal","cost_function":"string","event_date":"date","opportunity_amount":"decimal","opportunity_stage":"string","partner_sourced":"boolean","snapshot_date":"date"},"datasets":["cost_event","opportunity"],"source":"CRM","frequency":"Monthly","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((((SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end)))) - (SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'partner_program')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'partner_program'), 0)) AS partner_roi","description":"Return on investment in partner program.","department":"Partnerships","staged":false,"placeholders":["close_date@opportunity","cost@cost_event","cost_function@cost_event","event_date@cost_event","opportunity_amount@opportunity","opportunity_stage@opportunity","partner_sourced@opportunity","snapshot_date@opportunity"]},{"metric":"Marketplace Revenue","formulaId":"marketplace_revenue","fields":["channel","close_date","opportunity_amount","opportunity_stage","snapshot_date"],"fieldTypes":{"channel":"string","close_date":"date","opportunity_amount":"decimal","opportunity_stage":"string","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Monthly","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND ((channel = 'marketplace' AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end))) AS marketplace_revenue","description":"Revenue transacted through marketplace (AWS, Azure, etc.).","department":"Partnerships","staged":false,"placeholders":["channel@opportunity","close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},{"metric":"Marketplace as % of Revenue","formulaId":"marketplace_as_of_revenue","fields":["channel","close_date","opportunity_amount","opportunity_stage","period_start","revenue","snapshot_date"],"fieldTypes":{"channel":"string","close_date":"date","opportunity_amount":"decimal","opportunity_stage":"string","period_start":"date","revenue":"decimal","snapshot_date":"date"},"datasets":["financials","opportunity"],"source":"CRM","frequency":"Monthly","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST(((SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND ((channel = 'marketplace' AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end)))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end)), 0)) AS marketplace_as_of_revenue","description":"Marketplace contribution to total revenue.","department":"Partnerships","staged":false,"placeholders":["channel@opportunity","close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","period_start@financials","revenue@financials","snapshot_date@opportunity"]},{"metric":"Total Headcount","formulaId":"total_headcount","fields":["employee_id","employee_status","snapshot_date"],"fieldTypes":{"employee_id":"string","employee_status":"string","snapshot_date":"date"},"datasets":["employee"],"source":"HRIS","frequency":"Monthly","grain":"End-of-month snapshot","exampleQuery":"SELECT (SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND employee_status = 'active') AS total_headcount","description":"Total number of active employees at the end of the period.","department":"People","staged":false,"placeholders":["employee_id@employee","employee_status@employee","snapshot_date@employee"]},{"metric":"Headcount Growth Rate","formulaId":"headcount_growth_rate","fields":["employee_id","employee_status","snapshot_date"],"fieldTypes":{"employee_id":"string","employee_status":"string","snapshot_date":"date"},"datasets":["employee"],"source":"HRIS","frequency":"Monthly","grain":"End-of-month snapshot","exampleQuery":"SELECT (CAST((((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND employee_status = 'active')) - ((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_start AND employee_status = 'active'))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_start AND employee_status = 'active')), 0)) AS headcount_growth_rate","description":"Percentage change in headcount over a period.","department":"People","staged":false,"placeholders":["employee_id@employee","employee_status@employee","snapshot_date@employee"]},{"metric":"Employee Turnover Rate","formulaId":"employee_turnover","fields":["employee_id","employee_status","snapshot_date","termination_date"],"fieldTypes":{"employee_id":"string","employee_status":"string","snapshot_date":"date","termination_date":"date"},"datasets":["employee"],"source":"HRIS","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND (termination_date >= :period_start AND termination_date <= :period_end)) AS DOUBLE PRECISION) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_start AND employee_status = 'active')) + ((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND employee_status = 'active'))) AS DOUBLE PRECISION) / 2), 0)) AS employee_turnover","description":"Percentage of employees who left in a period.","department":"People","staged":false,"placeholders":["employee_id@employee","employee_status@employee","snapshot_date@employee","termination_date@employee"]},{"metric":"Voluntary Turnover Rate","formulaId":"voluntary_turnover_rate","fields":["employee_id","employee_status","snapshot_date","termination_date","termination_type"],"fieldTypes":{"employee_id":"string","employee_status":"string","snapshot_date":"date","termination_date":"date","termination_type":"string"},"datasets":["employee"],"source":"HRIS","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND (termination_type = 'voluntary' AND (termination_date >= :period_start AND termination_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_start AND employee_status = 'active')) + ((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND employee_status = 'active'))) AS DOUBLE PRECISION) / 2), 0)) AS voluntary_turnover_rate","description":"Turnover due to employee choice (resignations).","department":"People","staged":false,"placeholders":["employee_id@employee","employee_status@employee","snapshot_date@employee","termination_date@employee","termination_type@employee"]},{"metric":"Involuntary Turnover Rate","formulaId":"involuntary_turnover_rate","fields":["employee_id","employee_status","snapshot_date","termination_date","termination_type"],"fieldTypes":{"employee_id":"string","employee_status":"string","snapshot_date":"date","termination_date":"date","termination_type":"string"},"datasets":["employee"],"source":"HRIS","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND (termination_type = 'involuntary' AND (termination_date >= :period_start AND termination_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_start AND employee_status = 'active')) + ((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND employee_status = 'active'))) AS DOUBLE PRECISION) / 2), 0)) AS involuntary_turnover_rate","description":"Turnover due to company decision (terminations, layoffs).","department":"People","staged":false,"placeholders":["employee_id@employee","employee_status@employee","snapshot_date@employee","termination_date@employee","termination_type@employee"]},{"metric":"Regrettable Turnover","formulaId":"regrettable_turnover","fields":["employee_id","employee_status","is_high_performer","snapshot_date","termination_date","termination_type"],"fieldTypes":{"employee_id":"string","employee_status":"string","is_high_performer":"boolean","snapshot_date":"date","termination_date":"date","termination_type":"string"},"datasets":["employee"],"source":"HRIS","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND ((termination_type = 'voluntary' AND is_high_performer = TRUE) AND (termination_date >= :period_start AND termination_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_start AND (is_high_performer = TRUE AND employee_status = 'active')), 0)) AS regrettable_turnover","description":"Voluntary departures of high performers, as a share of the high performers employed at the start of the period.","department":"People","staged":false,"placeholders":["employee_id@employee","employee_status@employee","is_high_performer@employee","snapshot_date@employee","termination_date@employee","termination_type@employee"]},{"metric":"Average Tenure","formulaId":"average_tenure","fields":["employee_status","hire_date","snapshot_date"],"fieldTypes":{"employee_status":"string","hire_date":"date","snapshot_date":"date"},"datasets":["employee"],"source":"HRIS","frequency":"Monthly","grain":"End-of-month snapshot","exampleQuery":"SELECT (CAST((SELECT AVG((snapshot_date - hire_date)) FROM employee WHERE snapshot_date = :period_end AND employee_status = 'active') AS DOUBLE PRECISION) / 30.4375) AS average_tenure","description":"Average length of employment.","department":"People","staged":false,"placeholders":["employee_status@employee","hire_date@employee","snapshot_date@employee"]},{"metric":"90-Day Turnover","formulaId":"day_90_turnover","fields":["employee_id","hire_date","snapshot_date","termination_date"],"fieldTypes":{"employee_id":"string","hire_date":"date","snapshot_date":"date","termination_date":"date"},"datasets":["employee"],"source":"HRIS","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND (termination_date IS NOT NULL AND (termination_date - hire_date) <= 90)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND (hire_date >= :period_start AND hire_date <= :period_end)), 0)) AS day_90_turnover","description":"Percentage of new hires who leave within 90 days.","department":"People","staged":false,"placeholders":["employee_id@employee","hire_date@employee","snapshot_date@employee","termination_date@employee"]},{"metric":"Employee Net Promoter Score (eNPS)","formulaId":"enps","fields":["nps_score","survey_date","survey_type"],"fieldTypes":{"nps_score":"integer","survey_date":"date","survey_type":"string"},"datasets":["survey_response"],"source":"Survey Tool","frequency":"Quarterly","grain":"Per survey response, aggregate quarterly","exampleQuery":"SELECT ((CAST(((SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND (survey_type = 'employee' AND nps_score >= 9)) - (SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND (survey_type = 'employee' AND nps_score <= 6))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND survey_type = 'employee'), 0)) * 100) AS enps","description":"Likelihood of employees recommending the company as a place to work.","department":"People","staged":false,"placeholders":["nps_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},{"metric":"Engagement Score","formulaId":"engagement_score","fields":["engagement_score","survey_date","survey_type"],"fieldTypes":{"engagement_score":"decimal","survey_date":"date","survey_type":"string"},"datasets":["survey_response"],"source":"Survey Tool","frequency":"Quarterly","grain":"Per survey response, aggregate quarterly","exampleQuery":"SELECT (SELECT AVG(engagement_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND survey_type = 'employee') AS engagement_score","description":"Composite score from engagement survey.","department":"People","staged":false,"placeholders":["engagement_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},{"metric":"Survey Participation Rate","formulaId":"survey_participation_rate","fields":["response_id","survey_completed","survey_date","survey_type"],"fieldTypes":{"response_id":"string","survey_completed":"boolean","survey_date":"date","survey_type":"string"},"datasets":["survey_response"],"source":"Survey Tool","frequency":"Quarterly","grain":"Per survey response, aggregate quarterly","exampleQuery":"SELECT (CAST((SELECT COUNT(response_id) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND (survey_type = 'employee' AND survey_completed = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(response_id) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND survey_type = 'employee'), 0)) AS survey_participation_rate","description":"Percentage of employees completing engagement surveys.","department":"People","staged":false,"placeholders":["response_id@survey_response","survey_completed@survey_response","survey_date@survey_response","survey_type@survey_response"]},{"metric":"Open Positions","formulaId":"open_positions","fields":["requisition_id","requisition_status","snapshot_date"],"fieldTypes":{"requisition_id":"string","requisition_status":"string","snapshot_date":"date"},"datasets":["requisition"],"source":"ATS","frequency":"Monthly","grain":"End-of-month snapshot","exampleQuery":"SELECT (SELECT COUNT(DISTINCT requisition_id) FROM requisition WHERE snapshot_date = :period_end AND requisition_status = 'open') AS open_positions","description":"Number of open requisitions (unfilled roles) at the end of the period.","department":"People","staged":false,"placeholders":["requisition_id@requisition","requisition_status@requisition","snapshot_date@requisition"]},{"metric":"Time to Fill","formulaId":"time_to_fill","fields":["filled_date","requisition_opened_date","snapshot_date"],"fieldTypes":{"filled_date":"date","requisition_opened_date":"date","snapshot_date":"date"},"datasets":["requisition"],"source":"ATS","frequency":"Per hire","grain":"Per event","exampleQuery":"SELECT (SELECT AVG((filled_date - requisition_opened_date)) FROM requisition WHERE snapshot_date = :period_end AND (filled_date >= :period_start AND filled_date <= :period_end)) AS time_to_fill","description":"Days from a requisition opening to it being filled with an accepted offer, for requisitions filled in the period.","department":"People","staged":false,"placeholders":["filled_date@requisition","requisition_opened_date@requisition","snapshot_date@requisition"]},{"metric":"Time to Hire","formulaId":"time_to_hire","fields":["application_date","hire_date","snapshot_date"],"fieldTypes":{"application_date":"date","hire_date":"date","snapshot_date":"date"},"datasets":["employee"],"source":"ATS","frequency":"Per hire","grain":"Per event","exampleQuery":"SELECT (SELECT AVG((hire_date - application_date)) FROM employee WHERE snapshot_date = :period_end AND (hire_date >= :period_start AND hire_date <= :period_end)) AS time_to_hire","description":"Days from the hired employee's application to their start date, for employees hired in the period.","department":"People","staged":false,"placeholders":["application_date@employee","hire_date@employee","snapshot_date@employee"]},{"metric":"Offer Acceptance Rate","formulaId":"offer_acceptance_rate","fields":["offer_status","requisition_id","snapshot_date"],"fieldTypes":{"offer_status":"string","requisition_id":"string","snapshot_date":"date"},"datasets":["requisition"],"source":"ATS","frequency":"Per hire","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(requisition_id) FROM requisition WHERE snapshot_date = :period_end AND offer_status = 'accepted') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(requisition_id) FROM requisition WHERE snapshot_date = :period_end AND offer_status IN ('accepted', 'declined')), 0)) AS offer_acceptance_rate","description":"Percentage of offers accepted.","department":"People","staged":false,"placeholders":["offer_status@requisition","requisition_id@requisition","snapshot_date@requisition"]},{"metric":"Quality of Hire","formulaId":"quality_of_hire","fields":["hire_date","performance_rating","snapshot_date"],"fieldTypes":{"hire_date":"date","performance_rating":"decimal","snapshot_date":"date"},"datasets":["employee"],"source":"HRIS","frequency":"Per hire","grain":"Per event","exampleQuery":"SELECT (SELECT AVG(performance_rating) FROM employee WHERE snapshot_date = :period_end AND ((hire_date IS NOT NULL AND (snapshot_date - hire_date) >= 182) AND (snapshot_date - hire_date) <= 365)) AS quality_of_hire","description":"Performance rating of new hires after defined period.","department":"People","staged":false,"placeholders":["hire_date@employee","performance_rating@employee","snapshot_date@employee"]},{"metric":"Cost per Hire","formulaId":"cost_per_hire","fields":["cost","cost_function","employee_id","event_date","hire_date","snapshot_date"],"fieldTypes":{"cost":"decimal","cost_function":"string","employee_id":"string","event_date":"date","hire_date":"date","snapshot_date":"date"},"datasets":["cost_event","employee"],"source":"Finance / ERP","frequency":"Per hire","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'recruiting') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND (hire_date >= :period_start AND hire_date <= :period_end)), 0)) AS cost_per_hire","description":"Total recruiting cost divided by hires made.","department":"People","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","employee_id@employee","event_date@cost_event","hire_date@employee","snapshot_date@employee"]},{"metric":"Source of Hire","formulaId":"source_of_hire","fields":["employee_id","hire_date","hire_source","snapshot_date"],"fieldTypes":{"employee_id":"string","hire_date":"date","hire_source":"string","snapshot_date":"date"},"datasets":["employee"],"source":"HRIS","frequency":"Per hire","grain":"Per event","exampleQuery":"SELECT _d.hire_source AS hire_source, (CAST((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND (hire_date >= :period_start AND hire_date <= :period_end) AND hire_source = _d.hire_source) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND (hire_date >= :period_start AND hire_date <= :period_end)), 0)) AS source_of_hire\nFROM (SELECT 'referral' AS hire_source UNION ALL SELECT 'inbound' AS hire_source UNION ALL SELECT 'sourced' AS hire_source UNION ALL SELECT 'agency' AS hire_source UNION ALL SELECT 'internal' AS hire_source UNION ALL SELECT 'campus' AS hire_source UNION ALL SELECT 'other' AS hire_source) _d","description":"Where successful candidates came from.","department":"People","staged":false,"placeholders":["employee_id@employee","hire_date@employee","hire_source@employee","snapshot_date@employee"],"breakdown":{"field":"hire_source"}},{"metric":"Compa-Ratio","formulaId":"compa_ratio","fields":["market_midpoint","salary","snapshot_date"],"fieldTypes":{"market_midpoint":"decimal","salary":"decimal","snapshot_date":"date"},"datasets":["employee"],"source":"HRIS","frequency":"Annual","grain":"Annual snapshot","exampleQuery":"SELECT (SELECT AVG((CAST(salary AS DOUBLE PRECISION) / NULLIF(market_midpoint, 0))) FROM employee WHERE snapshot_date = :period_end) AS compa_ratio","description":"Employee salary relative to market midpoint.","department":"People","staged":false,"placeholders":["market_midpoint@employee","salary@employee","snapshot_date@employee"]},{"metric":"Pay Equity Ratio","formulaId":"pay_equity_ratio","fields":["salary","snapshot_date","underrepresented_group"],"fieldTypes":{"salary":"decimal","snapshot_date":"date","underrepresented_group":"boolean"},"datasets":["employee"],"source":"HRIS","frequency":"Annual","grain":"Annual snapshot","exampleQuery":"SELECT (CAST((SELECT AVG(salary) FROM employee WHERE snapshot_date = :period_end AND underrepresented_group = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT AVG(salary) FROM employee WHERE snapshot_date = :period_end AND underrepresented_group = FALSE), 0)) AS pay_equity_ratio","description":"Pay comparison across demographic groups for same role.","department":"People","staged":false,"placeholders":["salary@employee","snapshot_date@employee","underrepresented_group@employee"]},{"metric":"Diversity Representation","formulaId":"diversity_representation","fields":["employee_id","employee_status","snapshot_date","underrepresented_group"],"fieldTypes":{"employee_id":"string","employee_status":"string","snapshot_date":"date","underrepresented_group":"boolean"},"datasets":["employee"],"source":"HRIS","frequency":"Monthly","grain":"End-of-month snapshot","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND (underrepresented_group = TRUE AND employee_status = 'active')) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND employee_status = 'active'), 0)) AS diversity_representation","description":"Percentage of workforce from underrepresented groups.","department":"People","staged":false,"placeholders":["employee_id@employee","employee_status@employee","snapshot_date@employee","underrepresented_group@employee"]},{"metric":"Diversity in Leadership","formulaId":"diversity_in_leadership","fields":["employee_id","employee_status","job_level","snapshot_date","underrepresented_group"],"fieldTypes":{"employee_id":"string","employee_status":"string","job_level":"string","snapshot_date":"date","underrepresented_group":"boolean"},"datasets":["employee"],"source":"HRIS","frequency":"Monthly","grain":"End-of-month snapshot","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND ((underrepresented_group = TRUE AND job_level IN ('manager', 'director', 'vp', 'c_level')) AND employee_status = 'active')) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND (job_level IN ('manager', 'director', 'vp', 'c_level') AND employee_status = 'active')), 0)) AS diversity_in_leadership","description":"Representation at manager+ levels.","department":"People","staged":false,"placeholders":["employee_id@employee","employee_status@employee","job_level@employee","snapshot_date@employee","underrepresented_group@employee"]},{"metric":"Diversity Hiring Rate","formulaId":"diversity_hiring_rate","fields":["employee_id","hire_date","snapshot_date","underrepresented_group"],"fieldTypes":{"employee_id":"string","hire_date":"date","snapshot_date":"date","underrepresented_group":"boolean"},"datasets":["employee"],"source":"HRIS","frequency":"Per hire","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND ((underrepresented_group = TRUE AND hire_date >= :period_start) AND hire_date <= :period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM employee WHERE snapshot_date = :period_end AND (hire_date >= :period_start AND hire_date <= :period_end)), 0)) AS diversity_hiring_rate","description":"Percentage of new hires from underrepresented groups.","department":"People","staged":false,"placeholders":["employee_id@employee","hire_date@employee","snapshot_date@employee","underrepresented_group@employee"]},{"metric":"Daily Active Users (DAU)","formulaId":"daily_active_users_dau","fields":["event_date","product_event_type","user_id"],"fieldTypes":{"event_date":"date","product_event_type":"string","user_id":"string"},"datasets":["product_event"],"source":"Product Analytics","frequency":"Daily","grain":"Distinct users in a trailing window (1, 7 or 30 days) ending at period end","exampleQuery":"SELECT (SELECT COUNT(DISTINCT user_id) FROM product_event WHERE event_date >= ((:period_end + INTERVAL '1 day') - INTERVAL '1 day') AND event_date <= :period_end AND product_event_type = 'qualifying') AS daily_active_users_dau","description":"Unique users who performed a meaningful action in the product on a given day.","department":"Product","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","user_id@product_event"]},{"metric":"Weekly Active Users (WAU)","formulaId":"weekly_active_users_wau","fields":["event_date","product_event_type","user_id"],"fieldTypes":{"event_date":"date","product_event_type":"string","user_id":"string"},"datasets":["product_event"],"source":"Product Analytics","frequency":"Daily","grain":"Distinct users in a trailing window (1, 7 or 30 days) ending at period end","exampleQuery":"SELECT (SELECT COUNT(DISTINCT user_id) FROM product_event WHERE event_date >= ((:period_end + INTERVAL '1 day') - INTERVAL '7 day') AND event_date <= :period_end AND product_event_type = 'qualifying') AS weekly_active_users_wau","description":"Unique users who performed a meaningful action in the product within a 7-day period.","department":"Product","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","user_id@product_event"]},{"metric":"Monthly Active Users (MAU)","formulaId":"monthly_active_users_mau","fields":["event_date","product_event_type","user_id"],"fieldTypes":{"event_date":"date","product_event_type":"string","user_id":"string"},"datasets":["product_event"],"source":"Product Analytics","frequency":"Daily","grain":"Distinct users in a trailing window (1, 7 or 30 days) ending at period end","exampleQuery":"SELECT (SELECT COUNT(DISTINCT user_id) FROM product_event WHERE event_date >= ((:period_end + INTERVAL '1 day') - INTERVAL '30 day') AND event_date <= :period_end AND product_event_type = 'qualifying') AS monthly_active_users_mau","description":"Unique users who performed a meaningful action in the product within a 30-day period.","department":"Product","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","user_id@product_event"]},{"metric":"DAU/MAU Ratio (Stickiness)","formulaId":"dau_mau","fields":["event_date","product_event_type","user_id"],"fieldTypes":{"event_date":"date","product_event_type":"string","user_id":"string"},"datasets":["product_event"],"source":"Product Analytics","frequency":"Daily","grain":"Distinct users in a trailing window (1, 7 or 30 days) ending at period end","exampleQuery":"SELECT (CAST(((SELECT COUNT(DISTINCT user_id) FROM product_event WHERE event_date >= ((:period_end + INTERVAL '1 day') - INTERVAL '1 day') AND event_date <= :period_end AND product_event_type = 'qualifying')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT user_id) FROM product_event WHERE event_date >= ((:period_end + INTERVAL '1 day') - INTERVAL '30 day') AND event_date <= :period_end AND product_event_type = 'qualifying')), 0)) AS dau_mau","description":"The ratio of daily to monthly active users, indicating how often users return.","department":"Product","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","user_id@product_event"]},{"metric":"WAU/MAU Ratio","formulaId":"waumau_ratio","fields":["event_date","product_event_type","user_id"],"fieldTypes":{"event_date":"date","product_event_type":"string","user_id":"string"},"datasets":["product_event"],"source":"Product Analytics","frequency":"Daily","grain":"Distinct users in a trailing window (1, 7 or 30 days) ending at period end","exampleQuery":"SELECT (CAST(((SELECT COUNT(DISTINCT user_id) FROM product_event WHERE event_date >= ((:period_end + INTERVAL '1 day') - INTERVAL '7 day') AND event_date <= :period_end AND product_event_type = 'qualifying')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT user_id) FROM product_event WHERE event_date >= ((:period_end + INTERVAL '1 day') - INTERVAL '30 day') AND event_date <= :period_end AND product_event_type = 'qualifying')), 0)) AS waumau_ratio","description":"Weekly to monthly active user ratio.","department":"Product","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","user_id@product_event"]},{"metric":"Active Accounts","formulaId":"active_accounts","fields":["customer_id","event_date","product_event_type"],"fieldTypes":{"customer_id":"string","event_date":"date","product_event_type":"string"},"datasets":["product_event"],"source":"Product Analytics","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT COUNT(DISTINCT customer_id) FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end AND product_event_type = 'qualifying') AS active_accounts","description":"Customer accounts with at least one active user in the period.","department":"Product","staged":false,"placeholders":["customer_id@product_event","event_date@product_event","product_event_type@product_event"]},{"metric":"Activation Rate","formulaId":"product_activation_rate","fields":["activation_date","signup_date","snapshot_date","user_id"],"fieldTypes":{"activation_date":"date","signup_date":"date","snapshot_date":"date","user_id":"string"},"datasets":["user"],"source":"Product Analytics","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT user_id) FROM user WHERE snapshot_date = :period_end AND ((signup_date >= :period_start AND signup_date <= :period_end) AND activation_date IS NOT NULL)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM user WHERE snapshot_date = :period_end AND (signup_date >= :period_start AND signup_date <= :period_end)), 0)) AS product_activation_rate","description":"Percentage of users who signed up in the period that reached the activation milestone.","department":"Product","staged":false,"placeholders":["activation_date@user","signup_date@user","snapshot_date@user","user_id@user"]},{"metric":"Trial-to-Paid Conversion Rate","formulaId":"trial_to_paid_conversion_rate","fields":["trial_end_date","trial_id","trial_status"],"fieldTypes":{"trial_end_date":"date","trial_id":"string","trial_status":"string"},"datasets":["trial"],"source":"Billing","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT trial_id) FROM trial WHERE trial_end_date >= :period_start AND trial_end_date <= :period_end AND (trial_status = 'converted' AND (trial_end_date >= :period_start AND trial_end_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT trial_id) FROM trial WHERE trial_end_date >= :period_start AND trial_end_date <= :period_end AND (trial_status IN ('converted', 'expired', 'cancelled') AND (trial_end_date >= :period_start AND trial_end_date <= :period_end))), 0)) AS trial_to_paid_conversion_rate","description":"The percentage of trials that ended in the period and became paying customers.","department":"Product","staged":false,"placeholders":["trial_end_date@trial","trial_id@trial","trial_status@trial"]},{"metric":"Feature Adoption Rate","formulaId":"feature_adoption","fields":["event_date","feature_id","product_event_type","user_id"],"fieldTypes":{"event_date":"date","feature_id":"string","product_event_type":"string","user_id":"string"},"datasets":["product_event"],"source":"Product Analytics","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT user_id) FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end AND feature_id IS NOT NULL) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end AND product_event_type = 'qualifying'), 0)) AS feature_adoption","description":"Percentage of active users who used a specific feature in the period.","department":"Product","staged":false,"placeholders":["event_date@product_event","feature_id@product_event","product_event_type@product_event","user_id@product_event"]},{"metric":"Core Feature Adoption","formulaId":"core_feature_adoption","fields":["core_features_adopted","event_date","product_event_type","snapshot_date","user_id"],"fieldTypes":{"core_features_adopted":"boolean","event_date":"date","product_event_type":"string","snapshot_date":"date","user_id":"string"},"datasets":["product_event","user"],"source":"Product Analytics","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT user_id) FROM user WHERE snapshot_date = :period_end AND core_features_adopted = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end AND product_event_type = 'qualifying'), 0)) AS core_feature_adoption","description":"Percentage of users using the core features that define the product.","department":"Product","staged":false,"placeholders":["core_features_adopted@user","event_date@product_event","product_event_type@product_event","snapshot_date@user","user_id@product_event","user_id@user"]},{"metric":"Feature Depth","formulaId":"feature_depth","fields":["event_date","usage_count","user_id"],"fieldTypes":{"event_date":"date","usage_count":"integer","user_id":"string"},"datasets":["product_event"],"source":"Product Analytics","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(usage_count), 0) FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end AND usage_count > 0), 0)) AS feature_depth","description":"How intensively users engage with features: average feature actions per user who used a feature in the period.","department":"Product","staged":false,"placeholders":["event_date@product_event","usage_count@product_event","user_id@product_event"]},{"metric":"Time to Feature Adoption","formulaId":"time_to_feature_adoption","fields":["first_use_date","signup_date","snapshot_date"],"fieldTypes":{"first_use_date":"date","signup_date":"date","snapshot_date":"date"},"datasets":["user"],"source":"Product Analytics","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (first_use_date - signup_date)) FROM user WHERE snapshot_date = :period_end AND (first_use_date >= :period_start AND first_use_date <= :period_end)) AS time_to_feature_adoption","description":"Median time from signup to a user's first use of a specific feature, for users whose first use falls in the period.","department":"Product","staged":false,"placeholders":["first_use_date@user","signup_date@user","snapshot_date@user"]},{"metric":"Breadth of Adoption","formulaId":"breadth_of_adoption","fields":["customer_id","event_date","feature_id","product_event_type"],"fieldTypes":{"customer_id":"string","event_date":"date","feature_id":"string","product_event_type":"string"},"datasets":["product_event"],"source":"Product Analytics","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(*) FROM (SELECT DISTINCT customer_id, feature_id FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end AND customer_id IS NOT NULL AND feature_id IS NOT NULL) _pairs) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end AND product_event_type = 'qualifying')), 0)) AS breadth_of_adoption","description":"Average number of features used per account.","department":"Product","staged":false,"placeholders":["customer_id@product_event","event_date@product_event","feature_id@product_event","product_event_type@product_event"]},{"metric":"Session Frequency","formulaId":"session_frequency","fields":["event_date","product_event_type","session_id","user_id"],"fieldTypes":{"event_date":"date","product_event_type":"string","session_id":"string","user_id":"string"},"datasets":["product_event"],"source":"Product Analytics","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT session_id) FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end AND product_event_type = 'qualifying'), 0)) AS session_frequency","description":"Average number of sessions per user per period.","department":"Product","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","session_id@product_event","user_id@product_event"]},{"metric":"Session Duration","formulaId":"session_duration","fields":["event_date","session_duration"],"fieldTypes":{"event_date":"date","session_duration":"integer"},"datasets":["product_event"],"source":"Product Analytics","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT AVG(session_duration) FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end) AS session_duration","description":"Average time spent per session.","department":"Product","staged":false,"placeholders":["event_date@product_event","session_duration@product_event"]},{"metric":"Time in Product","formulaId":"time_in_product","fields":["event_date","session_duration","snapshot_date","user_id"],"fieldTypes":{"event_date":"date","session_duration":"integer","snapshot_date":"date","user_id":"string"},"datasets":["product_event","user"],"source":"Product Analytics","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(session_duration), 0) FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM user WHERE snapshot_date = :period_end), 0)) AS time_in_product","description":"Total time spent in product per user per period.","department":"Product","staged":false,"placeholders":["event_date@product_event","session_duration@product_event","snapshot_date@user","user_id@user"]},{"metric":"Actions per Session","formulaId":"actions_per_session","fields":["event_date","session_id","usage_count"],"fieldTypes":{"event_date":"date","session_id":"string","usage_count":"integer"},"datasets":["product_event"],"source":"Product Analytics","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(usage_count), 0) FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT session_id) FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end), 0)) AS actions_per_session","description":"Average number of meaningful actions per session.","department":"Product","staged":false,"placeholders":["event_date@product_event","session_id@product_event","usage_count@product_event"]},{"metric":"Product Qualified Accounts (PQAs)","formulaId":"pqas","fields":["criteria_met","customer_id","snapshot_date"],"fieldTypes":{"criteria_met":"boolean","customer_id":"string","snapshot_date":"date"},"datasets":["customer"],"source":"Product Analytics","frequency":"Daily","grain":"Daily snapshot","exampleQuery":"SELECT (SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND criteria_met = TRUE) AS pqas","description":"Accounts that have demonstrated product engagement indicating sales-readiness.","department":"Product","staged":false,"placeholders":["criteria_met@customer","customer_id@customer","snapshot_date@customer"]},{"metric":"User Retention (Day N)","formulaId":"user_retention_day_n","fields":["event_date","product_event_type","signup_date","snapshot_date","user_id"],"fieldTypes":{"event_date":"date","product_event_type":"string","signup_date":"date","snapshot_date":"date","user_id":"string"},"datasets":["product_event","user"],"source":"Product Analytics","frequency":"Daily","grain":"Monthly cohort","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT user_id) FROM product_event WHERE ((product_event_type = 'qualifying' AND (signup_date >= :period_start AND signup_date <= :period_end)) AND (event_date - signup_date) = 30)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM user WHERE snapshot_date = :period_end AND (signup_date >= :period_start AND signup_date <= :period_end)), 0)) AS user_retention_day_n","description":"Percentage of users who return on day N after signup.","department":"Product","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","signup_date@product_event","signup_date@user","snapshot_date@user","user_id@product_event","user_id@user"]},{"metric":"Cohort Retention","formulaId":"cohort_retention","fields":["event_date","product_event_type","signup_date","snapshot_date","user_id"],"fieldTypes":{"event_date":"date","product_event_type":"string","signup_date":"date","snapshot_date":"date","user_id":"string"},"datasets":["product_event","user"],"source":"Product Analytics","frequency":"Daily","grain":"Monthly cohort","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT user_id) FROM product_event WHERE (((product_event_type = 'qualifying' AND (signup_date >= :period_start AND signup_date <= :period_end)) AND (event_date - signup_date) >= 49) AND (event_date - signup_date) < 56)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM user WHERE snapshot_date = :period_end AND (signup_date >= :period_start AND signup_date <= :period_end)), 0)) AS cohort_retention","description":"Retention tracked by signup cohort over time. The canonical formula reports week 8 for the period's signup cohort.","department":"Product","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","signup_date@product_event","signup_date@user","snapshot_date@user","user_id@product_event","user_id@user"]},{"metric":"Resurrection Rate","formulaId":"resurrection_rate","fields":["event_date","product_event_type","snapshot_date","user_id","user_status"],"fieldTypes":{"event_date":"date","product_event_type":"string","snapshot_date":"date","user_id":"string","user_status":"string"},"datasets":["product_event","user"],"source":"Product Analytics","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT user_id) FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end AND product_event_type = 'reactivation') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM user WHERE snapshot_date = :period_start AND user_status = 'dormant'), 0)) AS resurrection_rate","description":"Percentage of users dormant at period start who returned in the period.","department":"Product","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","snapshot_date@user","user_id@product_event","user_id@user","user_status@user"]},{"metric":"Release Frequency","formulaId":"release_frequency","fields":["release_date","release_id"],"fieldTypes":{"release_date":"date","release_id":"string"},"datasets":["release"],"source":"CI/CD","frequency":"Per deploy","grain":"Per event","exampleQuery":"SELECT (SELECT COUNT(DISTINCT release_id) FROM release WHERE release_date >= :period_start AND release_date <= :period_end) AS release_frequency","description":"How often new releases are shipped to customers.","department":"Product","staged":false,"placeholders":["release_date@release","release_id@release"]},{"metric":"Feature Delivery Rate","formulaId":"feature_delivery_rate","fields":["actual_date","feature_id","planned_date","snapshot_date"],"fieldTypes":{"actual_date":"date","feature_id":"string","planned_date":"date","snapshot_date":"date"},"datasets":["feature"],"source":"CI/CD","frequency":"Per milestone","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT feature_id) FROM feature WHERE snapshot_date = :period_end AND ((planned_date >= :period_start AND planned_date <= :period_end) AND actual_date <= planned_date)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT feature_id) FROM feature WHERE snapshot_date = :period_end AND (planned_date >= :period_start AND planned_date <= :period_end)), 0)) AS feature_delivery_rate","description":"Percentage of planned features delivered on schedule.","department":"Product","staged":false,"placeholders":["actual_date@feature","feature_id@feature","planned_date@feature","snapshot_date@feature"]},{"metric":"Roadmap Completion","formulaId":"roadmap_completion","fields":["roadmap_item_completed","roadmap_item_id","snapshot_date"],"fieldTypes":{"roadmap_item_completed":"boolean","roadmap_item_id":"string","snapshot_date":"date"},"datasets":["roadmap_item"],"source":"Derived","frequency":"Daily","grain":"Open work items at period end","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT roadmap_item_id) FROM roadmap_item WHERE snapshot_date = :period_end AND roadmap_item_completed = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT roadmap_item_id) FROM roadmap_item WHERE snapshot_date = :period_end), 0)) AS roadmap_completion","description":"Percentage of roadmap items completed in the period.","department":"Product","staged":false,"placeholders":["roadmap_item_completed@roadmap_item","roadmap_item_id@roadmap_item","snapshot_date@roadmap_item"]},{"metric":"Time to Market","formulaId":"time_to_market","fields":["feature_created_date","release_date","snapshot_date"],"fieldTypes":{"feature_created_date":"date","release_date":"date","snapshot_date":"date"},"datasets":["feature"],"source":"CI/CD","frequency":"Per milestone","grain":"Per event","exampleQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (release_date - feature_created_date)) FROM feature WHERE snapshot_date = :period_end AND (release_date >= :period_start AND release_date <= :period_end)) AS time_to_market","description":"Time from feature concept to production release.","department":"Product","staged":false,"placeholders":["feature_created_date@feature","release_date@feature","snapshot_date@feature"]},{"metric":"Error Rate (User-Facing)","formulaId":"error_rate_user_facing","fields":["event_date","event_id","product_event_type"],"fieldTypes":{"event_date":"date","event_id":"string","product_event_type":"string"},"datasets":["product_event"],"source":"Product Analytics","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(event_id) FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end AND product_event_type = 'error') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(event_id) FROM product_event WHERE event_date >= :period_start AND event_date <= :period_end AND product_event_type IN ('action', 'error')), 0)) AS error_rate_user_facing","description":"Percentage of user actions that result in errors.","department":"Product","staged":false,"placeholders":["event_date@product_event","event_id@product_event","product_event_type@product_event"]},{"metric":"Bug Escape Rate","formulaId":"bug_escape_rate","fields":["created_at","issue_environment","issue_id","issue_type"],"fieldTypes":{"created_at":"timestamp","issue_environment":"string","issue_id":"string","issue_type":"string"},"datasets":["issue"],"source":"Product Analytics","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT issue_id) FROM issue WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day') AND (issue_type = 'bug' AND issue_environment = 'production')) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT issue_id) FROM issue WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day') AND issue_type = 'bug'), 0)) AS bug_escape_rate","description":"Share of bugs found in production rather than caught in testing.","department":"Product","staged":false,"placeholders":["created_at@issue","issue_environment@issue","issue_id@issue","issue_type@issue"]},{"metric":"User-Reported Issues","formulaId":"user_reported_issues","fields":["created_at","issue_id","issue_source","issue_type"],"fieldTypes":{"created_at":"timestamp","issue_id":"string","issue_source":"string","issue_type":"string"},"datasets":["issue"],"source":"Product Analytics","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT COUNT(DISTINCT issue_id) FROM issue WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day') AND (issue_type = 'bug' AND issue_source = 'user_report')) AS user_reported_issues","description":"Number of bugs/issues reported by users.","department":"Product","staged":false,"placeholders":["created_at@issue","issue_id@issue","issue_source@issue","issue_type@issue"]},{"metric":"Feature Request Volume","formulaId":"feature_request_volume","fields":["created_at","issue_id","issue_type"],"fieldTypes":{"created_at":"timestamp","issue_id":"string","issue_type":"string"},"datasets":["issue"],"source":"Product Analytics","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT COUNT(DISTINCT issue_id) FROM issue WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day') AND issue_type = 'feature_request') AS feature_request_volume","description":"Number of feature requests received.","department":"Product","staged":false,"placeholders":["created_at@issue","issue_id@issue","issue_type@issue"]},{"metric":"Services Revenue","formulaId":"services_revenue","fields":["period_start","revenue","revenue_type"],"fieldTypes":{"period_start":"date","revenue":"decimal","revenue_type":"string"},"datasets":["financials"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end AND revenue_type = 'services') AS services_revenue","description":"Revenue from professional services (implementation, consulting, training).","department":"Professional Services","staged":false,"placeholders":["period_start@financials","revenue@financials","revenue_type@financials"]},{"metric":"Services as % of Total Revenue","formulaId":"services_as_of_total_revenue","fields":["period_start","revenue","revenue_type"],"fieldTypes":{"period_start":"date","revenue":"decimal","revenue_type":"string"},"datasets":["financials"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end AND revenue_type = 'services')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end), 0)) AS services_as_of_total_revenue","description":"Professional services contribution to total revenue.","department":"Professional Services","staged":false,"placeholders":["period_start@financials","revenue@financials","revenue_type@financials"]},{"metric":"Services Attach Rate","formulaId":"services_attach_rate","fields":["close_date","includes_services","opportunity_id","opportunity_stage","snapshot_date"],"fieldTypes":{"close_date":"date","includes_services":"boolean","opportunity_id":"string","opportunity_stage":"string","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND ((includes_services = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND (opportunity_stage = 'closed_won' AND (close_date >= :period_start AND close_date <= :period_end))), 0)) AS services_attach_rate","description":"Percentage of product deals that include services.","department":"Professional Services","staged":false,"placeholders":["close_date@opportunity","includes_services@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},{"metric":"Average Services Deal Size","formulaId":"average_services_deal_size","fields":["opportunity_amount","opportunity_id","revenue_type","snapshot_date"],"fieldTypes":{"opportunity_amount":"decimal","opportunity_id":"string","revenue_type":"string","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND revenue_type = 'services') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND revenue_type = 'services'), 0)) AS average_services_deal_size","description":"Average value of services engagements.","department":"Professional Services","staged":false,"placeholders":["opportunity_amount@opportunity","opportunity_id@opportunity","revenue_type@opportunity","snapshot_date@opportunity"]},{"metric":"Services Backlog","formulaId":"services_backlog","fields":["opportunity_amount","opportunity_stage","period_start","revenue","revenue_type","snapshot_date"],"fieldTypes":{"opportunity_amount":"decimal","opportunity_stage":"string","period_start":"date","revenue":"decimal","revenue_type":"string","snapshot_date":"date"},"datasets":["financials","opportunity"],"source":"CRM","frequency":"Monthly","grain":"Cumulative balance at period end","exampleQuery":"SELECT ((SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND (revenue_type = 'services' AND opportunity_stage = 'closed_won')) - ((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start <= :period_end AND revenue_type = 'services'))) AS services_backlog","description":"Contracted services not yet delivered.","department":"Professional Services","staged":false,"placeholders":["opportunity_amount@opportunity","opportunity_stage@opportunity","period_start@financials","revenue@financials","revenue_type@financials","revenue_type@opportunity","snapshot_date@opportunity"]},{"metric":"Services Gross Margin","formulaId":"services_gross_margin","fields":["cost","cost_function","event_date","period_start","revenue","revenue_type"],"fieldTypes":{"cost":"decimal","cost_function":"string","event_date":"date","period_start":"date","revenue":"decimal","revenue_type":"string"},"datasets":["cost_event","financials"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end AND revenue_type = 'services')) - (SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'services_delivery')) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end AND revenue_type = 'services')), 0)) AS services_gross_margin","description":"Services revenue minus direct delivery costs.","department":"Professional Services","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","period_start@financials","revenue@financials","revenue_type@financials"]},{"metric":"Project Margin","formulaId":"project_margin","fields":["project_completion_date","project_cost","project_revenue","snapshot_date"],"fieldTypes":{"project_completion_date":"date","project_cost":"decimal","project_revenue":"decimal","snapshot_date":"date"},"datasets":["project"],"source":"PSA","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST(((SELECT COALESCE(SUM(project_revenue), 0) FROM project WHERE snapshot_date = :period_end AND (project_completion_date >= :period_start AND project_completion_date <= :period_end)) - (SELECT COALESCE(SUM(project_cost), 0) FROM project WHERE snapshot_date = :period_end AND (project_completion_date >= :period_start AND project_completion_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(project_revenue), 0) FROM project WHERE snapshot_date = :period_end AND (project_completion_date >= :period_start AND project_completion_date <= :period_end)), 0)) AS project_margin","description":"Gross margin on individual projects.","department":"Professional Services","staged":false,"placeholders":["project_completion_date@project","project_cost@project","project_revenue@project","snapshot_date@project"]},{"metric":"Realization Rate","formulaId":"realization_rate","fields":["billed_hours","billed_revenue","entry_date","standard_rate"],"fieldTypes":{"billed_hours":"decimal","billed_revenue":"decimal","entry_date":"date","standard_rate":"decimal"},"datasets":["time_entry"],"source":"PSA","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(billed_revenue), 0) FROM time_entry WHERE entry_date >= :period_start AND entry_date <= :period_end) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM((billed_hours * standard_rate)), 0) FROM time_entry WHERE entry_date >= :period_start AND entry_date <= :period_end), 0)) AS realization_rate","description":"Actual revenue realized vs potential revenue at standard rates.","department":"Professional Services","staged":false,"placeholders":["billed_hours@time_entry","billed_revenue@time_entry","entry_date@time_entry","standard_rate@time_entry"]},{"metric":"Write-off Rate","formulaId":"write_off_rate","fields":["billed_hours","entry_date","written_off_hours"],"fieldTypes":{"billed_hours":"decimal","entry_date":"date","written_off_hours":"decimal"},"datasets":["time_entry"],"source":"PSA","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(written_off_hours), 0) FROM time_entry WHERE entry_date >= :period_start AND entry_date <= :period_end) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(billed_hours), 0) FROM time_entry WHERE entry_date >= :period_start AND entry_date <= :period_end), 0)) AS write_off_rate","description":"Percentage of billable hours written off (not billed to client).","department":"Professional Services","staged":false,"placeholders":["billed_hours@time_entry","entry_date@time_entry","written_off_hours@time_entry"]},{"metric":"Billable Utilization","formulaId":"billable_utilization","fields":["available_hours","entry_date","hours","period_start","time_entry_type"],"fieldTypes":{"available_hours":"decimal","entry_date":"date","hours":"decimal","period_start":"date","time_entry_type":"string"},"datasets":["consultant","time_entry"],"source":"PSA","frequency":"Weekly","grain":"Weekly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(hours), 0) FROM time_entry WHERE entry_date >= :period_start AND entry_date <= :period_end AND time_entry_type = 'billable') AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(available_hours), 0) FROM consultant WHERE period_start >= :period_start AND period_start <= :period_end), 0)) AS billable_utilization","description":"Percentage of available time spent on billable work.","department":"Professional Services","staged":false,"placeholders":["available_hours@consultant","entry_date@time_entry","hours@time_entry","period_start@consultant","time_entry_type@time_entry"]},{"metric":"Total Utilization","formulaId":"total_utilization","fields":["available_hours","entry_date","hours","period_start","time_entry_type"],"fieldTypes":{"available_hours":"decimal","entry_date":"date","hours":"decimal","period_start":"date","time_entry_type":"string"},"datasets":["consultant","time_entry"],"source":"PSA","frequency":"Weekly","grain":"Weekly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(hours), 0) FROM time_entry WHERE entry_date >= :period_start AND entry_date <= :period_end AND time_entry_type IN ('billable', 'training', 'pre_sales', 'internal')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(available_hours), 0) FROM consultant WHERE period_start >= :period_start AND period_start <= :period_end), 0)) AS total_utilization","description":"Percentage of time spent on all productive work (billable + non-billable).","department":"Professional Services","staged":false,"placeholders":["available_hours@consultant","entry_date@time_entry","hours@time_entry","period_start@consultant","time_entry_type@time_entry"]},{"metric":"Bench Rate","formulaId":"bench_rate","fields":["consultant_id","period_start","project_id","snapshot_date"],"fieldTypes":{"consultant_id":"string","period_start":"date","project_id":"string","snapshot_date":"date"},"datasets":["consultant","project"],"source":"PSA","frequency":"Weekly","grain":"Weekly snapshot","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT consultant_id) FROM project WHERE snapshot_date = :period_end AND project_id IS NULL) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT consultant_id) FROM consultant WHERE period_start >= :period_start AND period_start <= :period_end), 0)) AS bench_rate","description":"Percentage of team without billable assignment.","department":"Professional Services","staged":false,"placeholders":["consultant_id@consultant","consultant_id@project","period_start@consultant","project_id@project","snapshot_date@project"]},{"metric":"Capacity","formulaId":"capacity","fields":["available_hours","period_start"],"fieldTypes":{"available_hours":"decimal","period_start":"date"},"datasets":["consultant"],"source":"PSA","frequency":"Weekly","grain":"Weekly aggregate","exampleQuery":"SELECT (SELECT COALESCE(SUM(available_hours), 0) FROM consultant WHERE period_start >= :period_start AND period_start <= :period_end) AS capacity","description":"Total billable hours available in period.","department":"Professional Services","staged":false,"placeholders":["available_hours@consultant","period_start@consultant"]},{"metric":"Capacity Utilization","formulaId":"capacity_utilization","fields":["available_hours","hours_budgeted","period_start","snapshot_date"],"fieldTypes":{"available_hours":"decimal","hours_budgeted":"decimal","period_start":"date","snapshot_date":"date"},"datasets":["consultant","project"],"source":"PSA","frequency":"Weekly","grain":"Weekly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(hours_budgeted), 0) FROM project WHERE snapshot_date = :period_end) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(available_hours), 0) FROM consultant WHERE period_start >= :period_start AND period_start <= :period_end)), 0)) AS capacity_utilization","description":"Billable hours sold vs available. Hours booked are the budgeted hours on sold projects.","department":"Professional Services","staged":false,"placeholders":["available_hours@consultant","hours_budgeted@project","period_start@consultant","snapshot_date@project"]},{"metric":"On-Time Delivery","formulaId":"on_time_delivery","fields":["project_completion_date","project_id","snapshot_date","target_date"],"fieldTypes":{"project_completion_date":"date","project_id":"string","snapshot_date":"date","target_date":"date"},"datasets":["project"],"source":"PSA","frequency":"Per milestone","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT project_id) FROM project WHERE snapshot_date = :period_end AND ((project_completion_date >= :period_start AND project_completion_date <= :period_end) AND project_completion_date <= target_date)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT project_id) FROM project WHERE snapshot_date = :period_end AND (project_completion_date >= :period_start AND project_completion_date <= :period_end)), 0)) AS on_time_delivery","description":"Percentage of projects delivered by committed date.","department":"Professional Services","staged":false,"placeholders":["project_completion_date@project","project_id@project","snapshot_date@project","target_date@project"]},{"metric":"On-Budget Delivery","formulaId":"on_budget_delivery","fields":["hours_actual","hours_budgeted","project_completion_date","project_id","snapshot_date"],"fieldTypes":{"hours_actual":"decimal","hours_budgeted":"decimal","project_completion_date":"date","project_id":"string","snapshot_date":"date"},"datasets":["project"],"source":"PSA","frequency":"Per milestone","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT project_id) FROM project WHERE snapshot_date = :period_end AND ((project_completion_date >= :period_start AND project_completion_date <= :period_end) AND hours_actual <= hours_budgeted)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT project_id) FROM project WHERE snapshot_date = :period_end AND (project_completion_date >= :period_start AND project_completion_date <= :period_end)), 0)) AS on_budget_delivery","description":"Percentage of projects completed in the period within their budgeted hours.","department":"Professional Services","staged":false,"placeholders":["hours_actual@project","hours_budgeted@project","project_completion_date@project","project_id@project","snapshot_date@project"]},{"metric":"Scope Change Rate","formulaId":"scope_change_rate","fields":["project_id","scope_changed","snapshot_date"],"fieldTypes":{"project_id":"string","scope_changed":"boolean","snapshot_date":"date"},"datasets":["project"],"source":"PSA","frequency":"Weekly","grain":"Weekly snapshot","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT project_id) FROM project WHERE snapshot_date = :period_end AND scope_changed = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT project_id) FROM project WHERE snapshot_date = :period_end), 0)) AS scope_change_rate","description":"Percentage of projects with scope changes.","department":"Professional Services","staged":false,"placeholders":["project_id@project","scope_changed@project","snapshot_date@project"]},{"metric":"Project Duration Accuracy","formulaId":"project_duration_accuracy","fields":["project_completion_date","project_start_date","snapshot_date","target_date"],"fieldTypes":{"project_completion_date":"date","project_start_date":"date","snapshot_date":"date","target_date":"date"},"datasets":["project"],"source":"PSA","frequency":"Per milestone","grain":"Per event","exampleQuery":"SELECT (SELECT AVG((CAST((target_date - project_start_date) AS DOUBLE PRECISION) / NULLIF((project_completion_date - project_start_date), 0))) FROM project WHERE snapshot_date = :period_end AND (project_completion_date >= :period_start AND project_completion_date <= :period_end)) AS project_duration_accuracy","description":"Actual duration vs estimated duration.","department":"Professional Services","staged":false,"placeholders":["project_completion_date@project","project_start_date@project","snapshot_date@project","target_date@project"]},{"metric":"Project Milestone Completion Rate","formulaId":"project_milestone_completion_rate","fields":["actual_date","planned_date","project_milestone_id","snapshot_date"],"fieldTypes":{"actual_date":"date","planned_date":"date","project_milestone_id":"string","snapshot_date":"date"},"datasets":["project_milestone"],"source":"PSA","frequency":"Per milestone","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT project_milestone_id) FROM project_milestone WHERE snapshot_date = :period_end AND ((actual_date >= :period_start AND actual_date <= :period_end) AND actual_date <= planned_date)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT project_milestone_id) FROM project_milestone WHERE snapshot_date = :period_end AND (actual_date >= :period_start AND actual_date <= :period_end)), 0)) AS project_milestone_completion_rate","description":"Percentage of milestones completed on schedule.","department":"Professional Services","staged":false,"placeholders":["actual_date@project_milestone","planned_date@project_milestone","project_milestone_id@project_milestone","snapshot_date@project_milestone"]},{"metric":"Project CSAT","formulaId":"project_csat","fields":["satisfaction_score","survey_date","survey_type"],"fieldTypes":{"satisfaction_score":"integer","survey_date":"date","survey_type":"string"},"datasets":["survey_response"],"source":"Survey Tool","frequency":"Per response","grain":"Per survey response","exampleQuery":"SELECT (CAST((SELECT COUNT(satisfaction_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND (survey_type = 'project' AND satisfaction_score >= 4)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(satisfaction_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND survey_type = 'project'), 0)) AS project_csat","description":"Customer satisfaction with services engagement.","department":"Professional Services","staged":false,"placeholders":["satisfaction_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},{"metric":"Project NPS","formulaId":"project_nps","fields":["nps_score","survey_date","survey_type"],"fieldTypes":{"nps_score":"integer","survey_date":"date","survey_type":"string"},"datasets":["survey_response"],"source":"Survey Tool","frequency":"Per response","grain":"Per survey response","exampleQuery":"SELECT ((CAST(((SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND (survey_type = 'project' AND nps_score >= 9)) - (SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND (survey_type = 'project' AND nps_score <= 6))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(nps_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND survey_type = 'project'), 0)) * 100) AS project_nps","description":"Net Promoter Score for services experience.","department":"Professional Services","staged":false,"placeholders":["nps_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},{"metric":"Project Escalation Rate","formulaId":"project_escalation_rate","fields":["escalated","project_id","snapshot_date"],"fieldTypes":{"escalated":"boolean","project_id":"string","snapshot_date":"date"},"datasets":["project"],"source":"PSA","frequency":"Weekly","grain":"Weekly snapshot","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT project_id) FROM project WHERE snapshot_date = :period_end AND escalated = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT project_id) FROM project WHERE snapshot_date = :period_end), 0)) AS project_escalation_rate","description":"Percentage of projects with escalations.","department":"Professional Services","staged":false,"placeholders":["escalated@project","project_id@project","snapshot_date@project"]},{"metric":"Rework Rate","formulaId":"rework_rate","fields":["deliverable_id","reworked","snapshot_date"],"fieldTypes":{"deliverable_id":"string","reworked":"boolean","snapshot_date":"date"},"datasets":["deliverable"],"source":"PSA","frequency":"Weekly","grain":"Weekly snapshot","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT deliverable_id) FROM deliverable WHERE snapshot_date = :period_end AND reworked = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT deliverable_id) FROM deliverable WHERE snapshot_date = :period_end), 0)) AS rework_rate","description":"Percentage of deliverables requiring rework.","department":"Professional Services","staged":false,"placeholders":["deliverable_id@deliverable","reworked@deliverable","snapshot_date@deliverable"]},{"metric":"Reference-ability","formulaId":"reference_ability","fields":["project_completion_date","project_id","referenceable","snapshot_date"],"fieldTypes":{"project_completion_date":"date","project_id":"string","referenceable":"boolean","snapshot_date":"date"},"datasets":["project"],"source":"PSA","frequency":"Per milestone","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT project_id) FROM project WHERE snapshot_date = :period_end AND ((project_completion_date >= :period_start AND project_completion_date <= :period_end) AND referenceable = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT project_id) FROM project WHERE snapshot_date = :period_end AND (project_completion_date >= :period_start AND project_completion_date <= :period_end)), 0)) AS reference_ability","description":"Percentage of completed projects that become referenceable.","department":"Professional Services","staged":false,"placeholders":["project_completion_date@project","project_id@project","referenceable@project","snapshot_date@project"]},{"metric":"Revenue per Consultant","formulaId":"revenue_per_consultant","fields":["consultant_id","period_start","revenue","revenue_type"],"fieldTypes":{"consultant_id":"string","period_start":"date","revenue":"decimal","revenue_type":"string"},"datasets":["consultant","financials"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end AND revenue_type = 'services')) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT consultant_id) FROM consultant WHERE period_start >= :period_start AND period_start <= :period_end), 0)) AS revenue_per_consultant","description":"Services revenue per delivery resource.","department":"Professional Services","staged":false,"placeholders":["consultant_id@consultant","period_start@consultant","period_start@financials","revenue@financials","revenue_type@financials"]},{"metric":"Projects per Consultant","formulaId":"projects_per_consultant","fields":["consultant_id","project_completion_date","project_id","snapshot_date"],"fieldTypes":{"consultant_id":"string","project_completion_date":"date","project_id":"string","snapshot_date":"date"},"datasets":["project"],"source":"PSA","frequency":"Per milestone","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT project_id) FROM project WHERE snapshot_date = :period_end AND (project_completion_date >= :period_start AND project_completion_date <= :period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT consultant_id) FROM project WHERE snapshot_date = :period_end AND (project_completion_date >= :period_start AND project_completion_date <= :period_end)), 0)) AS projects_per_consultant","description":"Average projects completed per consultant in the period.","department":"Professional Services","staged":false,"placeholders":["consultant_id@project","project_completion_date@project","project_id@project","snapshot_date@project"]},{"metric":"Average Project Duration","formulaId":"average_project_duration","fields":["project_completion_date","project_start_date","snapshot_date"],"fieldTypes":{"project_completion_date":"date","project_start_date":"date","snapshot_date":"date"},"datasets":["project"],"source":"PSA","frequency":"Per milestone","grain":"Per event","exampleQuery":"SELECT (SELECT AVG((project_completion_date - project_start_date)) FROM project WHERE snapshot_date = :period_end AND (project_completion_date >= :period_start AND project_completion_date <= :period_end)) AS average_project_duration","description":"Average length, in days, of projects completed in the period.","department":"Professional Services","staged":false,"placeholders":["project_completion_date@project","project_start_date@project","snapshot_date@project"]},{"metric":"Services Pipeline","formulaId":"services_pipeline","fields":["opportunity_amount","opportunity_stage","revenue_type","snapshot_date"],"fieldTypes":{"opportunity_amount":"decimal","opportunity_stage":"string","revenue_type":"string","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Daily sync","grain":"Daily snapshot","exampleQuery":"SELECT (SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND (revenue_type = 'services' AND opportunity_stage NOT IN ('closed_won', 'closed_lost'))) AS services_pipeline","description":"Value of services opportunities in pipeline.","department":"Professional Services","staged":false,"placeholders":["opportunity_amount@opportunity","opportunity_stage@opportunity","revenue_type@opportunity","snapshot_date@opportunity"]},{"metric":"Services Win Rate","formulaId":"services_win_rate","fields":["close_date","opportunity_id","opportunity_stage","revenue_type","snapshot_date"],"fieldTypes":{"close_date":"date","opportunity_id":"string","opportunity_stage":"string","revenue_type":"string","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND ((revenue_type = 'services' AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND ((revenue_type = 'services' AND opportunity_stage IN ('closed_won', 'closed_lost')) AND (close_date >= :period_start AND close_date <= :period_end))), 0)) AS services_win_rate","description":"Percentage of services opportunities won.","department":"Professional Services","staged":false,"placeholders":["close_date@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","revenue_type@opportunity","snapshot_date@opportunity"]},{"metric":"Time to Start","formulaId":"time_to_start","fields":["close_date","project_start_date","snapshot_date"],"fieldTypes":{"close_date":"date","project_start_date":"date","snapshot_date":"date"},"datasets":["project"],"source":"PSA","frequency":"Per milestone","grain":"Per event","exampleQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (project_start_date - close_date)) FROM project WHERE snapshot_date = :period_end AND (project_start_date >= :period_start AND project_start_date <= :period_end)) AS time_to_start","description":"Time from services sold to project kickoff.","department":"Professional Services","staged":false,"placeholders":["close_date@project","project_start_date@project","snapshot_date@project"]},{"metric":"Pipeline Hygiene Score","formulaId":"pipeline_hygiene_score","fields":["close_date_valid","opportunity_id","required_fields_complete","snapshot_date","stage_accurate","updated_within_sla"],"fieldTypes":{"close_date_valid":"boolean","opportunity_id":"string","required_fields_complete":"boolean","snapshot_date":"date","stage_accurate":"boolean","updated_within_sla":"boolean"},"datasets":["opportunity"],"source":"CRM","frequency":"Weekly","grain":"Weekly snapshot","exampleQuery":"SELECT (CAST(((((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND required_fields_complete = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end), 0)) + (CAST((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND updated_within_sla = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end), 0))) + (CAST((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND close_date_valid = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end), 0))) + (CAST((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND stage_accurate = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end), 0))) AS DOUBLE PRECISION) / 4) AS pipeline_hygiene_score","description":"Quality assessment of pipeline data and process adherence across open opportunities.","department":"RevOps","staged":false,"placeholders":["close_date_valid@opportunity","opportunity_id@opportunity","required_fields_complete@opportunity","snapshot_date@opportunity","stage_accurate@opportunity","updated_within_sla@opportunity"]},{"metric":"Forecast Accuracy","formulaId":"forecast_accuracy","fields":["actual_revenue","forecasted_revenue","period_start"],"fieldTypes":{"actual_revenue":"decimal","forecasted_revenue":"decimal","period_start":"date"},"datasets":["forecast"],"source":"CRM","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (1 - (CAST(ABS(((SELECT COALESCE(SUM(forecasted_revenue), 0) FROM forecast WHERE period_start >= :period_start AND period_start <= :period_end) - (SELECT COALESCE(SUM(actual_revenue), 0) FROM forecast WHERE period_start >= :period_start AND period_start <= :period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(actual_revenue), 0) FROM forecast WHERE period_start >= :period_start AND period_start <= :period_end), 0))) AS forecast_accuracy","description":"How closely forecasted revenue matched actual revenue.","department":"RevOps","staged":false,"placeholders":["actual_revenue@forecast","forecasted_revenue@forecast","period_start@forecast"]},{"metric":"Commit Accuracy","formulaId":"commit_accuracy","fields":["close_date","forecast_category","opportunity_id","opportunity_stage","snapshot_date"],"fieldTypes":{"close_date":"date","forecast_category":"string","opportunity_id":"string","opportunity_stage":"string","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND ((forecast_category = 'commit' AND opportunity_stage = 'closed_won') AND (close_date >= :period_start AND close_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND forecast_category = 'commit'), 0)) AS commit_accuracy","description":"Percentage of committed deals that close.","department":"RevOps","staged":false,"placeholders":["close_date@opportunity","forecast_category@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},{"metric":"Stage Conversion Rates","formulaId":"stage_conversion_rates","fields":["advanced_to_next_stage","opportunity_id","snapshot_date"],"fieldTypes":{"advanced_to_next_stage":"boolean","opportunity_id":"string","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Weekly","grain":"Weekly snapshot","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND advanced_to_next_stage = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end), 0)) AS stage_conversion_rates","description":"Conversion rate between each pipeline stage.","department":"RevOps","staged":false,"placeholders":["advanced_to_next_stage@opportunity","opportunity_id@opportunity","snapshot_date@opportunity"]},{"metric":"Quote Volume","formulaId":"quote_volume","fields":["quote_id","quote_sent_at","snapshot_date"],"fieldTypes":{"quote_id":"string","quote_sent_at":"timestamp","snapshot_date":"date"},"datasets":["quote"],"source":"CRM","frequency":"Per transaction","grain":"Per event","exampleQuery":"SELECT (SELECT COUNT(DISTINCT quote_id) FROM quote WHERE snapshot_date = :period_end AND (quote_sent_at >= :period_start AND quote_sent_at < (:period_end + INTERVAL '1 day'))) AS quote_volume","description":"Number of quotes sent in a period.","department":"RevOps","staged":false,"placeholders":["quote_id@quote","quote_sent_at@quote","snapshot_date@quote"]},{"metric":"Quote-to-Order Rate","formulaId":"quote_to_order_rate","fields":["order_completed_at","order_id","quote_id","quote_sent_at","snapshot_date"],"fieldTypes":{"order_completed_at":"timestamp","order_id":"string","quote_id":"string","quote_sent_at":"timestamp","snapshot_date":"date"},"datasets":["order","quote"],"source":"Billing","frequency":"Per transaction","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT order_id) FROM order WHERE snapshot_date = :period_end AND (order_completed_at >= :period_start AND order_completed_at < (:period_end + INTERVAL '1 day'))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT quote_id) FROM quote WHERE snapshot_date = :period_end AND (quote_sent_at >= :period_start AND quote_sent_at < (:period_end + INTERVAL '1 day'))), 0)) AS quote_to_order_rate","description":"Percentage of quotes that convert to orders.","department":"RevOps","staged":false,"placeholders":["order_completed_at@order","order_id@order","quote_id@quote","quote_sent_at@quote","snapshot_date@order","snapshot_date@quote"]},{"metric":"Quote Cycle Time","formulaId":"quote_cycle_time","fields":["quote_requested_at","quote_sent_at","snapshot_date"],"fieldTypes":{"quote_requested_at":"timestamp","quote_sent_at":"timestamp","snapshot_date":"date"},"datasets":["quote"],"source":"CRM","frequency":"Per transaction","grain":"Per event","exampleQuery":"SELECT ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (EXTRACT(EPOCH FROM (quote_sent_at - quote_requested_at)) / 86400.0)) FROM quote WHERE snapshot_date = :period_end AND (quote_sent_at >= :period_start AND quote_sent_at < (:period_end + INTERVAL '1 day'))) * 24) AS quote_cycle_time","description":"Time from quote request to quote delivery.","department":"RevOps","staged":false,"placeholders":["quote_requested_at@quote","quote_sent_at@quote","snapshot_date@quote"]},{"metric":"Quote Accuracy","formulaId":"quote_accuracy","fields":["quote_id","quote_sent_at","revision_count","snapshot_date"],"fieldTypes":{"quote_id":"string","quote_sent_at":"timestamp","revision_count":"integer","snapshot_date":"date"},"datasets":["quote"],"source":"CRM","frequency":"Per transaction","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT quote_id) FROM quote WHERE snapshot_date = :period_end AND ((quote_sent_at >= :period_start AND quote_sent_at < (:period_end + INTERVAL '1 day')) AND revision_count = 0)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT quote_id) FROM quote WHERE snapshot_date = :period_end AND (quote_sent_at >= :period_start AND quote_sent_at < (:period_end + INTERVAL '1 day'))), 0)) AS quote_accuracy","description":"Percentage of quotes requiring no revision.","department":"RevOps","staged":false,"placeholders":["quote_id@quote","quote_sent_at@quote","revision_count@quote","snapshot_date@quote"]},{"metric":"Discount Rate","formulaId":"discount_rate","fields":["list_price","quote_sent_at","quoted_price","snapshot_date"],"fieldTypes":{"list_price":"decimal","quote_sent_at":"timestamp","quoted_price":"decimal","snapshot_date":"date"},"datasets":["quote"],"source":"CRM","frequency":"Per transaction","grain":"Per event","exampleQuery":"SELECT (CAST(((SELECT COALESCE(SUM(list_price), 0) FROM quote WHERE snapshot_date = :period_end AND (quote_sent_at >= :period_start AND quote_sent_at < (:period_end + INTERVAL '1 day'))) - (SELECT COALESCE(SUM(quoted_price), 0) FROM quote WHERE snapshot_date = :period_end AND (quote_sent_at >= :period_start AND quote_sent_at < (:period_end + INTERVAL '1 day')))) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(list_price), 0) FROM quote WHERE snapshot_date = :period_end AND (quote_sent_at >= :period_start AND quote_sent_at < (:period_end + INTERVAL '1 day'))), 0)) AS discount_rate","description":"Discount off list price across quotes sent in the period, weighted by list price.","department":"RevOps","staged":false,"placeholders":["list_price@quote","quote_sent_at@quote","quoted_price@quote","snapshot_date@quote"]},{"metric":"Order-to-Activation Time","formulaId":"order_to_activation_time","fields":["acquisition_date","activation_date","snapshot_date"],"fieldTypes":{"acquisition_date":"date","activation_date":"date","snapshot_date":"date"},"datasets":["customer"],"source":"Billing","frequency":"Per transaction","grain":"Per event","exampleQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (activation_date - acquisition_date)) FROM customer WHERE snapshot_date = :period_end AND (activation_date >= :period_start AND activation_date <= :period_end)) AS order_to_activation_time","description":"Time from signed order to customer activation/provisioning.","department":"RevOps","staged":false,"placeholders":["acquisition_date@customer","activation_date@customer","snapshot_date@customer"]},{"metric":"Order Processing Time","formulaId":"order_processing_time","fields":["order_completed_at","order_received_at","snapshot_date"],"fieldTypes":{"order_completed_at":"timestamp","order_received_at":"timestamp","snapshot_date":"date"},"datasets":["order"],"source":"Billing","frequency":"Per transaction","grain":"Per event","exampleQuery":"SELECT ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (EXTRACT(EPOCH FROM (order_completed_at - order_received_at)) / 86400.0)) FROM order WHERE snapshot_date = :period_end AND (order_completed_at >= :period_start AND order_completed_at < (:period_end + INTERVAL '1 day'))) * 24) AS order_processing_time","description":"Time to process an order through internal systems.","department":"RevOps","staged":false,"placeholders":["order_completed_at@order","order_received_at@order","snapshot_date@order"]},{"metric":"Order Error Rate","formulaId":"order_error_rate","fields":["has_error","order_completed_at","order_id","snapshot_date"],"fieldTypes":{"has_error":"boolean","order_completed_at":"timestamp","order_id":"string","snapshot_date":"date"},"datasets":["order"],"source":"Billing","frequency":"Per transaction","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT order_id) FROM order WHERE snapshot_date = :period_end AND ((order_completed_at >= :period_start AND order_completed_at < (:period_end + INTERVAL '1 day')) AND has_error = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT order_id) FROM order WHERE snapshot_date = :period_end AND (order_completed_at >= :period_start AND order_completed_at < (:period_end + INTERVAL '1 day'))), 0)) AS order_error_rate","description":"Percentage of orders with processing errors.","department":"RevOps","staged":false,"placeholders":["has_error@order","order_completed_at@order","order_id@order","snapshot_date@order"]},{"metric":"Billing Accuracy","formulaId":"billing_accuracy","fields":["invoice_corrected","invoice_date","invoice_id","snapshot_date"],"fieldTypes":{"invoice_corrected":"boolean","invoice_date":"date","invoice_id":"string","snapshot_date":"date"},"datasets":["invoice"],"source":"Billing","frequency":"Per transaction","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT invoice_id) FROM invoice WHERE snapshot_date = :period_end AND ((invoice_date >= :period_start AND invoice_date <= :period_end) AND invoice_corrected = FALSE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM invoice WHERE snapshot_date = :period_end AND (invoice_date >= :period_start AND invoice_date <= :period_end)), 0)) AS billing_accuracy","description":"Percentage of invoices generated correctly on first attempt.","department":"RevOps","staged":false,"placeholders":["invoice_corrected@invoice","invoice_date@invoice","invoice_id@invoice","snapshot_date@invoice"]},{"metric":"Invoice Cycle Time","formulaId":"invoice_cycle_time","fields":["billing_trigger_date","invoice_date","snapshot_date"],"fieldTypes":{"billing_trigger_date":"date","invoice_date":"date","snapshot_date":"date"},"datasets":["invoice"],"source":"Billing","frequency":"Per transaction","grain":"Per event","exampleQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (invoice_date - billing_trigger_date)) FROM invoice WHERE snapshot_date = :period_end AND (invoice_date >= :period_start AND invoice_date <= :period_end)) AS invoice_cycle_time","description":"Time from billing event to invoice delivery.","department":"RevOps","staged":false,"placeholders":["billing_trigger_date@invoice","invoice_date@invoice","snapshot_date@invoice"]},{"metric":"Billing Disputes","formulaId":"billing_disputes","fields":["invoice_date","invoice_disputed","invoice_id","snapshot_date"],"fieldTypes":{"invoice_date":"date","invoice_disputed":"boolean","invoice_id":"string","snapshot_date":"date"},"datasets":["invoice"],"source":"Billing","frequency":"Per transaction","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT invoice_id) FROM invoice WHERE snapshot_date = :period_end AND ((invoice_date >= :period_start AND invoice_date <= :period_end) AND invoice_disputed = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM invoice WHERE snapshot_date = :period_end AND (invoice_date >= :period_start AND invoice_date <= :period_end)), 0)) AS billing_disputes","description":"Percentage of invoices disputed by customers.","department":"RevOps","staged":false,"placeholders":["invoice_date@invoice","invoice_disputed@invoice","invoice_id@invoice","snapshot_date@invoice"]},{"metric":"Credit Memo Rate","formulaId":"credit_memo_rate","fields":["credit_memo_count","invoice_date","invoice_id","snapshot_date"],"fieldTypes":{"credit_memo_count":"integer","invoice_date":"date","invoice_id":"string","snapshot_date":"date"},"datasets":["invoice"],"source":"Billing","frequency":"Per transaction","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT invoice_id) FROM invoice WHERE snapshot_date = :period_end AND ((invoice_date >= :period_start AND invoice_date <= :period_end) AND credit_memo_count > 0)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM invoice WHERE snapshot_date = :period_end AND (invoice_date >= :period_start AND invoice_date <= :period_end)), 0)) AS credit_memo_rate","description":"Percentage of invoices requiring credit memos.","department":"RevOps","staged":false,"placeholders":["credit_memo_count@invoice","invoice_date@invoice","invoice_id@invoice","snapshot_date@invoice"]},{"metric":"Days Sales Outstanding (DSO)","formulaId":"dso","fields":["accounts_receivable","period_start","revenue","snapshot_date"],"fieldTypes":{"accounts_receivable":"decimal","period_start":"date","revenue":"decimal","snapshot_date":"date"},"datasets":["balance_sheet","financials"],"source":"Finance / ERP","frequency":"Monthly","grain":"End-of-month receivables snapshot","exampleQuery":"SELECT ((CAST((SELECT COALESCE(SUM(accounts_receivable), 0) FROM balance_sheet WHERE snapshot_date = :period_end) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(revenue), 0) FROM financials WHERE period_start >= :period_start AND period_start <= :period_end)), 0)) * (:period_end - :period_start + 1)) AS dso","description":"Average days to collect payment after invoicing.","department":"RevOps","staged":false,"placeholders":["accounts_receivable@balance_sheet","period_start@financials","revenue@financials","snapshot_date@balance_sheet"]},{"metric":"Collection Effectiveness Index (CEI)","formulaId":"collection_effectiveness_index_cei","fields":["accounts_receivable","invoice_amount","invoice_date","outstanding_amount","snapshot_date"],"fieldTypes":{"accounts_receivable":"decimal","invoice_amount":"decimal","invoice_date":"date","outstanding_amount":"decimal","snapshot_date":"date"},"datasets":["balance_sheet","invoice"],"source":"Billing","frequency":"Monthly","grain":"End-of-month receivables snapshot","exampleQuery":"SELECT (CAST((((SELECT COALESCE(SUM(accounts_receivable), 0) FROM balance_sheet WHERE snapshot_date = :period_start) + (SELECT COALESCE(SUM(invoice_amount), 0) FROM invoice WHERE snapshot_date = :period_end AND (invoice_date >= :period_start AND invoice_date <= :period_end))) - (SELECT COALESCE(SUM(accounts_receivable), 0) FROM balance_sheet WHERE snapshot_date = :period_end)) AS DOUBLE PRECISION) / NULLIF((((SELECT COALESCE(SUM(accounts_receivable), 0) FROM balance_sheet WHERE snapshot_date = :period_start) + (SELECT COALESCE(SUM(invoice_amount), 0) FROM invoice WHERE snapshot_date = :period_end AND (invoice_date >= :period_start AND invoice_date <= :period_end))) - (SELECT COALESCE(SUM(outstanding_amount), 0) FROM invoice WHERE snapshot_date = :period_end AND (snapshot_date - invoice_date) <= 30)), 0)) AS collection_effectiveness_index_cei","description":"The share of collectible receivables actually collected in the period. Billings stand in for credit sales. Current AR is receivables aged 30 days or less.","department":"RevOps","staged":false,"placeholders":["accounts_receivable@balance_sheet","invoice_amount@invoice","invoice_date@invoice","outstanding_amount@invoice","snapshot_date@balance_sheet","snapshot_date@invoice"]},{"metric":"Aging Buckets","formulaId":"aging_buckets","fields":["invoice_date","outstanding_amount","snapshot_date"],"fieldTypes":{"invoice_date":"date","outstanding_amount":"decimal","snapshot_date":"date"},"datasets":["invoice"],"source":"Billing","frequency":"Monthly","grain":"End-of-month receivables snapshot","exampleQuery":"SELECT _d.bucket AS bucket, (CAST((SELECT COALESCE(SUM(outstanding_amount), 0) FROM invoice WHERE snapshot_date = :period_end AND CASE WHEN (snapshot_date - invoice_date) BETWEEN 0 AND 30 THEN 'current' WHEN (snapshot_date - invoice_date) BETWEEN 31 AND 60 THEN 'days_31_60' WHEN (snapshot_date - invoice_date) BETWEEN 61 AND 90 THEN 'days_61_90' WHEN (snapshot_date - invoice_date) >= 91 THEN 'days_90_plus' END = _d.bucket) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(outstanding_amount), 0) FROM invoice WHERE snapshot_date = :period_end), 0)) AS aging_buckets\nFROM (SELECT 'current' AS bucket UNION ALL SELECT 'days_31_60' AS bucket UNION ALL SELECT 'days_61_90' AS bucket UNION ALL SELECT 'days_90_plus' AS bucket) _d","description":"Distribution of receivables by age.","department":"RevOps","staged":false,"placeholders":["invoice_date@invoice","outstanding_amount@invoice","snapshot_date@invoice"],"breakdown":{"field":"bucket","expression":"field.snapshot_date - field.invoice_date","buckets":{"current":[0,30],"days_31_60":[31,60],"days_61_90":[61,90],"days_90_plus":[91,null]}}},{"metric":"Accounts Receivable Balance","formulaId":"accounts_receivable_balance","fields":["outstanding_amount","snapshot_date"],"fieldTypes":{"outstanding_amount":"decimal","snapshot_date":"date"},"datasets":["invoice"],"source":"Billing","frequency":"Monthly","grain":"End-of-month receivables snapshot","exampleQuery":"SELECT (SELECT COALESCE(SUM(outstanding_amount), 0) FROM invoice WHERE snapshot_date = :period_end AND outstanding_amount > 0) AS accounts_receivable_balance","description":"Total amount outstanding on open invoices at period end.","department":"RevOps","staged":false,"placeholders":["outstanding_amount@invoice","snapshot_date@invoice"]},{"metric":"Payment Method Distribution","formulaId":"payment_method_distribution","fields":["invoice_amount","invoice_date","payment_method","snapshot_date"],"fieldTypes":{"invoice_amount":"decimal","invoice_date":"date","payment_method":"string","snapshot_date":"date"},"datasets":["invoice"],"source":"Billing","frequency":"Per transaction","grain":"Per event","exampleQuery":"SELECT _d.payment_method AS payment_method, (CAST((SELECT COALESCE(SUM(invoice_amount), 0) FROM invoice WHERE snapshot_date = :period_end AND (invoice_date >= :period_start AND invoice_date <= :period_end) AND payment_method = _d.payment_method) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(invoice_amount), 0) FROM invoice WHERE snapshot_date = :period_end AND ((invoice_date >= :period_start AND invoice_date <= :period_end) AND payment_method IS NOT NULL)), 0)) AS payment_method_distribution\nFROM (SELECT 'credit_card' AS payment_method UNION ALL SELECT 'ach' AS payment_method UNION ALL SELECT 'wire' AS payment_method UNION ALL SELECT 'check' AS payment_method UNION ALL SELECT 'other' AS payment_method) _d","description":"Breakdown of payments by method.","department":"RevOps","staged":false,"placeholders":["invoice_amount@invoice","invoice_date@invoice","payment_method@invoice","snapshot_date@invoice"],"breakdown":{"field":"payment_method"}},{"metric":"Recognized vs Billed","formulaId":"recognized_vs_billed","fields":["billed_amount","period_start","recognized_revenue"],"fieldTypes":{"billed_amount":"decimal","period_start":"date","recognized_revenue":"decimal"},"datasets":["revenue_schedule"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(recognized_revenue), 0) FROM revenue_schedule WHERE period_start >= :period_start AND period_start <= :period_end) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(billed_amount), 0) FROM revenue_schedule WHERE period_start >= :period_start AND period_start <= :period_end), 0)) AS recognized_vs_billed","description":"Ratio of recognized revenue to billed revenue.","department":"RevOps","staged":false,"placeholders":["billed_amount@revenue_schedule","period_start@revenue_schedule","recognized_revenue@revenue_schedule"]},{"metric":"Deferred Revenue Balance","formulaId":"deferred_revenue_balance","fields":["billed_amount","period_start","recognized_revenue"],"fieldTypes":{"billed_amount":"decimal","period_start":"date","recognized_revenue":"decimal"},"datasets":["revenue_schedule"],"source":"Finance / ERP","frequency":"Monthly","grain":"Cumulative balance at period end","exampleQuery":"SELECT ((SELECT COALESCE(SUM(billed_amount), 0) FROM revenue_schedule WHERE period_start <= :period_end) - (SELECT COALESCE(SUM(recognized_revenue), 0) FROM revenue_schedule WHERE period_start <= :period_end)) AS deferred_revenue_balance","description":"Revenue billed but not yet recognized. A balance of cumulative billings less cumulative recognized revenue, independent of when cash is received.","department":"RevOps","staged":false,"placeholders":["billed_amount@revenue_schedule","period_start@revenue_schedule","recognized_revenue@revenue_schedule"]},{"metric":"Unbilled Revenue","formulaId":"unbilled_revenue","fields":["billed_amount","period_start","recognized_revenue"],"fieldTypes":{"billed_amount":"decimal","period_start":"date","recognized_revenue":"decimal"},"datasets":["revenue_schedule"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (SELECT COALESCE(SUM(GREATEST((recognized_revenue - billed_amount), 0)), 0) FROM revenue_schedule WHERE period_start >= :period_start AND period_start <= :period_end) AS unbilled_revenue","description":"Revenue recognized but not yet invoiced.","department":"RevOps","staged":false,"placeholders":["billed_amount@revenue_schedule","period_start@revenue_schedule","recognized_revenue@revenue_schedule"]},{"metric":"Revenue Recognition Accuracy","formulaId":"revenue_recognition_accuracy","fields":["period_start","recognition_correct","recognized_revenue"],"fieldTypes":{"period_start":"date","recognition_correct":"boolean","recognized_revenue":"decimal"},"datasets":["revenue_schedule"],"source":"Finance / ERP","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(recognized_revenue), 0) FROM revenue_schedule WHERE period_start >= :period_start AND period_start <= :period_end AND recognition_correct = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(recognized_revenue), 0) FROM revenue_schedule WHERE period_start >= :period_start AND period_start <= :period_end), 0)) AS revenue_recognition_accuracy","description":"Percentage of revenue correctly recognized per ASC 606.","department":"RevOps","staged":false,"placeholders":["period_start@revenue_schedule","recognition_correct@revenue_schedule","recognized_revenue@revenue_schedule"]},{"metric":"Renewal Notification Rate","formulaId":"renewal_notification_rate","fields":["contract_end","renewal_notified_on_time","snapshot_date","subscription_id"],"fieldTypes":{"contract_end":"date","renewal_notified_on_time":"boolean","snapshot_date":"date","subscription_id":"string"},"datasets":["subscription"],"source":"Billing","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT subscription_id) FROM subscription WHERE snapshot_date = :period_end AND ((contract_end >= :period_start AND contract_end <= :period_end) AND renewal_notified_on_time = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT subscription_id) FROM subscription WHERE snapshot_date = :period_end AND (contract_end >= :period_start AND contract_end <= :period_end)), 0)) AS renewal_notification_rate","description":"Percentage of renewals where customer was notified on time.","department":"RevOps","staged":false,"placeholders":["contract_end@subscription","renewal_notified_on_time@subscription","snapshot_date@subscription","subscription_id@subscription"]},{"metric":"Auto-Renewal Rate","formulaId":"auto_renewal_rate","fields":["auto_renewed","contract_end","snapshot_date","subscription_id"],"fieldTypes":{"auto_renewed":"boolean","contract_end":"date","snapshot_date":"date","subscription_id":"string"},"datasets":["subscription"],"source":"Billing","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT subscription_id) FROM subscription WHERE snapshot_date = :period_end AND ((contract_end >= :period_start AND contract_end <= :period_end) AND auto_renewed = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT subscription_id) FROM subscription WHERE snapshot_date = :period_end AND (contract_end >= :period_start AND contract_end <= :period_end)), 0)) AS auto_renewal_rate","description":"Percentage of renewals processed automatically.","department":"RevOps","staged":false,"placeholders":["auto_renewed@subscription","contract_end@subscription","snapshot_date@subscription","subscription_id@subscription"]},{"metric":"Renewal Processing Time","formulaId":"renewal_processing_time","fields":["contract_end","renewal_complete_date","renewal_trigger_date","snapshot_date"],"fieldTypes":{"contract_end":"date","renewal_complete_date":"date","renewal_trigger_date":"date","snapshot_date":"date"},"datasets":["subscription"],"source":"Billing","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (renewal_complete_date - renewal_trigger_date)) FROM subscription WHERE snapshot_date = :period_end AND (contract_end >= :period_start AND contract_end <= :period_end)) AS renewal_processing_time","description":"Time to process a renewal from trigger to completion.","department":"RevOps","staged":false,"placeholders":["contract_end@subscription","renewal_complete_date@subscription","renewal_trigger_date@subscription","snapshot_date@subscription"]},{"metric":"System Sync Accuracy","formulaId":"system_sync_accuracy","fields":["snapshot_date","sync_status"],"fieldTypes":{"snapshot_date":"date","sync_status":"string"},"datasets":["crm_record"],"source":"CRM","frequency":"Daily","grain":"Daily snapshot","exampleQuery":"SELECT (CAST((SELECT COUNT(sync_status) FROM crm_record WHERE snapshot_date = :period_end AND sync_status = 'matched') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(sync_status) FROM crm_record WHERE snapshot_date = :period_end), 0)) AS system_sync_accuracy","description":"Data consistency across RevOps systems (CRM, billing, ERP).","department":"RevOps","staged":false,"placeholders":["snapshot_date@crm_record","sync_status@crm_record"]},{"metric":"Data Completeness","formulaId":"data_completeness","fields":["populated_field_count","required_field_count","snapshot_date"],"fieldTypes":{"populated_field_count":"integer","required_field_count":"integer","snapshot_date":"date"},"datasets":["crm_record"],"source":"CRM","frequency":"Daily","grain":"Daily snapshot","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(populated_field_count), 0) FROM crm_record WHERE snapshot_date = :period_end) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(required_field_count), 0) FROM crm_record WHERE snapshot_date = :period_end), 0)) AS data_completeness","description":"Percentage of required fields populated in RevOps systems.","department":"RevOps","staged":false,"placeholders":["populated_field_count@crm_record","required_field_count@crm_record","snapshot_date@crm_record"]},{"metric":"Pipeline Value","formulaId":"pipeline_value","fields":["opportunity_amount","opportunity_stage","snapshot_date","stage_probability"],"fieldTypes":{"opportunity_amount":"decimal","opportunity_stage":"string","snapshot_date":"date","stage_probability":"decimal"},"datasets":["opportunity"],"source":"CRM","frequency":"Daily sync","grain":"Daily snapshot","exampleQuery":"SELECT (SELECT COALESCE(SUM((opportunity_amount * stage_probability)), 0) FROM opportunity WHERE snapshot_date = :period_end AND opportunity_stage NOT IN ('closed_won', 'closed_lost')) AS pipeline_value","description":"Total value of open sales opportunities, weighted by stage probability unless stated as unweighted.","department":"Sales","staged":false,"placeholders":["opportunity_amount@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity","stage_probability@opportunity"]},{"metric":"Pipeline Coverage Ratio","formulaId":"pipeline_coverage","fields":["opportunity_amount","opportunity_stage","period_start","quota","snapshot_date"],"fieldTypes":{"opportunity_amount":"decimal","opportunity_stage":"string","period_start":"date","quota":"decimal","snapshot_date":"date"},"datasets":["opportunity","sales_rep"],"source":"CRM","frequency":"Daily sync","grain":"Daily snapshot","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND opportunity_stage NOT IN ('closed_won', 'closed_lost')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(quota), 0) FROM sales_rep WHERE period_start >= :period_start AND period_start <= :period_end), 0)) AS pipeline_coverage","description":"The ratio of unweighted pipeline value to quota for the period.","department":"Sales","staged":false,"placeholders":["opportunity_amount@opportunity","opportunity_stage@opportunity","period_start@sales_rep","quota@sales_rep","snapshot_date@opportunity"]},{"metric":"Pipeline Velocity","formulaId":"pipeline_velocity","fields":["close_date","opportunity_amount","opportunity_created_date","opportunity_id","opportunity_stage","snapshot_date"],"fieldTypes":{"close_date":"date","opportunity_amount":"decimal","opportunity_created_date":"date","opportunity_id":"string","opportunity_stage":"string","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Daily","grain":"Daily snapshot","exampleQuery":"SELECT (CAST((((SELECT COUNT(opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND opportunity_stage NOT IN ('closed_won', 'closed_lost')) * ((CAST((SELECT COUNT(opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND (opportunity_stage = 'closed_won' AND (close_date >= :period_start AND close_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= :period_start AND close_date <= :period_end))), 0)))) * ((CAST((SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND (opportunity_stage = 'closed_won' AND (close_date >= :period_start AND close_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND (opportunity_stage = 'closed_won' AND (close_date >= :period_start AND close_date <= :period_end))), 0)))) AS DOUBLE PRECISION) / NULLIF(((SELECT AVG((close_date - opportunity_created_date)) FROM opportunity WHERE snapshot_date = :period_end AND (opportunity_stage = 'closed_won' AND (close_date >= :period_start AND close_date <= :period_end)))), 0)) AS pipeline_velocity","description":"The speed at which pipeline converts to revenue. Also called Sales Velocity or Deal Velocity.","department":"Sales","staged":false,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_created_date@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},{"metric":"Win Rate","formulaId":"win_rate","fields":["close_date","opportunity_id","opportunity_stage","snapshot_date"],"fieldTypes":{"close_date":"date","opportunity_id":"string","opportunity_stage":"string","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND (opportunity_stage = 'closed_won' AND (close_date >= :period_start AND close_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= :period_start AND close_date <= :period_end))), 0)) AS win_rate","description":"The percentage of qualified opportunities closed in the period that were won.","department":"Sales","staged":false,"placeholders":["close_date@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},{"metric":"Lead-to-Opportunity Rate","formulaId":"lead_to_opportunity_rate","fields":["lead_created_date","lead_id","opportunity_created_date","opportunity_id","snapshot_date"],"fieldTypes":{"lead_created_date":"date","lead_id":"string","opportunity_created_date":"date","opportunity_id":"string","snapshot_date":"date"},"datasets":["lead","opportunity"],"source":"CRM","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND (opportunity_created_date >= :period_start AND opportunity_created_date <= :period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT lead_id) FROM lead WHERE snapshot_date = :period_end AND (lead_created_date >= :period_start AND lead_created_date <= :period_end)), 0)) AS lead_to_opportunity_rate","description":"The percentage of leads that become qualified opportunities.","department":"Sales","staged":false,"placeholders":["lead_created_date@lead","lead_id@lead","opportunity_created_date@opportunity","opportunity_id@opportunity","snapshot_date@lead","snapshot_date@opportunity"]},{"metric":"Opportunity-to-Close Rate","formulaId":"opportunity_to_close_rate","fields":["close_date","opportunity_id","opportunity_stage","snapshot_date"],"fieldTypes":{"close_date":"date","opportunity_id":"string","opportunity_stage":"string","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT ((CAST((SELECT COUNT(opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND (opportunity_stage = 'closed_won' AND (close_date >= :period_start AND close_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= :period_start AND close_date <= :period_end))), 0))) AS opportunity_to_close_rate","description":"The percentage of qualified opportunities that close as won. Also called Close Rate.","department":"Sales","staged":false,"placeholders":["close_date@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},{"metric":"ACV (Annual Contract Value)","formulaId":"acv","fields":["acv","contract_event_type","event_date"],"fieldTypes":{"acv":"decimal","contract_event_type":"string","event_date":"date"},"datasets":["contract_event"],"source":"Billing","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT AVG(acv) FROM contract_event WHERE event_date >= :period_start AND event_date <= :period_end AND contract_event_type = 'new_contract') AS acv","description":"The annualized value of a contract, normalizing multi-year deals to a single year. Aggregated, it is the average ACV of new contracts signed in the period.","department":"Sales","staged":false,"placeholders":["acv@contract_event","contract_event_type@contract_event","event_date@contract_event"]},{"metric":"Average Deal Size","formulaId":"average_deal_size","fields":["close_date","opportunity_amount","opportunity_id","opportunity_stage","snapshot_date"],"fieldTypes":{"close_date":"date","opportunity_amount":"decimal","opportunity_id":"string","opportunity_stage":"string","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Daily sync","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(opportunity_amount), 0) FROM opportunity WHERE snapshot_date = :period_end AND (opportunity_stage = 'closed_won' AND (close_date >= :period_start AND close_date <= :period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND (opportunity_stage = 'closed_won' AND (close_date >= :period_start AND close_date <= :period_end))), 0)) AS average_deal_size","description":"The average total value of deals won in the period (total contract value, not annualized).","department":"Sales","staged":false,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},{"metric":"Sales Cycle Length","formulaId":"sales_cycle","fields":["close_date","opportunity_created_date","opportunity_stage","snapshot_date"],"fieldTypes":{"close_date":"date","opportunity_created_date":"date","opportunity_stage":"string","snapshot_date":"date"},"datasets":["opportunity"],"source":"CRM","frequency":"Per deal","grain":"Per event","exampleQuery":"SELECT (SELECT AVG((close_date - opportunity_created_date)) FROM opportunity WHERE snapshot_date = :period_end AND (opportunity_stage = 'closed_won' AND (close_date >= :period_start AND close_date <= :period_end))) AS sales_cycle","description":"The average time from opportunity creation to close.","department":"Sales","staged":false,"placeholders":["close_date@opportunity","opportunity_created_date@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},{"metric":"Quota Attainment","formulaId":"quota_attainment","fields":["closed_revenue","period_start","quota"],"fieldTypes":{"closed_revenue":"decimal","period_start":"date","quota":"decimal"},"datasets":["sales_rep"],"source":"CRM","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(closed_revenue), 0) FROM sales_rep WHERE period_start >= :period_start AND period_start <= :period_end) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(quota), 0) FROM sales_rep WHERE period_start >= :period_start AND period_start <= :period_end), 0)) AS quota_attainment","description":"The percentage of quota achieved by a rep or team.","department":"Sales","staged":false,"placeholders":["closed_revenue@sales_rep","period_start@sales_rep","quota@sales_rep"]},{"metric":"Revenue per Rep","formulaId":"revenue_per_rep","fields":["closed_revenue","period_start","quota","rep_id"],"fieldTypes":{"closed_revenue":"decimal","period_start":"date","quota":"decimal","rep_id":"string"},"datasets":["sales_rep"],"source":"CRM","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(closed_revenue), 0) FROM sales_rep WHERE period_start >= :period_start AND period_start <= :period_end) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT rep_id) FROM sales_rep WHERE period_start >= :period_start AND period_start <= :period_end AND quota > 0), 0)) AS revenue_per_rep","description":"New revenue closed in the period divided by the number of quota-carrying reps.","department":"Sales","staged":false,"placeholders":["closed_revenue@sales_rep","period_start@sales_rep","quota@sales_rep","rep_id@sales_rep"]},{"metric":"Ramp Time","formulaId":"ramp_time","fields":["hire_date","period_start","ramped_date"],"fieldTypes":{"hire_date":"date","period_start":"date","ramped_date":"date"},"datasets":["sales_rep"],"source":"HRIS","frequency":"Monthly","grain":"Monthly aggregate","exampleQuery":"SELECT (CAST((SELECT AVG((ramped_date - hire_date)) FROM sales_rep WHERE period_start >= :period_start AND period_start <= :period_end) AS DOUBLE PRECISION) / 30.4375) AS ramp_time","description":"Time for a new sales rep to reach full productivity (carrying full quota).","department":"Sales","staged":false,"placeholders":["hire_date@sales_rep","period_start@sales_rep","ramped_date@sales_rep"]},{"metric":"Ticket Volume","formulaId":"ticket_volume","fields":["created_at","ticket_id"],"fieldTypes":{"created_at":"timestamp","ticket_id":"string"},"datasets":["ticket"],"source":"Help Desk","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day')) AS ticket_volume","description":"Total number of support tickets received in a period.","department":"Support","staged":false,"placeholders":["created_at@ticket","ticket_id@ticket"]},{"metric":"Tickets per Customer","formulaId":"tickets_per_customer","fields":["created_at","customer_id","customer_status","snapshot_date","ticket_id"],"fieldTypes":{"created_at":"timestamp","customer_id":"string","customer_status":"string","snapshot_date":"date","ticket_id":"string"},"datasets":["customer","ticket"],"source":"Help Desk","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST(((SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day'))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM customer WHERE snapshot_date = :period_end AND customer_status = 'active'), 0)) AS tickets_per_customer","description":"Average tickets created per active customer.","department":"Support","staged":false,"placeholders":["created_at@ticket","customer_id@customer","customer_status@customer","snapshot_date@customer","ticket_id@ticket"]},{"metric":"Ticket Backlog","formulaId":"ticket_backlog","fields":["created_at","ticket_id","ticket_status"],"fieldTypes":{"created_at":"timestamp","ticket_id":"string","ticket_status":"string"},"datasets":["ticket"],"source":"Help Desk","frequency":"Daily","grain":"Open work items at period end","exampleQuery":"SELECT (SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at < (:period_end + INTERVAL '1 day') AND ticket_status IN ('open', 'pending')) AS ticket_backlog","description":"Number of tickets open or pending at the end of the period.","department":"Support","staged":false,"placeholders":["created_at@ticket","ticket_id@ticket","ticket_status@ticket"]},{"metric":"Ticket Distribution by Type","formulaId":"ticket_distribution_by_type","fields":["created_at","ticket_id","ticket_type"],"fieldTypes":{"created_at":"timestamp","ticket_id":"string","ticket_type":"string"},"datasets":["ticket"],"source":"Help Desk","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT _d.ticket_type AS ticket_type, (CAST((SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day') AND ticket_type = _d.ticket_type) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day'))), 0)) AS ticket_distribution_by_type\nFROM (SELECT 'how_to' AS ticket_type UNION ALL SELECT 'bug' AS ticket_type UNION ALL SELECT 'billing' AS ticket_type UNION ALL SELECT 'account' AS ticket_type UNION ALL SELECT 'feature_request' AS ticket_type UNION ALL SELECT 'other' AS ticket_type) _d","description":"Breakdown of tickets by category.","department":"Support","staged":false,"placeholders":["created_at@ticket","ticket_id@ticket","ticket_type@ticket"],"breakdown":{"field":"ticket_type"}},{"metric":"First Response Time (FRT)","formulaId":"frt","fields":["created_at","first_response_at"],"fieldTypes":{"created_at":"timestamp","first_response_at":"timestamp"},"datasets":["ticket"],"source":"Help Desk","frequency":"Per ticket","grain":"Per event","exampleQuery":"SELECT ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (EXTRACT(EPOCH FROM (first_response_at - created_at)) / 86400.0)) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day')) * 1440) AS frt","description":"Time from ticket creation to first human response.","department":"Support","staged":false,"placeholders":["created_at@ticket","first_response_at@ticket"]},{"metric":"First Response SLA Adherence","formulaId":"first_response_sla_adherence","fields":["created_at","first_response_at","first_response_due_at","ticket_id"],"fieldTypes":{"created_at":"timestamp","first_response_at":"timestamp","first_response_due_at":"timestamp","ticket_id":"string"},"datasets":["ticket"],"source":"Help Desk","frequency":"Per ticket","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day') AND first_response_at <= first_response_due_at) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day')), 0)) AS first_response_sla_adherence","description":"Percentage of tickets meeting FRT SLA target.","department":"Support","staged":false,"placeholders":["created_at@ticket","first_response_at@ticket","first_response_due_at@ticket","ticket_id@ticket"]},{"metric":"Resolution Time (Time to Resolution)","formulaId":"resolution_time_time_to_resolution","fields":["created_at","resolved_at"],"fieldTypes":{"created_at":"timestamp","resolved_at":"timestamp"},"datasets":["ticket"],"source":"Help Desk","frequency":"Per ticket","grain":"Per event","exampleQuery":"SELECT ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (EXTRACT(EPOCH FROM (resolved_at - created_at)) / 86400.0)) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day')) * 24) AS resolution_time_time_to_resolution","description":"Time from ticket creation to final resolution.","department":"Support","staged":false,"placeholders":["created_at@ticket","resolved_at@ticket"]},{"metric":"First Contact Resolution (FCR)","formulaId":"first_contact_resolution_fcr","fields":["created_at","resolved_first_contact","ticket_id"],"fieldTypes":{"created_at":"timestamp","resolved_first_contact":"boolean","ticket_id":"string"},"datasets":["ticket"],"source":"Help Desk","frequency":"Per ticket","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day') AND resolved_first_contact = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day')), 0)) AS first_contact_resolution_fcr","description":"Percentage of tickets resolved in a single interaction.","department":"Support","staged":false,"placeholders":["created_at@ticket","resolved_first_contact@ticket","ticket_id@ticket"]},{"metric":"Resolution SLA Adherence","formulaId":"resolution_sla_adherence","fields":["created_at","resolution_due_at","resolved_at","ticket_id"],"fieldTypes":{"created_at":"timestamp","resolution_due_at":"timestamp","resolved_at":"timestamp","ticket_id":"string"},"datasets":["ticket"],"source":"Help Desk","frequency":"Per ticket","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day') AND resolved_at <= resolution_due_at) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day')), 0)) AS resolution_sla_adherence","description":"Percentage of tickets resolved within SLA timeframe.","department":"Support","staged":false,"placeholders":["created_at@ticket","resolution_due_at@ticket","resolved_at@ticket","ticket_id@ticket"]},{"metric":"Reopen Rate","formulaId":"reopen_rate","fields":["created_at","reopened","ticket_id","ticket_status"],"fieldTypes":{"created_at":"timestamp","reopened":"boolean","ticket_id":"string","ticket_status":"string"},"datasets":["ticket"],"source":"Help Desk","frequency":"Per ticket","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day') AND reopened = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day') AND ticket_status = 'resolved'), 0)) AS reopen_rate","description":"Percentage of resolved tickets that are reopened.","department":"Support","staged":false,"placeholders":["created_at@ticket","reopened@ticket","ticket_id@ticket","ticket_status@ticket"]},{"metric":"Customer Satisfaction Score (CSAT)","formulaId":"csat","fields":["satisfaction_score","survey_date","survey_type"],"fieldTypes":{"satisfaction_score":"integer","survey_date":"date","survey_type":"string"},"datasets":["survey_response"],"source":"Survey Tool","frequency":"Per response","grain":"Per survey response","exampleQuery":"SELECT (CAST((SELECT COUNT(satisfaction_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND (survey_type = 'customer' AND satisfaction_score >= 4)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(satisfaction_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end AND survey_type = 'customer'), 0)) AS csat","description":"Customer rating of support interaction.","department":"Support","staged":false,"placeholders":["satisfaction_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},{"metric":"Customer Effort Score (CES)","formulaId":"customer_effort_score_ces","fields":["ces_score","survey_date"],"fieldTypes":{"ces_score":"integer","survey_date":"date"},"datasets":["survey_response"],"source":"Survey Tool","frequency":"Per response","grain":"Per survey response","exampleQuery":"SELECT (SELECT AVG(ces_score) FROM survey_response WHERE survey_date >= :period_start AND survey_date <= :period_end) AS customer_effort_score_ces","description":"How easy it was for the customer to get help.","department":"Support","staged":false,"placeholders":["ces_score@survey_response","survey_date@survey_response"]},{"metric":"Ticket Escalation Rate","formulaId":"ticket_escalation_rate","fields":["created_at","escalated","ticket_id"],"fieldTypes":{"created_at":"timestamp","escalated":"boolean","ticket_id":"string"},"datasets":["ticket"],"source":"Help Desk","frequency":"Per ticket","grain":"Per event","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day') AND escalated = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day')), 0)) AS ticket_escalation_rate","description":"Percentage of tickets escalated to higher tier or engineering.","department":"Support","staged":false,"placeholders":["created_at@ticket","escalated@ticket","ticket_id@ticket"]},{"metric":"Tickets per Agent","formulaId":"tickets_per_agent","fields":["agent_id","created_at","ticket_id"],"fieldTypes":{"agent_id":"string","created_at":"timestamp","ticket_id":"string"},"datasets":["ticket"],"source":"Help Desk","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day')) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT agent_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day')), 0)) AS tickets_per_agent","description":"Average tickets handled per support agent.","department":"Support","staged":false,"placeholders":["agent_id@ticket","created_at@ticket","ticket_id@ticket"]},{"metric":"Cost per Ticket","formulaId":"cost_per_ticket","fields":["cost","cost_function","created_at","event_date","ticket_id","ticket_status"],"fieldTypes":{"cost":"decimal","cost_function":"string","created_at":"timestamp","event_date":"date","ticket_id":"string","ticket_status":"string"},"datasets":["cost_event","ticket"],"source":"Finance / ERP","frequency":"Daily","grain":"Per event, aggregate monthly","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(cost), 0) FROM cost_event WHERE event_date >= :period_start AND event_date <= :period_end AND cost_function = 'support') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day') AND ticket_status = 'resolved'), 0)) AS cost_per_ticket","description":"Total support cost divided by tickets resolved.","department":"Support","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","created_at@ticket","event_date@cost_event","ticket_id@ticket","ticket_status@ticket"]},{"metric":"Self-Service Rate (Ticket Deflection)","formulaId":"self_service_rate","fields":["created_at","deflections","period_start","ticket_id"],"fieldTypes":{"created_at":"timestamp","deflections":"integer","period_start":"date","ticket_id":"string"},"datasets":["kb_article","ticket"],"source":"Help Desk","frequency":"Daily","grain":"Daily aggregate","exampleQuery":"SELECT (CAST((SELECT COALESCE(SUM(deflections), 0) FROM kb_article WHERE period_start >= :period_start AND period_start <= :period_end) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(deflections), 0) FROM kb_article WHERE period_start >= :period_start AND period_start <= :period_end) + ((SELECT COUNT(DISTINCT ticket_id) FROM ticket WHERE created_at >= :period_start AND created_at < (:period_end + INTERVAL '1 day')))), 0)) AS self_service_rate","description":"Percentage of support needs resolved through self-service.","department":"Support","staged":false,"placeholders":["created_at@ticket","deflections@kb_article","period_start@kb_article","ticket_id@ticket"]}],"ontology":{"entities":[{"id":"customer","label":"Customer","aliases":["Account","Organization"],"definition":"A distinct billing entity with one or more subscriptions. The \"who\" of your business relationship.","level":"billing"},{"id":"subscription","label":"Subscription","aliases":["Contract","Agreement"],"definition":"A billable agreement between a customer and your product, with defined terms, pricing, and status. The \"what and when\" of the relationship.","level":"billing"},{"id":"license","label":"License","aliases":["Entitlement","Access","Quota"],"definition":"A specific capability, quantity, or configuration granted by a subscription. The \"how much\" of the relationship.","level":"billing"},{"id":"lead","label":"Lead","aliases":["Prospect","Contact"],"definition":"A person or company that has shown interest but has not been qualified as a sales opportunity.","level":"acquisition"},{"id":"opportunity","label":"Opportunity","aliases":["Deal","Pipeline Item"],"definition":"A qualified sales prospect with an estimated value, stage, and expected close date.","level":"acquisition"},{"id":"user","label":"User","aliases":["Product User","End User"],"definition":"An individual who uses the product. In B2B, one Customer may have many Users. Usage metrics are measured at this level.","level":"engagement"},{"id":"ticket","label":"Ticket","aliases":["Support Case"],"definition":"A discrete support interaction initiated by a customer or user, tracked to resolution.","level":"support"},{"id":"employee","label":"Employee","aliases":["Team Member","Headcount"],"definition":"An internal team member. People metrics and efficiency ratios (revenue per employee) are measured at this level.","level":"internal"},{"id":"invoice","label":"Invoice","aliases":["Transaction","Billing Document"],"definition":"A billing document representing money owed or collected. Cash flow and collections metrics are measured at this level.","level":"financial"},{"id":"partner","label":"Partner","aliases":["Channel Partner","Reseller"],"definition":"An external organization that sources, influences, or resells deals. Partner metrics are measured at this level.","level":"channel"},{"id":"project","label":"Project","aliases":["Engagement","SOW"],"definition":"A professional services engagement with defined scope, timeline, and deliverables.","level":"services"},{"id":"plan","label":"Plan","aliases":["Tier","Pricing Plan","Package"],"definition":"A pricing tier offered to customers (e.g. Starter, Pro, Enterprise). Each plan defines a price point and a set of included products and quotas.","level":"billing"},{"id":"product","label":"Product","aliases":["Module","SKU","Feature Bundle"],"definition":"A distinct purchasable unit within the company's offering (e.g. Analytics Module, Automation Module). A subscription may include multiple products.","level":"billing"},{"id":"campaign","label":"Campaign","aliases":["Marketing Campaign","Initiative"],"definition":"A marketing initiative with defined objectives, channels, budget and dates. Campaigns source leads and influence opportunities.","level":"acquisition"},{"id":"contact","label":"Contact","aliases":["Stakeholder","Decision Maker","Champion"],"definition":"A named individual at a customer account involved in the buying or expansion process. Distinct from User (product user) and Lead (pre-qualification).","level":"acquisition"},{"id":"incident","label":"Incident","aliases":["Outage","SEV"],"definition":"An unplanned interruption or degradation of service, tracked from start to resolution. Reliability metrics (MTTR, incident rate) are measured at this level.","level":"engineering"},{"id":"deployment","label":"Deployment","aliases":["Deploy","Production Change"],"definition":"A release of code to production. DORA delivery metrics (deployment frequency, lead time for changes, change failure rate) are measured at this level.","level":"engineering"},{"id":"release","label":"Release","aliases":["Version"],"definition":"A versioned bundle of features shipped to customers. Delivery predictability metrics are measured at this level.","level":"engineering"},{"id":"issue","label":"Issue","aliases":["Bug","Defect","Feature Request"],"definition":"A tracked defect or request in the engineering backlog, with its source and the environment it was found in. Quality metrics (escaped defects, bug rate) are measured at this level.","level":"engineering"},{"id":"vulnerability","label":"Vulnerability","aliases":["CVE","Security Finding"],"definition":"A security weakness found in the product or its infrastructure, tracked from discovery to patch. Security remediation metrics are measured at this level.","level":"engineering"},{"id":"feature","label":"Feature","aliases":["Capability"],"definition":"A unit of product functionality with planned and actual ship dates and a first use by customers. Adoption and roadmap delivery metrics are measured at this level.","level":"product"},{"id":"requisition","label":"Requisition","aliases":["Job Opening","Req"],"definition":"An approved request to hire for a role, open until filled or closed. Recruiting metrics (time to fill, offer acceptance rate) are measured at this level.","level":"internal"},{"id":"project_milestone","label":"Project Milestone","aliases":["Milestone"],"definition":"A dated checkpoint inside a professional services project, with a planned and an actual date. Delivery predictability is measured at this level.","level":"services"},{"id":"deliverable","label":"Deliverable","aliases":["Work Product"],"definition":"An artefact a professional services project hands to the customer, which the customer accepts or sends back for rework. Delivery quality is measured at this level.","level":"services"},{"id":"quote","label":"Quote","aliases":["Proposal","Pricing Quote"],"definition":"A priced offer sent to a prospect or customer before an order. Quote turnaround and discounting are measured at this level.","level":"financial"},{"id":"order","label":"Order","aliases":["Sales Order"],"definition":"An accepted quote in fulfilment, from receipt to completion. Order accuracy and fulfilment time are measured at this level.","level":"financial"},{"id":"kb_article","label":"Knowledge Article","aliases":["Help Article","KB Article"],"definition":"A self-service help article. Ticket deflection and self-service rates are measured at this level.","level":"support"},{"id":"deal_registration","label":"Deal Registration","aliases":["Partner Registration"],"definition":"A partner's claim on an opportunity it sourced, moving from qualification to close. Partner pipeline and conflict metrics are measured at this level.","level":"channel"}],"fields":[{"id":"accounts_receivable","type":"decimal","datasets":["balance_sheet"],"sources":["finance","billing"],"description":"Accounts receivable balance at period end","metricCount":2},{"id":"acknowledged_at","type":"timestamp","datasets":["incident"],"sources":["incident_management"],"description":"Acknowledgement time","metricCount":1},{"id":"acquisition_date","type":"date","datasets":["customer"],"sources":["billing","crm"],"description":"Date the customer first became paying","metricCount":1},{"id":"activation_date","type":"date","datasets":["customer","user"],"sources":["product_analytics","cs_platform"],"description":"Date the activation milestone was reached","metricCount":3},{"id":"activity_date","type":"date","datasets":["partner_activity"],"sources":["partner_management"],"description":"Activity date","metricCount":1},{"id":"activity_id","type":"string","datasets":["partner_activity"],"sources":["partner_management"],"description":"Partner activity identifier","metricCount":1},{"id":"actual_date","type":"date","datasets":["feature","project_milestone"],"sources":["cicd","psa"],"description":"Actual delivery date","metricCount":2},{"id":"actual_revenue","type":"decimal","datasets":["forecast"],"sources":["crm","finance"],"description":"Revenue actually closed in the period","metricCount":1},{"id":"acv","type":"decimal","datasets":["contract_event"],"sources":["billing","crm"],"description":"Annual contract value, recurring only","metricCount":1},{"id":"ad_spend","type":"decimal","datasets":["campaign"],"sources":["ad_platforms"],"description":"Media spend in the period","metricCount":2},{"id":"advanced_to_next_stage","type":"boolean","datasets":["opportunity"],"sources":["crm"],"description":"Advanced one stage in the period","metricCount":1},{"id":"agent_id","type":"string","datasets":["ticket"],"sources":["help_desk"],"description":"Handling agent","metricCount":1},{"id":"amendment_type","type":"enum","datasets":["amendment_event"],"sources":["billing"],"values":["upgrade","downgrade","add_on","cross_sell","seat_change","pricing_change"],"description":"Mid-term change kind (CEL, extended with cross_sell)","metricCount":2},{"id":"article_id","type":"string","datasets":["kb_article"],"sources":["knowledge_base"],"description":"Knowledge base article identifier","metricCount":0},{"id":"attendees","type":"integer","datasets":["onboarding_session"],"sources":["cs_platform"],"description":"Customer attendees at the session","metricCount":1},{"id":"auto_renewed","type":"boolean","datasets":["subscription"],"sources":["billing"],"description":"Renewal happened without manual intervention","metricCount":1},{"id":"available_hours","type":"decimal","datasets":["consultant"],"sources":["psa"],"description":"Capacity hours in the period","metricCount":4},{"id":"bad_debt_expense","type":"decimal","datasets":["financials"],"sources":["finance"],"description":"Bad debt written off in the period","metricCount":1},{"id":"billed_amount","type":"decimal","datasets":["revenue_schedule"],"sources":["billing","finance"],"description":"Amount billed for the subscription in the period","metricCount":3},{"id":"billed_hours","type":"decimal","datasets":["time_entry"],"sources":["psa"],"description":"Hours billed to the customer","metricCount":2},{"id":"billed_revenue","type":"decimal","datasets":["time_entry"],"sources":["psa"],"description":"Revenue billed for the entry","metricCount":1},{"id":"billing_trigger_date","type":"date","datasets":["invoice"],"sources":["billing"],"description":"Date the billing event occurred","metricCount":1},{"id":"campaign_id","type":"string","datasets":["campaign"],"sources":["ad_platforms","marketing_automation"],"description":"Campaign identifier","metricCount":0},{"id":"capital_expenditures","type":"decimal","datasets":["financials"],"sources":["finance"],"description":"Capital expenditure for the period","metricCount":2},{"id":"cash_balance","type":"decimal","datasets":["balance_sheet"],"sources":["finance"],"description":"Cash and equivalents at period end","metricCount":3},{"id":"certification_status","type":"enum","datasets":["partner"],"sources":["partner_management","lms"],"values":["none","in_progress","certified","expired"],"description":"Certification state","metricCount":1},{"id":"ces_score","type":"integer","datasets":["survey_response"],"sources":["survey_tool","help_desk"],"description":"1 to 7 effort score","metricCount":1},{"id":"change_nature","type":"enum","datasets":["revenue_event","amendment_event"],"sources":["billing"],"values":["permanent","temporary","scheduled_reversal"],"description":"permanent, temporary or scheduled_reversal (Adjusted NRR/GRR)","metricCount":2},{"id":"channel","type":"enum","datasets":["campaign","opportunity"],"sources":["ad_platforms","crm","marketing_automation"],"values":["paid_ads","organic_search","email","events","content","referral","marketplace","direct","other"],"description":"Marketing channel: the channel a campaign runs in, and the first-touch channel of an opportunity","metricCount":5},{"id":"close_date","type":"date","datasets":["opportunity","deal_registration","project"],"sources":["crm","partner_management","psa"],"description":"Actual or expected close date of the opportunity; on a project or registration, the close date of the won deal","metricCount":27},{"id":"close_date_valid","type":"boolean","datasets":["opportunity"],"sources":["crm"],"description":"Close date is in the future or matches the actual close","metricCount":1},{"id":"closed_revenue","type":"decimal","datasets":["sales_rep"],"sources":["crm"],"description":"Closed-won value credited to the rep in the period","metricCount":2},{"id":"committed_at","type":"timestamp","datasets":["deployment"],"sources":["cicd"],"description":"First commit time of the change","metricCount":1},{"id":"composite_score","type":"decimal","datasets":["customer"],"sources":["cs_platform"],"description":"Health score on a 0 to 100 scale","metricCount":3},{"id":"consultant_id","type":"string","datasets":["consultant","time_entry","project"],"sources":["psa"],"description":"Consultant identifier","metricCount":3},{"id":"contract_end","type":"date","datasets":["contract_event","subscription"],"sources":["billing","crm"],"description":"Contract end date","metricCount":6},{"id":"contract_event_type","type":"enum","datasets":["contract_event"],"sources":["billing"],"values":["new_contract","renewal","amendment","cancellation"],"description":"Contract milestone (CEL Contract_Event.event_type)","metricCount":2},{"id":"contract_start","type":"date","datasets":["contract_event","subscription","onboarding","onboarding_milestone"],"sources":["billing","crm","cs_platform"],"description":"Contract start date","metricCount":3},{"id":"core_features_adopted","type":"boolean","datasets":["user"],"sources":["product_analytics","derived"],"description":"User has adopted the defined core feature set","metricCount":1},{"id":"cost","type":"decimal","datasets":["cost_event"],"sources":["finance"],"description":"Cost amount (CEL Cost_Event.amount)","metricCount":22},{"id":"cost_centre","type":"enum","datasets":["cost_event"],"sources":["finance"],"values":["marketing","sales","customer_success","support","engineering","product","finance","people","services","partnerships","general"],"description":"Department or team that incurred the cost","metricCount":5},{"id":"cost_function","type":"enum","datasets":["cost_event"],"sources":["finance"],"values":["gtm","implementation","onboarding","infrastructure","support","success_engineering","account_management","research_development","general_administrative","services_delivery","recruiting","partner_program","partner_commission"],"description":"Purpose of cost (ATL cost function, extended to all cost events)","metricCount":22},{"id":"cost_type","type":"enum","datasets":["cost_event"],"sources":["finance"],"values":["personnel","software","services","infrastructure","other"],"description":"Nature of cost (CEL)","metricCount":0},{"id":"created_at","type":"timestamp","datasets":["ticket","issue"],"sources":["help_desk","product_analytics"],"description":"Creation time","metricCount":17},{"id":"credit_memo_count","type":"integer","datasets":["invoice"],"sources":["billing"],"description":"Credit memos issued against the invoice","metricCount":1},{"id":"criteria_met","type":"boolean","datasets":["customer"],"sources":["product_analytics"],"description":"Product-qualified criteria met","metricCount":1},{"id":"csm_id","type":"string","datasets":["customer"],"sources":["cs_platform"],"description":"Assigned customer success manager","metricCount":2},{"id":"currency","type":"string","datasets":["revenue_event","cost_event","contract_event","invoice","usage_record","credit_event"],"sources":["billing","finance"],"description":"ISO 4217 currency code","metricCount":0},{"id":"customer_id","type":"string","datasets":["revenue_event","cost_event","contract_event","amendment_event","lifecycle_event","customer","subscription","opportunity","user","ticket","project","invoice","onboarding","survey_response","product_event","revenue_schedule","contact","trial","usage_record","credit_event"],"sources":["billing","crm","cs_platform","product_analytics","help_desk","psa","survey_tool"],"description":"Customer (account) identifier. Primary business noun; CEL name","metricCount":30},{"id":"customer_status","type":"enum","datasets":["customer"],"sources":["billing","crm"],"values":["trial","active","churned","dormant"],"description":"Customer lifecycle status; active means at least one active subscription","metricCount":20},{"id":"deflections","type":"integer","datasets":["kb_article"],"sources":["knowledge_base"],"description":"Sessions resolved without a ticket","metricCount":1},{"id":"deliverable_id","type":"string","datasets":["deliverable"],"sources":["psa"],"description":"Deliverable identifier","metricCount":1},{"id":"department","type":"string","datasets":["employee"],"sources":["hris"],"dimension":true,"description":"Department","metricCount":3},{"id":"deploy_date","type":"timestamp","datasets":["deployment"],"sources":["cicd"],"description":"Deployment time","metricCount":3},{"id":"deployment_id","type":"string","datasets":["deployment"],"sources":["cicd"],"description":"Deployment identifier","metricCount":2},{"id":"detected_at","type":"timestamp","datasets":["incident"],"sources":["incident_management","monitoring"],"description":"Detection time","metricCount":2},{"id":"discovered_at","type":"timestamp","datasets":["vulnerability"],"sources":["security_scanner"],"description":"Discovery time","metricCount":1},{"id":"downtime_minutes","type":"integer","datasets":["service_metrics"],"sources":["monitoring"],"description":"Minutes unavailable in the period","metricCount":1},{"id":"ebitda","type":"decimal","datasets":["financials"],"sources":["finance"],"description":"EBITDA for the period","metricCount":2},{"id":"employee_id","type":"string","datasets":["survey_response","employee"],"sources":["hris","survey_tool"],"description":"Employee identifier","metricCount":13},{"id":"employee_status","type":"enum","datasets":["employee"],"sources":["hris"],"values":["active","on_leave","terminated"],"description":"Employment status","metricCount":10},{"id":"engagement_score","type":"decimal","datasets":["survey_response"],"sources":["survey_tool"],"description":"Engagement survey score","metricCount":1},{"id":"entry_date","type":"date","datasets":["time_entry"],"sources":["psa"],"description":"Time entry date","metricCount":4},{"id":"entry_id","type":"string","datasets":["time_entry"],"sources":["psa"],"description":"Time entry identifier","metricCount":0},{"id":"error_count","type":"integer","datasets":["service_metrics"],"sources":["monitoring"],"description":"Failed requests","metricCount":1},{"id":"escalated","type":"boolean","datasets":["ticket","project"],"sources":["help_desk","psa"],"description":"Escalated beyond first line","metricCount":2},{"id":"event_date","type":"date","datasets":["revenue_event","cost_event","contract_event","amendment_event","lifecycle_event","product_event","credit_event"],"sources":["billing","finance","crm","product_analytics"],"description":"Date the event occurred","metricCount":70},{"id":"event_id","type":"string","datasets":["revenue_event","cost_event","contract_event","amendment_event","lifecycle_event","product_event","credit_event"],"sources":["billing","finance","crm","product_analytics"],"description":"Unique, immutable event identifier","metricCount":1},{"id":"event_type","type":"enum","datasets":["revenue_event"],"sources":["billing"],"values":["new","expansion","contraction","churn","reactivation","renewal"],"description":"Revenue movement classifier (CEL Revenue_Event.event_type)","metricCount":21},{"id":"expansion_classification","type":"enum","datasets":["revenue_event","amendment_event"],"sources":["billing"],"values":["same_product","new_module","new_buying_centre","pricing_adjustment","recontracting","usage_realisation"],"description":"ATL expansion tag; required for NRR-M and ARR-M","metricCount":2},{"id":"feature_created_date","type":"date","datasets":["feature"],"sources":["product_analytics","cicd"],"description":"Date the feature was first specified","metricCount":1},{"id":"feature_id","type":"string","datasets":["product_event","feature"],"sources":["product_analytics"],"description":"Feature identifier","metricCount":4},{"id":"filled_date","type":"date","datasets":["requisition"],"sources":["ats"],"description":"Date the requisition was filled","metricCount":1},{"id":"first_response_at","type":"timestamp","datasets":["ticket"],"sources":["help_desk"],"description":"First agent response time","metricCount":2},{"id":"first_response_due_at","type":"timestamp","datasets":["ticket"],"sources":["help_desk"],"description":"First response SLA deadline","metricCount":1},{"id":"first_use_date","type":"date","datasets":["user","feature"],"sources":["product_analytics"],"description":"First use of the feature","metricCount":1},{"id":"forecast_category","type":"enum","datasets":["opportunity"],"sources":["crm"],"values":["pipeline","best_case","commit","closed"],"description":"Forecast category","metricCount":1},{"id":"forecast_renewal_amount","type":"decimal","datasets":["subscription"],"sources":["crm","finance"],"description":"Forecast renewal value","metricCount":1},{"id":"forecasted_revenue","type":"decimal","datasets":["forecast"],"sources":["crm","finance"],"description":"Revenue forecast made before the period","metricCount":1},{"id":"has_error","type":"boolean","datasets":["order"],"sources":["billing"],"description":"Order needed correction","metricCount":1},{"id":"contact_id","type":"string","datasets":["contact"],"sources":["crm","cs_platform"],"description":"Contact identifier: a named person at a customer account","metricCount":1},{"id":"contact_role","type":"enum","datasets":["contact"],"sources":["crm","cs_platform"],"values":["executive_sponsor","decision_maker","champion","day_to_day","procurement","other"],"description":"The contact's role in the account relationship","metricCount":1},{"id":"contact_engaged","type":"boolean","datasets":["contact"],"sources":["crm","cs_platform"],"description":"The contact had recorded activity (meeting, email, call, QBR) in the trailing 90 days","metricCount":2},{"id":"plan_id","type":"string","datasets":["subscription","plan"],"sources":["billing"],"description":"Pricing plan identifier; the plan a subscription is priced by","metricCount":1},{"id":"plan_name","type":"string","datasets":["plan"],"sources":["billing"],"dimension":true,"description":"Plan display name (Starter, Pro, Enterprise)","metricCount":1},{"id":"billing_period","type":"enum","datasets":["plan"],"sources":["billing"],"values":["monthly","annual","multi_year"],"dimension":true,"description":"How often the plan bills","metricCount":0},{"id":"product_id","type":"string","datasets":["license","product"],"sources":["billing"],"description":"Product identifier; the purchasable unit a license grants access to","metricCount":1},{"id":"product_name","type":"string","datasets":["product"],"sources":["billing"],"dimension":true,"description":"Product display name","metricCount":1},{"id":"product_line","type":"string","datasets":["product"],"sources":["billing"],"dimension":true,"description":"Product family the product belongs to","metricCount":0},{"id":"license_id","type":"string","datasets":["license"],"sources":["billing"],"description":"License identifier: one entitlement a subscription grants","metricCount":0},{"id":"license_status","type":"enum","datasets":["license"],"sources":["billing"],"values":["active","suspended","expired"],"description":"Whether the license currently grants access","metricCount":1},{"id":"seats_purchased","type":"integer","datasets":["license"],"sources":["billing"],"description":"Seats the license entitles the customer to","metricCount":1},{"id":"seats_assigned","type":"integer","datasets":["license"],"sources":["billing","product_analytics"],"description":"Seats assigned to a named user","metricCount":1},{"id":"application_date","type":"date","datasets":["employee"],"sources":["ats"],"description":"Date the hired employee applied; the start of Time to Hire","metricCount":1},{"id":"hire_date","type":"date","datasets":["sales_rep","employee","requisition"],"sources":["hris","ats"],"description":"Employment start date","metricCount":8},{"id":"hire_source","type":"enum","datasets":["employee"],"sources":["ats","hris"],"values":["referral","inbound","sourced","agency","internal","campus","other"],"description":"Recruiting channel the employee was hired through","metricCount":2},{"id":"hours","type":"decimal","datasets":["time_entry","onboarding"],"sources":["psa","cs_platform"],"description":"Hours logged","metricCount":3},{"id":"hours_actual","type":"decimal","datasets":["project"],"sources":["psa"],"description":"Actual hours","metricCount":1},{"id":"hours_budgeted","type":"decimal","datasets":["project"],"sources":["psa"],"description":"Budgeted hours","metricCount":2},{"id":"incident_id","type":"string","datasets":["incident","deployment"],"sources":["incident_management","cicd"],"description":"Incident identifier","metricCount":3},{"id":"incident_type","type":"enum","datasets":["incident"],"sources":["incident_management"],"values":["availability","performance","security","data"],"description":"Incident category","metricCount":3},{"id":"includes_services","type":"boolean","datasets":["opportunity"],"sources":["crm"],"description":"Deal includes professional services","metricCount":1},{"id":"invoice_amount","type":"decimal","datasets":["invoice"],"sources":["billing"],"description":"Invoiced amount","metricCount":4},{"id":"recurring_amount","type":"decimal","datasets":["invoice"],"sources":["billing"],"description":"The recurring part of invoice_amount, as billed for the service period: subscription charges only, one-off charges, usage billed beyond a commitment, credits and tax excluded. MRR is this over the months the service period covers","metricCount":0},{"id":"invoice_corrected","type":"boolean","datasets":["invoice"],"sources":["billing"],"description":"Corrected after issue","metricCount":1},{"id":"invoice_date","type":"date","datasets":["invoice"],"sources":["billing"],"description":"Invoice date","metricCount":9},{"id":"invoice_disputed","type":"boolean","datasets":["invoice"],"sources":["billing"],"description":"Disputed by the customer","metricCount":1},{"id":"invoice_id","type":"string","datasets":["invoice"],"sources":["billing"],"description":"Invoice identifier","metricCount":3},{"id":"service_period_start","type":"date","datasets":["invoice"],"sources":["billing"],"description":"First day of the service the invoice's recurring charge pays for; null on an invoice with no recurring charge. The invoice derivation in cel.md reads it","metricCount":0},{"id":"service_period_end","type":"date","datasets":["invoice"],"sources":["billing"],"description":"Last day of the service the invoice's recurring charge pays for, inclusive","metricCount":0},{"id":"is_competitor","type":"boolean","datasets":["brand_mention"],"sources":["web_analytics"],"description":"Mention is of a competitor","metricCount":1},{"id":"is_high_performer","type":"boolean","datasets":["employee"],"sources":["hris"],"description":"Rated high performer","metricCount":1},{"id":"issue_environment","type":"enum","datasets":["issue"],"sources":["cicd"],"values":["production","pre_production"],"description":"Where the issue was found","metricCount":1},{"id":"issue_id","type":"string","datasets":["issue"],"sources":["product_analytics","help_desk","cicd"],"description":"Issue identifier","metricCount":3},{"id":"issue_source","type":"enum","datasets":["issue"],"sources":["product_analytics","help_desk"],"values":["user_report","internal","monitoring"],"description":"Who reported the issue","metricCount":1},{"id":"issue_type","type":"enum","datasets":["issue"],"sources":["product_analytics","cicd"],"values":["bug","feature_request","question","incident"],"description":"Issue kind","metricCount":3},{"id":"job_level","type":"enum","datasets":["employee"],"sources":["hris"],"values":["individual_contributor","manager","director","vp","c_level"],"description":"Seniority level","metricCount":1},{"id":"last_active_date","type":"date","datasets":["customer","user"],"sources":["product_analytics"],"description":"Most recent qualifying activity","metricCount":1},{"id":"lead_created_date","type":"date","datasets":["lead"],"sources":["crm","marketing_automation"],"description":"Date the lead was created","metricCount":5},{"id":"lead_id","type":"string","datasets":["opportunity","lead","survey_response"],"sources":["crm","marketing_automation","survey_tool"],"description":"Lead identifier","metricCount":11},{"id":"lead_source","type":"string","datasets":["lead"],"sources":["marketing_automation"],"dimension":true,"description":"Lead source","metricCount":4},{"id":"lead_stage","type":"enum","datasets":["lead"],"sources":["crm","marketing_automation"],"values":["lead","mql","sql","opportunity","disqualified"],"dimension":true,"description":"Lead funnel stage","metricCount":1},{"id":"lifecycle_attribution","type":"enum","datasets":["revenue_event","cost_event","amendment_event"],"sources":["billing","finance"],"values":["acquisition","activation","retention","expansion","reactivation","servicing"],"description":"ATL lifecycle tag","metricCount":0},{"id":"list_price","type":"decimal","datasets":["quote"],"sources":["crm","billing"],"description":"List price of the quote","metricCount":1},{"id":"market_midpoint","type":"decimal","datasets":["employee"],"sources":["hris"],"description":"Market midpoint for the role","metricCount":1},{"id":"marketing_influenced","type":"boolean","datasets":["opportunity"],"sources":["crm","marketing_automation"],"description":"A marketing touch exists on the opportunity","metricCount":1},{"id":"marketing_source","type":"enum","datasets":["opportunity"],"sources":["crm","marketing_automation"],"values":["marketing","sales","partner","other"],"description":"Team that sourced the opportunity","metricCount":2},{"id":"mention_count","type":"integer","datasets":["brand_mention"],"sources":["web_analytics"],"description":"Brand mentions in the period","metricCount":1},{"id":"mention_source","type":"string","datasets":["brand_mention"],"sources":["web_analytics"],"description":"Mention source","metricCount":0},{"id":"milestone_date","type":"date","datasets":["onboarding_milestone"],"sources":["cs_platform"],"description":"Date the milestone was reached","metricCount":4},{"id":"milestone_due_date","type":"date","datasets":["onboarding_milestone"],"sources":["cs_platform"],"description":"Date the milestone is due under the onboarding plan. A planned milestone carries it before milestone_date is set","metricCount":1},{"id":"mql_date","type":"date","datasets":["lead"],"sources":["marketing_automation"],"description":"Date the lead became an MQL","metricCount":5},{"id":"mrr","type":"decimal","datasets":["subscription"],"sources":["billing"],"description":"Monthly recurring revenue of the subscription","metricCount":17},{"id":"mrr_change","type":"decimal","datasets":["revenue_event","amendment_event"],"sources":["billing"],"description":"Change in MRR; negative for contraction and churn","metricCount":15},{"id":"mrr_end","type":"decimal","datasets":["subscription"],"sources":["billing","derived"],"description":"MRR at period end (cohort form)","metricCount":1},{"id":"mrr_start","type":"decimal","datasets":["subscription"],"sources":["billing","derived"],"description":"MRR at period start (cohort form)","metricCount":2},{"id":"net_income","type":"decimal","datasets":["financials"],"sources":["finance"],"description":"Net income for the period","metricCount":1},{"id":"new_mrr","type":"decimal","datasets":["revenue_event"],"sources":["billing"],"description":"MRR after the event","metricCount":0},{"id":"new_state","type":"string","datasets":["lifecycle_event"],"sources":["cs_platform"],"description":"New lifecycle state","metricCount":0},{"id":"nps_score","type":"integer","datasets":["survey_response"],"sources":["survey_tool"],"description":"0 to 10 recommend score","metricCount":6},{"id":"offer_status","type":"enum","datasets":["requisition"],"sources":["ats"],"values":["extended","accepted","declined","withdrawn"],"description":"Status of the latest offer","metricCount":1},{"id":"onboarding_completion_date","type":"date","datasets":["onboarding","customer"],"sources":["cs_platform"],"description":"Onboarding completion; null while open","metricCount":8},{"id":"onboarding_id","type":"string","datasets":["onboarding","onboarding_milestone","onboarding_session"],"sources":["cs_platform"],"description":"Onboarding engagement identifier","metricCount":6},{"id":"onboarding_milestone","type":"enum","datasets":["onboarding_milestone"],"sources":["cs_platform"],"values":["kickoff","first_value","go_live","full_adoption"],"description":"Milestone reached","metricCount":3},{"id":"onboarding_session_date","type":"date","datasets":["onboarding_session"],"sources":["cs_platform"],"description":"Scheduled session date","metricCount":1},{"id":"onboarding_start_date","type":"date","datasets":["onboarding"],"sources":["cs_platform"],"description":"Onboarding kickoff date","metricCount":2},{"id":"operating_cash_flow","type":"decimal","datasets":["financials"],"sources":["finance"],"description":"Operating cash flow for the period","metricCount":2},{"id":"opportunity_amount","type":"decimal","datasets":["opportunity"],"sources":["crm"],"description":"Opportunity value (recurring)","metricCount":22},{"id":"opportunity_created_date","type":"date","datasets":["opportunity"],"sources":["crm"],"description":"Date the opportunity was created","metricCount":4},{"id":"opportunity_id","type":"string","datasets":["opportunity","deal_registration"],"sources":["crm"],"description":"Opportunity (deal) identifier","metricCount":15},{"id":"opportunity_stage","type":"enum","datasets":["opportunity","deal_registration"],"sources":["crm","partner_management"],"values":["qualification","discovery","proposal","negotiation","closed_won","closed_lost"],"description":"Sales stage of an opportunity, or of a partner's registered deal","metricCount":31},{"id":"order_completed_at","type":"timestamp","datasets":["order"],"sources":["billing"],"description":"Order processed","metricCount":3},{"id":"order_id","type":"string","datasets":["order"],"sources":["billing"],"description":"Order identifier","metricCount":2},{"id":"order_received_at","type":"timestamp","datasets":["order"],"sources":["billing"],"description":"Order received","metricCount":1},{"id":"outstanding_amount","type":"decimal","datasets":["invoice"],"sources":["billing"],"description":"Unpaid balance as of snapshot_date","metricCount":3},{"id":"partner_activity_type","type":"enum","datasets":["partner_activity"],"sources":["partner_management"],"values":["webinar","event","content","campaign"],"description":"Joint marketing activity kind","metricCount":1},{"id":"partner_churn_date","type":"date","datasets":["partner"],"sources":["partner_management"],"description":"Date the partner left the programme","metricCount":2},{"id":"partner_id","type":"string","datasets":["cost_event","partner","opportunity","partner_activity","deal_registration","survey_response"],"sources":["partner_management","crm","finance","survey_tool"],"description":"Partner identifier","metricCount":11},{"id":"partner_recruited_date","type":"date","datasets":["partner"],"sources":["partner_management"],"description":"Date the partner signed","metricCount":2},{"id":"partner_sourced","type":"boolean","datasets":["opportunity"],"sources":["crm","partner_management"],"description":"Sourced by a partner","metricCount":6},{"id":"partner_status","type":"enum","datasets":["partner"],"sources":["partner_management"],"values":["recruited","active","churned"],"description":"Partner lifecycle status","metricCount":6},{"id":"partner_tier","type":"enum","datasets":["partner"],"sources":["partner_management"],"values":["registered","silver","gold","platinum"],"description":"Partner programme tier","metricCount":2},{"id":"patched_at","type":"timestamp","datasets":["vulnerability"],"sources":["security_scanner"],"description":"Patch time","metricCount":1},{"id":"payment_date","type":"date","datasets":["invoice"],"sources":["billing"],"description":"Date paid in full; null while unpaid","metricCount":1},{"id":"payment_method","type":"enum","datasets":["invoice"],"sources":["billing"],"values":["credit_card","ach","wire","check","other"],"description":"Payment method","metricCount":1},{"id":"payment_status","type":"enum","datasets":["invoice"],"sources":["billing"],"values":["paid","unpaid","partial","written_off"],"dimension":true,"description":"Payment status","metricCount":3},{"id":"performance_rating","type":"decimal","datasets":["employee"],"sources":["hris"],"description":"Most recent performance rating","metricCount":1},{"id":"period_start","type":"date","datasets":["financials","forecast","campaign","sales_rep","consultant","kb_article","service_metrics","revenue_schedule","web_traffic","brand_mention","usage_record"],"sources":["derived"],"description":"Start of the period the row describes","metricCount":51},{"id":"period_end","type":"date","datasets":["usage_record"],"sources":["billing"],"description":"Last day of the period the row describes, inclusive","metricCount":0},{"id":"committed_amount","type":"decimal","datasets":["usage_record"],"sources":["billing"],"description":"The recurring charge the customer committed to for the period, at the price it is billed at. Already in the subscription's MRR","metricCount":0},{"id":"usage_amount","type":"decimal","datasets":["usage_record"],"sources":["billing"],"description":"The charge for the usage recorded in the period at the contract's rates, before the commitment is applied. The part above committed_amount is billed as overage and is the usage realised beyond the commitment","metricCount":0},{"id":"planned_date","type":"date","datasets":["feature","project_milestone"],"sources":["cicd","psa"],"description":"Planned delivery date","metricCount":2},{"id":"populated_field_count","type":"integer","datasets":["crm_record"],"sources":["crm"],"description":"Required fields populated","metricCount":1},{"id":"prior_mrr","type":"decimal","datasets":["revenue_event"],"sources":["billing"],"description":"MRR before the event","metricCount":0},{"id":"prior_state","type":"string","datasets":["lifecycle_event"],"sources":["cs_platform"],"description":"Previous lifecycle state","metricCount":0},{"id":"product_event_type","type":"enum","datasets":["product_event"],"sources":["product_analytics"],"values":["qualifying","action","error","reactivation","login"],"description":"Kind of product event; qualifying events define active use","metricCount":14},{"id":"project_completion_date","type":"date","datasets":["project"],"sources":["psa"],"description":"Project completion; null while open","metricCount":7},{"id":"project_cost","type":"decimal","datasets":["project"],"sources":["psa","finance"],"description":"Delivery cost of the project","metricCount":1},{"id":"project_id","type":"string","datasets":["cost_event","project","project_milestone","time_entry","deliverable","survey_response"],"sources":["psa","finance","survey_tool"],"description":"Services project identifier; null on costs not attributable to a project","metricCount":7},{"id":"project_milestone_id","type":"string","datasets":["project_milestone"],"sources":["psa"],"description":"Project milestone identifier","metricCount":1},{"id":"project_revenue","type":"decimal","datasets":["project"],"sources":["psa","finance"],"description":"Revenue recognised on the project","metricCount":1},{"id":"project_start_date","type":"date","datasets":["project"],"sources":["psa"],"description":"Project start","metricCount":3},{"id":"qbr_completed","type":"boolean","datasets":["customer"],"sources":["cs_platform"],"description":"A QBR was held in the period","metricCount":1},{"id":"qbr_due","type":"boolean","datasets":["customer"],"sources":["cs_platform"],"description":"A QBR was due in the period","metricCount":1},{"id":"quota","type":"decimal","datasets":["sales_rep"],"sources":["crm"],"description":"Quota for the period","metricCount":3},{"id":"quote_id","type":"string","datasets":["quote","order"],"sources":["crm","billing"],"description":"Quote identifier","metricCount":3},{"id":"quote_requested_at","type":"timestamp","datasets":["quote"],"sources":["crm"],"description":"Quote requested","metricCount":1},{"id":"quote_sent_at","type":"timestamp","datasets":["quote"],"sources":["crm"],"description":"Quote sent","metricCount":5},{"id":"quoted_price","type":"decimal","datasets":["quote"],"sources":["crm","billing"],"description":"Net price of the quote","metricCount":1},{"id":"ramped_date","type":"date","datasets":["sales_rep"],"sources":["crm","hris"],"description":"Date the rep first hit sustained quota","metricCount":1},{"id":"recognition_correct","type":"boolean","datasets":["revenue_schedule"],"sources":["finance"],"description":"Recognition matched policy on review","metricCount":1},{"id":"recognized_revenue","type":"decimal","datasets":["revenue_schedule"],"sources":["finance"],"description":"Revenue recognised for the subscription in the period","metricCount":4},{"id":"record_id","type":"string","datasets":["crm_record"],"sources":["crm"],"description":"CRM record identifier","metricCount":0},{"id":"recovery_time","type":"integer","datasets":["incident"],"sources":["incident_management"],"description":"Minutes from start to service restored","metricCount":1},{"id":"referenceable","type":"boolean","datasets":["project"],"sources":["psa","crm"],"description":"Customer agreed to be a reference","metricCount":1},{"id":"registration_date","type":"date","datasets":["deal_registration"],"sources":["partner_management"],"description":"Date the deal was registered","metricCount":3},{"id":"registration_id","type":"string","datasets":["deal_registration"],"sources":["partner_management"],"description":"Partner deal registration identifier","metricCount":2},{"id":"release_date","type":"date","datasets":["release","feature"],"sources":["cicd"],"description":"Release date","metricCount":2},{"id":"release_id","type":"string","datasets":["release","feature"],"sources":["cicd"],"description":"Release identifier","metricCount":1},{"id":"renewal_amount","type":"decimal","datasets":["subscription"],"sources":["billing"],"description":"Value up for renewal","metricCount":2},{"id":"renewal_complete_date","type":"date","datasets":["subscription"],"sources":["billing","crm"],"description":"Date renewal processing finished","metricCount":1},{"id":"renewal_notified_on_time","type":"boolean","datasets":["subscription"],"sources":["billing","crm"],"description":"Renewal notice sent within the agreed window","metricCount":1},{"id":"renewal_trigger_date","type":"date","datasets":["subscription"],"sources":["billing","crm"],"description":"Date renewal processing started","metricCount":1},{"id":"renewed","type":"boolean","datasets":["subscription"],"sources":["billing"],"description":"Renewed at the most recent term end","metricCount":2},{"id":"reopened","type":"boolean","datasets":["ticket"],"sources":["help_desk"],"description":"Reopened after resolution","metricCount":1},{"id":"rep_id","type":"string","datasets":["opportunity","sales_rep"],"sources":["crm"],"description":"Sales rep identifier","metricCount":1},{"id":"request_count","type":"integer","datasets":["service_metrics"],"sources":["monitoring"],"description":"Total requests","metricCount":1},{"id":"required_field_count","type":"integer","datasets":["crm_record"],"sources":["crm"],"description":"Required fields defined","metricCount":1},{"id":"required_fields_complete","type":"boolean","datasets":["opportunity"],"sources":["crm"],"description":"All required CRM fields populated","metricCount":1},{"id":"requisition_id","type":"string","datasets":["requisition"],"sources":["ats"],"description":"Requisition identifier","metricCount":2},{"id":"requisition_opened_date","type":"date","datasets":["requisition"],"sources":["ats"],"description":"Date the requisition opened","metricCount":1},{"id":"requisition_status","type":"enum","datasets":["requisition"],"sources":["ats"],"values":["open","filled","closed"],"description":"Requisition status","metricCount":1},{"id":"resolution_due_at","type":"timestamp","datasets":["ticket"],"sources":["help_desk"],"description":"Resolution SLA deadline","metricCount":1},{"id":"resolved_at","type":"timestamp","datasets":["ticket","incident"],"sources":["help_desk","incident_management"],"description":"Resolution time","metricCount":3},{"id":"resolved_first_contact","type":"boolean","datasets":["ticket"],"sources":["help_desk"],"description":"Resolved in the first interaction","metricCount":1},{"id":"resource_id","type":"string","datasets":["onboarding"],"sources":["cs_platform"],"description":"Onboarding specialist","metricCount":1},{"id":"response_id","type":"string","datasets":["survey_response"],"sources":["survey_tool"],"description":"Survey response identifier","metricCount":1},{"id":"response_time_ms","type":"integer","datasets":["service_metrics"],"sources":["monitoring"],"description":"Response time per request sample","metricCount":1},{"id":"revenue","type":"decimal","datasets":["financials"],"sources":["finance"],"description":"GAAP recognised revenue for the period","metricCount":23},{"id":"revenue_type","type":"enum","datasets":["opportunity","financials"],"sources":["crm","finance"],"values":["subscription","services","usage","other"],"description":"Revenue line type","metricCount":8},{"id":"revision_count","type":"integer","datasets":["quote"],"sources":["crm"],"description":"Revisions before acceptance","metricCount":1},{"id":"reworked","type":"boolean","datasets":["deliverable"],"sources":["psa"],"description":"Deliverable required rework","metricCount":1},{"id":"roadmap_item_completed","type":"boolean","datasets":["roadmap_item"],"sources":["derived"],"description":"Roadmap item delivered","metricCount":1},{"id":"roadmap_item_id","type":"string","datasets":["roadmap_item"],"sources":["derived"],"description":"Roadmap item identifier","metricCount":1},{"id":"salary","type":"decimal","datasets":["employee"],"sources":["hris"],"description":"Base salary","metricCount":2},{"id":"satisfaction_score","type":"integer","datasets":["survey_response"],"sources":["survey_tool","help_desk"],"description":"1 to 5 satisfaction score","metricCount":3},{"id":"scope_changed","type":"boolean","datasets":["project"],"sources":["psa"],"description":"Scope changed after kickoff","metricCount":1},{"id":"service_id","type":"string","datasets":["service_metrics"],"sources":["monitoring"],"description":"Service identifier","metricCount":1},{"id":"session_duration","type":"integer","datasets":["product_event"],"sources":["product_analytics"],"description":"Session length in minutes","metricCount":2},{"id":"session_id","type":"string","datasets":["product_event"],"sources":["product_analytics"],"description":"Session identifier","metricCount":2},{"id":"segment","type":"string","datasets":["revenue_event","contract_event","amendment_event","customer","subscription","credit_event"],"sources":["crm","billing"],"dimension":true,"description":"Customer segment (SMB, Mid-Market, Enterprise or the organisation's own scheme) at the time of the event or snapshot. The field behind the Segment concept; carried on revenue tables so retention and movement metrics slice by it without a join.","metricCount":21},{"id":"severity","type":"enum","datasets":["incident"],"sources":["incident_management"],"values":["sev1","sev2","sev3","sev4"],"dimension":true,"description":"Incident severity","metricCount":2},{"id":"signup_date","type":"date","datasets":["user","product_event"],"sources":["product_analytics"],"description":"User signup date","metricCount":4},{"id":"sla_met","type":"boolean","datasets":["service_metrics"],"sources":["monitoring"],"description":"SLA met for the period row","metricCount":1},{"id":"snapshot_date","type":"date","datasets":["balance_sheet","customer","subscription","opportunity","lead","user","employee","partner","project","invoice","requisition","vulnerability","feature","roadmap_item","project_milestone","deliverable","onboarding","quote","order","crm_record","deal_registration","contact","plan","product","license"],"sources":["derived"],"description":"As-of date of the snapshot row","metricCount":173},{"id":"sql_date","type":"date","datasets":["lead"],"sources":["crm"],"description":"Date the lead was accepted by sales","metricCount":3},{"id":"stage_accurate","type":"boolean","datasets":["opportunity"],"sources":["crm"],"description":"Stage matches observed activity","metricCount":1},{"id":"stage_probability","type":"decimal","datasets":["opportunity"],"sources":["crm"],"description":"Win probability for the stage, 0 to 1","metricCount":1},{"id":"standard_rate","type":"decimal","datasets":["time_entry"],"sources":["psa"],"description":"Standard hourly rate","metricCount":1},{"id":"started_at","type":"timestamp","datasets":["incident"],"sources":["incident_management","monitoring"],"description":"Incident start time","metricCount":6},{"id":"state_category","type":"enum","datasets":["lifecycle_event"],"sources":["cs_platform","billing"],"values":["activation","onboarding_complete","healthy","at_risk","churned","reactivated"],"description":"Lifecycle state after the change (CEL)","metricCount":1},{"id":"steps_completed","type":"integer","datasets":["onboarding"],"sources":["cs_platform"],"description":"Onboarding tasks completed","metricCount":1},{"id":"steps_total","type":"integer","datasets":["onboarding"],"sources":["cs_platform"],"description":"Onboarding tasks assigned","metricCount":1},{"id":"subscription_id","type":"string","datasets":["revenue_event","contract_event","amendment_event","subscription","revenue_schedule","license","invoice","usage_record","credit_event"],"sources":["billing"],"description":"Subscription identifier","metricCount":3},{"id":"subscription_status","type":"enum","datasets":["subscription"],"sources":["billing"],"values":["active","cancelled","expired","paused"],"description":"Subscription status","metricCount":17},{"id":"survey_completed","type":"boolean","datasets":["survey_response"],"sources":["survey_tool"],"description":"Response completed","metricCount":1},{"id":"survey_date","type":"date","datasets":["survey_response"],"sources":["survey_tool"],"description":"Response date","metricCount":12},{"id":"survey_type","type":"enum","datasets":["survey_response"],"sources":["survey_tool"],"values":["customer","onboarding","project","partner","employee","prospect"],"description":"Survey programme the response belongs to","metricCount":11},{"id":"sync_status","type":"enum","datasets":["crm_record"],"sources":["crm"],"values":["matched","mismatched","missing"],"description":"Cross-system match state","metricCount":1},{"id":"target_date","type":"date","datasets":["project","onboarding"],"sources":["psa","cs_platform"],"description":"Committed completion date","metricCount":3},{"id":"tcv","type":"decimal","datasets":["contract_event"],"sources":["billing","crm"],"description":"Total contract value","metricCount":1},{"id":"termination_date","type":"date","datasets":["employee"],"sources":["hris"],"description":"Employment end date","metricCount":5},{"id":"termination_type","type":"enum","datasets":["employee"],"sources":["hris"],"values":["voluntary","involuntary"],"description":"Voluntary or involuntary","metricCount":3},{"id":"ticket_id","type":"string","datasets":["ticket"],"sources":["help_desk"],"description":"Ticket identifier","metricCount":12},{"id":"ticket_status","type":"enum","datasets":["ticket"],"sources":["help_desk"],"values":["open","pending","resolved","closed"],"description":"Ticket status","metricCount":3},{"id":"ticket_type","type":"enum","datasets":["ticket"],"sources":["help_desk"],"values":["how_to","bug","billing","account","feature_request","other"],"description":"Ticket category the agent or the help desk assigns","metricCount":3},{"id":"time_entry_type","type":"enum","datasets":["time_entry"],"sources":["psa"],"values":["billable","training","pre_sales","internal"],"description":"Billable or non-billable category","metricCount":2},{"id":"traffic_source","type":"enum","datasets":["web_traffic"],"sources":["web_analytics"],"values":["organic_search","paid_search","paid_social","social","email","referral","direct","other"],"description":"Traffic source","metricCount":1},{"id":"training_completed","type":"boolean","datasets":["partner"],"sources":["lms","partner_management"],"description":"Required training completed","metricCount":1},{"id":"trial_end_date","type":"date","datasets":["trial"],"sources":["billing","product_analytics"],"description":"Date the trial ended: the conversion date, the expiry date or the day it was cancelled","metricCount":1},{"id":"trial_id","type":"string","datasets":["trial"],"sources":["billing","product_analytics"],"description":"Trial identifier","metricCount":1},{"id":"trial_start_date","type":"date","datasets":["trial"],"sources":["billing","product_analytics"],"description":"Date the trial started","metricCount":1},{"id":"trial_status","type":"enum","datasets":["trial"],"sources":["billing","product_analytics"],"values":["active","converted","expired","cancelled"],"description":"Outcome of the trial: active while it runs, then converted, expired or cancelled","metricCount":1},{"id":"underrepresented_group","type":"boolean","datasets":["employee"],"sources":["hris"],"description":"Self-identified member of an underrepresented group","metricCount":4},{"id":"unique_visitors","type":"integer","datasets":["web_traffic"],"sources":["web_analytics"],"description":"Unique visitors in the period","metricCount":3},{"id":"updated_within_sla","type":"boolean","datasets":["opportunity"],"sources":["crm"],"description":"Updated inside the hygiene SLA","metricCount":1},{"id":"upgrade_eligible","type":"boolean","datasets":["customer"],"sources":["cs_platform","billing"],"description":"Customer is on a plan with an upgrade path","metricCount":1},{"id":"usage_count","type":"integer","datasets":["product_event"],"sources":["product_analytics"],"description":"Actions in the event or session","metricCount":3},{"id":"user_id","type":"string","datasets":["user","product_event"],"sources":["product_analytics"],"description":"Product user identifier","metricCount":14},{"id":"user_status","type":"enum","datasets":["user"],"sources":["product_analytics"],"values":["active","dormant","deactivated"],"description":"User activity status","metricCount":1},{"id":"utilization","type":"decimal","datasets":["service_metrics"],"sources":["cloud_provider"],"description":"Resource utilisation, 0 to 1","metricCount":2},{"id":"vulnerability_id","type":"string","datasets":["vulnerability"],"sources":["security_scanner"],"description":"Vulnerability identifier","metricCount":1},{"id":"vulnerability_status","type":"enum","datasets":["vulnerability"],"sources":["security_scanner"],"values":["open","patched","accepted"],"description":"Vulnerability status","metricCount":1},{"id":"written_off_hours","type":"decimal","datasets":["time_entry"],"sources":["psa"],"description":"Hours written off","metricCount":1},{"id":"credit_event_type","type":"enum","datasets":["credit_event"],"sources":["billing"],"values":["purchase","consumption","expiry","adjustment"],"description":"CEL Credit_Event classifier: purchase (a prepaid commitment or block of credits paid for, a rollover grant included), consumption (usage drawn down or billed), expiry (unused balance forfeited at its expiry date), adjustment (promotional grants, refunds, reversals, corrections)","metricCount":7},{"id":"credit_amount","type":"decimal","datasets":["credit_event"],"sources":["billing"],"description":"Signed amount in currency at the contract's rates: positive for purchase and a granting adjustment, negative for consumption, expiry and a reducing adjustment. The sign convention mirrors mrr_change","metricCount":7},{"id":"consumption_basis","type":"enum","datasets":["credit_event"],"sources":["billing"],"values":["committed","overage","on_demand"],"dimension":true,"description":"On consumption events: committed (drawn from a prepaid balance), overage (above an exhausted or per-period commitment), on_demand (no commitment). Consumption Revenue breaks down by it; Usage Run-Rate reads on_demand alone","metricCount":4},{"id":"credit_balance_before","type":"decimal","datasets":["credit_event"],"sources":["billing"],"description":"The customer's prepaid balance before the event; equal to credit_balance_after on on_demand consumption. Optional: billing systems that carry the signed amount alone leave it empty and the balance is summed","metricCount":0},{"id":"credit_balance_after","type":"decimal","datasets":["credit_event"],"sources":["billing"],"description":"The customer's prepaid balance after the event. With credit_balance_before it gives the ledger its identity check: before + amount = after","metricCount":0},{"id":"expires_on","type":"date","datasets":["credit_event"],"sources":["billing"],"description":"On purchase events: the date the granted balance expires; empty when it does not. A balance that rolls over has no expiry event and the new term's grant carries the new date","metricCount":0}],"datasets":{"revenue_event":{"kind":"event","date":"event_date","key":"event_id","cel":"Revenue_Event","entities":["customer","subscription"],"label":"Revenue event"},"cost_event":{"kind":"event","date":"event_date","key":"event_id","cel":"Cost_Event","label":"Cost event"},"contract_event":{"kind":"event","date":"event_date","key":"event_id","cel":"Contract_Event","entities":["customer","subscription"],"label":"Contract event"},"amendment_event":{"kind":"event","date":"event_date","key":"event_id","cel":"Amendment_Event","entities":["subscription"],"label":"Amendment event"},"lifecycle_event":{"kind":"event","date":"event_date","key":"event_id","cel":"Lifecycle_State_Change","entities":["customer"],"label":"Lifecycle state change"},"trial":{"kind":"fact","date":"trial_end_date","key":"trial_id","entities":["customer"],"label":"Trial"},"customer":{"kind":"snapshot","date":"snapshot_date","key":"customer_id","entities":["customer"],"label":"Customer","activeWhen":"field.customer_status = 'active'"},"contact":{"kind":"snapshot","date":"snapshot_date","key":"contact_id","entities":["contact"],"label":"Contact"},"plan":{"kind":"snapshot","date":"snapshot_date","key":"plan_id","entities":["plan"],"label":"Plan"},"product":{"kind":"snapshot","date":"snapshot_date","key":"product_id","entities":["product"],"label":"Product"},"license":{"kind":"snapshot","date":"snapshot_date","key":"license_id","entities":["license"],"label":"License","activeWhen":"field.license_status = 'active'"},"subscription":{"kind":"snapshot","date":"snapshot_date","key":"subscription_id","entities":["subscription"],"label":"Subscription","activeWhen":"field.subscription_status = 'active'"},"opportunity":{"kind":"snapshot","date":"snapshot_date","key":"opportunity_id","entities":["opportunity"],"label":"Opportunity"},"lead":{"kind":"snapshot","date":"snapshot_date","key":"lead_id","entities":["lead"],"label":"Lead"},"user":{"kind":"snapshot","date":"snapshot_date","key":"user_id","entities":["user"],"label":"User","activeWhen":"field.user_status = 'active'"},"employee":{"kind":"snapshot","date":"snapshot_date","key":"employee_id","entities":["employee"],"label":"Employee","activeWhen":"field.employee_status = 'active'"},"partner":{"kind":"snapshot","date":"snapshot_date","key":"partner_id","entities":["partner"],"label":"Partner","activeWhen":"field.partner_status = 'active'"},"project":{"kind":"snapshot","date":"snapshot_date","key":"project_id","entities":["project"],"label":"Project"},"invoice":{"kind":"snapshot","date":"snapshot_date","key":"invoice_id","entities":["invoice"],"label":"Invoice"},"campaign":{"kind":"fact","date":"period_start","key":"campaign_id","entities":["campaign"],"label":"Campaign spend"},"sales_rep":{"kind":"fact","date":"period_start","key":"rep_id","entities":["employee"],"label":"Sales rep period"},"consultant":{"kind":"fact","date":"period_start","key":"consultant_id","entities":["employee"],"label":"Consultant capacity"},"ticket":{"kind":"event","date":"created_at","key":"ticket_id","entities":["ticket"],"label":"Support ticket"},"product_event":{"kind":"event","date":"event_date","key":"event_id","entities":["user"],"label":"Product usage event"},"survey_response":{"kind":"event","date":"survey_date","key":"response_id","label":"Survey response"},"kb_article":{"kind":"fact","date":"period_start","key":"article_id","entities":["kb_article"],"label":"Knowledge base article"},"requisition":{"kind":"snapshot","date":"snapshot_date","key":"requisition_id","entities":["requisition"],"label":"Job requisition"},"incident":{"kind":"event","date":"started_at","key":"incident_id","entities":["incident"],"label":"Incident"},"deployment":{"kind":"event","date":"deploy_date","key":"deployment_id","entities":["deployment"],"label":"Deployment"},"vulnerability":{"kind":"snapshot","date":"snapshot_date","key":"vulnerability_id","entities":["vulnerability"],"label":"Vulnerability"},"service_metrics":{"kind":"fact","date":"period_start","key":"service_id","label":"Service reliability"},"issue":{"kind":"event","date":"created_at","key":"issue_id","entities":["issue"],"label":"Issue (bug or request)"},"feature":{"kind":"snapshot","date":"snapshot_date","key":"feature_id","entities":["feature"],"label":"Feature"},"release":{"kind":"event","date":"release_date","key":"release_id","entities":["release"],"label":"Release"},"roadmap_item":{"kind":"snapshot","date":"snapshot_date","key":"roadmap_item_id","label":"Roadmap item"},"project_milestone":{"kind":"snapshot","date":"snapshot_date","key":"project_milestone_id","entities":["project","project_milestone"],"label":"Project milestone"},"time_entry":{"kind":"event","date":"entry_date","key":"entry_id","entities":["project","employee"],"label":"Time entry"},"deliverable":{"kind":"snapshot","date":"snapshot_date","key":"deliverable_id","entities":["project","deliverable"],"label":"Deliverable"},"onboarding":{"kind":"snapshot","date":"snapshot_date","key":"onboarding_id","entities":["customer"],"label":"Onboarding engagement"},"onboarding_milestone":{"kind":"event","date":"milestone_date","key":"onboarding_id","entities":["customer"],"label":"Onboarding milestone"},"onboarding_session":{"kind":"event","date":"onboarding_session_date","key":"onboarding_id","entities":["customer"],"label":"Onboarding session"},"quote":{"kind":"snapshot","date":"snapshot_date","key":"quote_id","entities":["quote"],"label":"Quote"},"order":{"kind":"snapshot","date":"snapshot_date","key":"order_id","entities":["order"],"label":"Order"},"revenue_schedule":{"kind":"fact","date":"period_start","key":"subscription_id","entities":["subscription"],"label":"Revenue schedule"},"usage_record":{"kind":"fact","date":"period_start","key":"subscription_id","entities":["subscription"],"label":"Usage record"},"financials":{"kind":"fact","date":"period_start","key":"period_start","label":"Income statement and cash flow"},"balance_sheet":{"kind":"snapshot","date":"snapshot_date","key":"snapshot_date","label":"Balance sheet"},"web_traffic":{"kind":"fact","date":"period_start","key":"traffic_source","label":"Web traffic"},"brand_mention":{"kind":"fact","date":"period_start","key":"mention_source","label":"Brand mentions"},"crm_record":{"kind":"snapshot","date":"snapshot_date","key":"record_id","label":"CRM record quality"},"partner_activity":{"kind":"event","date":"activity_date","key":"activity_id","entities":["partner"],"label":"Partner activity"},"deal_registration":{"kind":"snapshot","date":"snapshot_date","key":"registration_id","entities":["partner","deal_registration"],"label":"Partner deal registration"},"forecast":{"kind":"fact","date":"period_start","key":"period_start","label":"Revenue forecast"},"credit_event":{"kind":"event","date":"event_date","key":"event_id","cel":"Credit_Event","entities":["customer","subscription"],"label":"Credit event"}},"sourceCategories":[{"id":"billing","label":"Billing","description":"Subscription, payment, and invoice management systems"},{"id":"crm","label":"CRM","description":"Customer relationship management: accounts, contacts, opportunities, pipeline"},{"id":"finance","label":"Finance / ERP","description":"Accounting, general ledger, cash management, expense tracking"},{"id":"cs_platform","label":"CS Platform","description":"Customer success tooling: health scores, QBRs, playbooks"},{"id":"product_analytics","label":"Product Analytics","description":"User behavior, sessions, feature usage, activation tracking"},{"id":"marketing_automation","label":"Marketing Automation","description":"Lead management, email campaigns, scoring, nurture flows"},{"id":"web_analytics","label":"Web Analytics","description":"Website traffic, visitor tracking, conversion funnels"},{"id":"ad_platforms","label":"Ad Platforms","description":"Paid media channels: spend, impressions, conversions"},{"id":"help_desk","label":"Help Desk","description":"Support ticket management, SLA tracking, agent workflows"},{"id":"knowledge_base","label":"Knowledge Base","description":"Self-service content, article performance, deflection tracking"},{"id":"hris","label":"HRIS","description":"Human resources information system: employee records, compensation, org data"},{"id":"ats","label":"ATS","description":"Applicant tracking: job postings, candidates, hiring pipeline"},{"id":"survey_tool","label":"Survey Tool","description":"NPS, CSAT, eNPS, engagement surveys and response collection"},{"id":"monitoring","label":"Monitoring","description":"Infrastructure and application monitoring: uptime, latency, errors"},{"id":"cicd","label":"CI/CD","description":"Continuous integration and deployment: builds, releases, version control"},{"id":"incident_management","label":"Incident Management","description":"Incident tracking, severity classification, resolution workflows"},{"id":"cloud_provider","label":"Cloud Provider","description":"Cloud infrastructure APIs: compute, storage, cost data"},{"id":"security_scanner","label":"Security Scanner","description":"Vulnerability scanning, patch tracking, compliance reporting"},{"id":"psa","label":"PSA","description":"Professional services automation: time tracking, project management, resource planning"},{"id":"partner_management","label":"Partner Management","description":"Partner relationship management: deal registration, portal activity, certifications"},{"id":"lms","label":"LMS","description":"Learning management: training courses, certifications, completion tracking"},{"id":"derived","label":"Derived","description":"Calculated from other metrics: no direct data source required"}],"entityMappings":{"customer":["accounts_per_csm","activation_rate","active_accounts","acv","arpa","arr_including_usage_run_rate","arr_per_csm","at_risk_rate","bookings","breadth_of_adoption","burn_multiple","cac","cac_payback","carry_mrr","churned_customers","churned_mrr","consumption_net_revenue_retention","consumption_revenue","consumption_revenue_growth_rate","contact_coverage","contraction_mrr","cost_per_onboarding","credit_breakage","cross_sell_rate","day_30_retention_post_onboarding","executive_sponsor_coverage","expansion_mrr","expansion_rate","grr","health_score","health_score_coverage","infrastructure_cost_per_customer","logo_churn_rate","logo_retention_rate","ltv","ltv_cac_ratio","marketing_cac","net_new_mrr","new_customers","new_mrr","nrr","on_time_completion_rate","onboarding_completion","onboarding_duration","onboarding_milestone_completion_rate","onboardings_per_resource","order_to_activation_time","pqas","prepaid_credit_balance","qbr_completion","reactivation_mrr","revenue_churn_rate","session_attendance_rate","task_completion_rate","tickets_per_customer","time_spent_per_onboarding","time_to_full_adoption","time_to_go_live","total_customers","trial_to_paid_conversion_rate","ttfv","upsell_rate","usage_run_rate"],"subscription":["acv","arpa","arr","arr_including_usage_run_rate","arr_per_csm","auto_renewal_rate","bookings","burn_multiple","cac","cac_payback","carry_mrr","churned_customers","churned_mrr","consumption_net_revenue_retention","consumption_revenue","consumption_revenue_growth_rate","contraction_mrr","credit_breakage","cross_sell_rate","days_to_renewal","deferred_revenue_balance","error_rate_user_facing","expansion_mrr","expansion_rate","grr","logo_churn_rate","logo_retention_rate","ltv","ltv_cac_ratio","magic_number","marketing_cac","mrr","mrr_growth_rate","net_new_mrr","new_customers","new_mrr","nrr","prepaid_credit_balance","reactivation_mrr","recognized_vs_billed","renewal_forecast_accuracy","renewal_notification_rate","renewal_processing_time","renewal_rate","revenue_churn_rate","revenue_per_employee","revenue_recognition_accuracy","rule_of_40","unbilled_revenue","upsell_rate","usage_run_rate"],"license":["license_utilization"],"lead":["cost_per_mql","cpl","lead_to_mql_rate","lead_to_opportunity_rate","leads","lvr","mql_to_sql_rate","mqls","sql_to_opportunity_rate","sqls","visitor_to_lead_rate"],"opportunity":["average_deal_size","average_partner_revenue","average_services_deal_size","cac_by_channel","channel_revenue_percentage","commit_accuracy","lead_to_opportunity_rate","marketing_influenced_pipelinerevenue","marketing_sourced_pipeline","marketing_sourced_revenue","marketplace_as_of_revenue","marketplace_revenue","opportunity_to_close_rate","paid_media_efficiency_roas","partner_deal_size","partner_influenced_revenue","partner_lifetime_value","partner_margin_commission","partner_revenue_growth","partner_roi","partner_sourced_revenue","partner_win_rate","pipeline_coverage","pipeline_hygiene_score","pipeline_value","pipeline_velocity","sales_cycle","services_attach_rate","services_backlog","services_pipeline","services_win_rate","sql_to_opportunity_rate","stage_conversion_rates","win_rate"],"user":["actions_per_session","active_accounts","breadth_of_adoption","cohort_retention","core_feature_adoption","daily_active_users_dau","dau_mau","error_rate_user_facing","feature_adoption","feature_adoption_at_go_live","feature_depth","monthly_active_users_mau","product_activation_rate","resurrection_rate","session_duration","session_frequency","time_in_product","time_to_feature_adoption","user_retention_day_n","waumau_ratio","weekly_active_users_wau"],"ticket":["cost_per_ticket","first_contact_resolution_fcr","first_response_sla_adherence","frt","reopen_rate","resolution_sla_adherence","resolution_time_time_to_resolution","self_service_rate","ticket_backlog","ticket_distribution_by_type","ticket_escalation_rate","ticket_volume","tickets_per_agent","tickets_per_customer"],"employee":["average_tenure","bench_rate","billable_utilization","capacity","capacity_utilization","compa_ratio","cost_per_hire","day_90_turnover","diversity_hiring_rate","diversity_in_leadership","diversity_representation","employee_turnover","headcount_growth_rate","involuntary_turnover_rate","pay_equity_ratio","pipeline_coverage","projects_per_consultant","quality_of_hire","quota_attainment","ramp_time","realization_rate","regrettable_turnover","revenue_per_consultant","revenue_per_employee","revenue_per_rep","source_of_hire","time_to_hire","total_headcount","total_utilization","voluntary_turnover_rate","write_off_rate"],"invoice":["accounts_receivable_balance","aging_buckets","billing_accuracy","billing_disputes","billings","collection_effectiveness_index_cei","collection_rate","credit_memo_rate","invoice_cycle_time","payment_method_distribution"],"partner":["average_partner_revenue","certification_rate","cost_of_partner_acquisition","deal_registration_to_close_rate","joint_marketing_activities","partner_activation_rate","partner_churn_rate","partner_deal_registration_volume","partner_influenced_revenue","partner_lifetime_value","partner_sales_cycle","partner_tier_distribution","partner_win_rate","total_active_partners","training_completion"],"project":["average_project_duration","bench_rate","billable_utilization","capacity_utilization","on_budget_delivery","on_time_delivery","project_duration_accuracy","project_escalation_rate","project_margin","project_milestone_completion_rate","projects_per_consultant","realization_rate","reference_ability","rework_rate","scope_change_rate","time_to_start","total_utilization","write_off_rate"],"plan":[],"product":[],"campaign":["cac_by_channel","paid_media_efficiency_roas"],"contact":["contact_coverage","executive_sponsor_coverage"],"incident":["change_failure_rate","incident_count","mean_time_to_acknowledge_mtta","mean_time_to_detect_mttd","mean_time_to_recovery_mttr","mttr","security_incident_count"],"deployment":["change_failure_rate","deployment_frequency","lead_time_for_changes"],"release":["release_frequency"],"issue":["bug_escape_rate","feature_request_volume","user_reported_issues"],"vulnerability":["time_to_patch","vulnerability_count"],"feature":["breadth_of_adoption","feature_adoption","feature_adoption_at_go_live","feature_delivery_rate","time_to_market"],"requisition":["offer_acceptance_rate","open_positions","time_to_fill"],"project_milestone":["project_milestone_completion_rate"],"deliverable":["rework_rate"],"quote":["discount_rate","quote_accuracy","quote_cycle_time","quote_to_order_rate","quote_volume"],"order":["order_error_rate","order_processing_time","quote_to_order_rate"],"kb_article":["self_service_rate"],"deal_registration":["deal_registration_to_close_rate","partner_deal_registration_volume","partner_sales_cycle"]},"concepts":[{"id":"revenue","label":"Revenue (GAAP)","definition":"Recognized revenue under accrual accounting. The financial outcome of delivering on subscription obligations.","provenance":"definitions.md: Revenue Recognition section"},{"id":"bookings","label":"Bookings","definition":"The total value of new contracts signed in a period. A forward-looking commitment that converts to revenue over the contract term.","provenance":"definitions.md: Bookings vs. Revenue distinction"},{"id":"cogs","label":"COGS","definition":"Cost of Goods Sold: the direct cost of delivering the product, infrastructure only (hosting, compute, payment processing, delivery software). Support, success engineering, implementation and onboarding are subtracted in Gross Margin's Operating form, not in COGS. Subtracted from revenue in Gross Margin.","provenance":"definitions.md: Gross Margin formula"},{"id":"cohort","label":"Cohort","definition":"A time-bound grouping of customers by acquisition period. Used for retention and expansion analysis to isolate vintage effects.","provenance":"definitions.md: Cohort-based retention methodology"},{"id":"pipeline","label":"Pipeline","definition":"The aggregate weighted value of active opportunities. Represents potential future bookings at various probability stages.","provenance":"definitions.md: Pipeline metrics"},{"id":"segment","label":"Segment","definition":"A classification of customers by size, vertical or fit (e.g. SMB, Mid-Market, Enterprise). Used for cohort analysis and benchmark comparison. Recorded in the segment field, which revenue, contract and amendment events carry as of the event and the customer and subscription snapshots carry as of the snapshot.","provenance":"Common GTM segmentation practice"},{"id":"tcv","label":"TCV (Total Contract Value)","definition":"The total value of a contract over its full term, including one-time fees and multi-year commitments. Distinct from Bookings (period-attributable) and ACV (annualized).","provenance":"definitions.md: Bookings vs ACV vs TCV"}],"entityRelationships":{"description":"Entity-to-entity and entity-to-concept edges that model the SaaS business structure. These complement the metric-to-entity MEASURES edges to form a complete digital twin.","edgeTypeClassification":{"structural":["OWNS","GRANTS","PARENT_OF","PRICED_BY"],"lifecycle":["CONVERTS_TO"],"behavioral":["SUBMITS","ENGAGES_VIA"],"assignment":["MANAGES","SOURCES","SERVES","REPRESENTED_BY"],"generative":["GENERATES","PRODUCES","CONTRIBUTES_TO","INCURS","BELONGS_TO"]},"edges":[{"from":"customer","to":"subscription","type":"OWNS","cardinality":"1:N","description":"A customer holds one or more subscriptions. Hierarchy Principle 1: customers own subscriptions, not the reverse.","provenance":"Schema.org owns, Zuora/Stripe Account→Subscription"},{"from":"subscription","to":"license","type":"GRANTS","cardinality":"1:N","description":"A subscription grants one or more licenses (seats, entitlements, feature access). Hierarchy Principle 3: licenses are derived from subscriptions.","provenance":"Zuora Rate Plan→Entitlement, Stripe SubscriptionItem→Price"},{"from":"customer","to":"user","type":"ENGAGES_VIA","cardinality":"1:N","description":"In B2B SaaS, one customer organization has many product users. Usage and engagement metrics are measured at the user level.","provenance":"SaaS-native concept (B2B multi-user model)"},{"from":"customer","to":"ticket","type":"SUBMITS","cardinality":"1:N","description":"Customers open support tickets. Support volume and resolution metrics are measured at the ticket level.","provenance":"Salesforce Account→Case, HubSpot Company→Ticket"},{"from":"lead","to":"opportunity","type":"CONVERTS_TO","cardinality":"1:1","description":"A qualified lead converts into a sales opportunity. This is the MQL→SQL transition in the acquisition funnel.","provenance":"Salesforce Lead Conversion process"},{"from":"opportunity","to":"customer","type":"CONVERTS_TO","cardinality":"1:1","description":"A won opportunity creates a new customer (closed-won). This is the SQL→Customer transition.","provenance":"Salesforce Opportunity→Account (closed-won)"},{"from":"partner","to":"opportunity","type":"SOURCES","cardinality":"1:N","description":"A channel partner sources or influences deal opportunities. Partner-sourced vs. direct pipeline is a key attribution metric.","provenance":"Salesforce Partner object→Opportunity"},{"from":"employee","to":"customer","type":"MANAGES","cardinality":"1:N","description":"CSMs and account managers are assigned to customer accounts. Employee efficiency and coverage ratios are measured through this relationship.","provenance":"Salesforce OwnerId pattern, CS Platform assignment"},{"from":"project","to":"customer","type":"SERVES","cardinality":"N:1","description":"Professional services projects are delivered to customers. Project margins and utilization are measured through this relationship.","provenance":"PSA (Professional Services Automation) models"},{"from":"subscription","to":"revenue","type":"GENERATES","cardinality":"N:1","description":"Subscriptions generate recognized revenue over their term as obligations are fulfilled.","provenance":"REA stockflow (Economic Event→Economic Resource)"},{"from":"subscription","to":"invoice","type":"GENERATES","cardinality":"1:N","description":"Subscriptions generate periodic invoices according to their billing schedule.","provenance":"Stripe Subscription→Invoice, Zuora Subscription→Invoice"},{"from":"opportunity","to":"bookings","type":"PRODUCES","cardinality":"N:1","description":"Closed-won opportunities produce bookings. Bookings convert to revenue over the contract term.","provenance":"CRM reporting: Opportunity Amount at close"},{"from":"opportunity","to":"pipeline","type":"CONTRIBUTES_TO","cardinality":"N:1","description":"Active opportunities contribute to pipeline value, weighted by stage probability.","provenance":"Salesforce Pipeline reporting"},{"from":"subscription","to":"cogs","type":"INCURS","cardinality":"N:1","description":"Delivering on subscriptions incurs costs (hosting, support, onboarding) that form the COGS basis for Gross Margin.","provenance":"REA duality: give-event paired with take-event"},{"from":"customer","to":"cohort","type":"BELONGS_TO","cardinality":"N:1","description":"Each customer belongs to an acquisition cohort based on their start date. Cohort analysis isolates vintage effects in retention and expansion.","provenance":"SaaS cohort analysis methodology"},{"from":"customer","to":"customer","type":"PARENT_OF","cardinality":"1:N","description":"Self-referential edge for account hierarchy. Global enterprises with subsidiaries roll up to a parent customer. Used for global account ARR and consolidated reporting.","provenance":"Salesforce Parent Account, Zuora Account hierarchy"},{"from":"subscription","to":"plan","type":"PRICED_BY","cardinality":"N:1","description":"A subscription is priced according to a plan. Many subscriptions can share the same plan. Enables tier-mix analysis, upgrade-path metrics and packaging health.","provenance":"Stripe Subscription→Price, Zuora Rate Plan, Chargebee Plan"},{"from":"license","to":"product","type":"GRANTS","cardinality":"N:M","description":"A license grants access to one or more products (modules). A subscription can include multiple products, each governed by its own license entitlement.","provenance":"Auth0 entitlements, Stripe Entitlements API, custom IAM"},{"from":"customer","to":"contact","type":"REPRESENTED_BY","cardinality":"1:N","description":"A customer account is represented by named individuals (champions, decision makers, executive sponsors). Enables buying-center coverage metrics and stakeholder mapping.","provenance":"Salesforce Account→Contact, HubSpot Company→Contact"},{"from":"campaign","to":"lead","type":"SOURCES","cardinality":"1:N","description":"A marketing campaign sources leads. Captures attribution beyond the free-text source field. Enables campaign ROI, channel-mix, and sourced-pipeline metrics.","provenance":"Salesforce Campaign→Lead, HubSpot Campaign attribution"},{"from":"customer","to":"segment","type":"BELONGS_TO","cardinality":"N:1","description":"Each customer belongs to a segment classification (SMB, Mid-Market, Enterprise) based on size, ARR or fit. Segment is the foundational lens for cohort and benchmark comparisons.","provenance":"Common GTM segmentation practice"},{"from":"opportunity","to":"tcv","type":"PRODUCES","cardinality":"N:1","description":"Closed-won opportunities produce TCV (Total Contract Value). Distinct from Bookings (period-attributable) and ACV (annualized): TCV captures the full multi-year commitment value.","provenance":"Salesforce Opportunity Amount across full term, CFO reporting"},{"from":"deployment","to":"incident","type":"GENERATES","cardinality":"N:1","description":"A deployment can trigger an incident. The deployment row carries the incident it caused, which is what Change Failure Rate counts.","provenance":"DORA change failure rate, incident post-mortems"},{"from":"feature","to":"release","type":"BELONGS_TO","cardinality":"N:1","description":"A feature ships in a release. Roadmap delivery and release predictability roll features up to the release that carried them.","provenance":"Jira Fix Version, Linear Project, GitHub Release"},{"from":"project","to":"project_milestone","type":"OWNS","cardinality":"1:N","description":"A professional services project owns its milestones. Milestone completion and schedule accuracy are measured against the owning project.","provenance":"PSA tools (Kantata, Rocketlane) Project→Milestone"},{"from":"project","to":"deliverable","type":"PRODUCES","cardinality":"1:N","description":"A project produces deliverables the customer accepts or sends back. Rework rate reads deliverables through their project.","provenance":"PSA tools Project→Deliverable, SOW acceptance criteria"},{"from":"quote","to":"order","type":"CONVERTS_TO","cardinality":"1:N","description":"An accepted quote becomes an order. The order carries the quote it came from, which is how quote-to-cash cycle time is measured.","provenance":"Salesforce CPQ Quote→Order, NetSuite Estimate→Sales Order"},{"from":"partner","to":"deal_registration","type":"SUBMITS","cardinality":"1:N","description":"A partner submits deal registrations for opportunities it sourced. Registration volume and approval rate are measured per partner.","provenance":"PRM tools (Impartner, PartnerStack) Partner→Deal Registration"},{"from":"deal_registration","to":"opportunity","type":"CONVERTS_TO","cardinality":"1:1","description":"An approved deal registration is linked to the opportunity it protects. Partner-sourced pipeline is read through this link.","provenance":"Salesforce PRM Deal Registration→Opportunity"},{"from":"requisition","to":"employee","type":"CONVERTS_TO","cardinality":"1:1","description":"A filled requisition becomes a hire. Time to fill ends at the hire date and the new employee is then measured in People metrics.","provenance":"ATS (Greenhouse, Lever) Requisition→Hire, HRIS employee record"}]},"structuredFormulas":{"description":"Derived from formulas.json by `npm run derive` (gasp-wiki-mcp). Each graph metric: its canonical formula, the metrics it reads (with arithmetic role and polarity: how the metric moves when the input rises) and the fields it reads, for graph traversal.","activation_rate":{"expression":"count_distinct(field.customer_id where in_period(field.onboarding_completion_date) and field.activation_date is not null) / count_distinct(field.customer_id where in_period(field.onboarding_completion_date))","inputs":[],"fields":["activation_date","customer_id","onboarding_completion_date","snapshot_date"]},"acv":{"expression":"avg(field.acv where field.contract_event_type = 'new_contract')","inputs":[],"fields":["acv","contract_event_type","event_date"]},"arpa":{"expression":"metric.mrr / metric.total_customers","inputs":[{"ref":"mrr","role":"numerator","polarity":"positive"},{"ref":"total_customers","role":"denominator","polarity":"negative"}],"fields":["customer_id","customer_status","mrr","snapshot_date","subscription_status"]},"arr":{"expression":"metric.mrr * 12","inputs":[{"ref":"mrr","role":"component","polarity":"positive"}],"fields":["mrr","snapshot_date","subscription_status"]},"arr_including_usage_run_rate":{"expression":"metric.arr + metric.usage_run_rate","inputs":[{"ref":"arr","role":"addend","polarity":"positive"},{"ref":"usage_run_rate","role":"addend","polarity":"positive"}],"fields":["consumption_basis","credit_amount","credit_event_type","event_date","mrr","snapshot_date","subscription_status"]},"at_risk_rate":{"expression":"count_distinct(field.customer_id where field.composite_score < 40) / count_distinct(field.customer_id where field.composite_score is not null)","inputs":[],"fields":["composite_score","customer_id","snapshot_date"]},"burn_rate":{"expression":"(sum(field.cash_balance) at period_start - sum(field.cash_balance) at period_end) / (period_days / 30.4375)","inputs":[],"fields":["cash_balance","snapshot_date"]},"cac":{"expression":"sum(field.cost where field.cost_function = 'gtm') / metric.new_customers","inputs":[{"ref":"new_customers","role":"denominator","polarity":"negative"}],"fields":["cost","cost_function","customer_id","event_date","event_type"]},"cac_payback":{"expression":"metric.cac / (metric.arpa * metric.gross_margin)","inputs":[{"ref":"arpa","role":"denominator","polarity":"negative"},{"ref":"cac","role":"numerator","polarity":"positive"},{"ref":"gross_margin","role":"denominator","polarity":"negative"}],"fields":["cost","cost_function","customer_id","customer_status","event_date","event_type","mrr","period_start","revenue","snapshot_date","subscription_status"]},"churned_customers":{"expression":"count_distinct(field.customer_id where field.event_type = 'churn')","inputs":[],"fields":["customer_id","event_date","event_type"]},"churned_mrr":{"expression":"-sum(field.mrr_change where field.event_type = 'churn')","inputs":[],"fields":["event_date","event_type","mrr_change"]},"consumption_revenue":{"expression":"-sum(field.credit_amount where field.credit_event_type = 'consumption')","inputs":[],"fields":["credit_amount","credit_event_type","event_date"]},"contraction_mrr":{"expression":"-sum(field.mrr_change where field.event_type = 'contraction')","inputs":[],"fields":["event_date","event_type","mrr_change"]},"cpl":{"expression":"sum(field.cost where field.cost_function = 'gtm' and field.cost_centre = 'marketing') / metric.leads","inputs":[{"ref":"leads","role":"denominator","polarity":"negative"}],"fields":["cost","cost_centre","cost_function","event_date","lead_created_date","lead_id","snapshot_date"]},"csat":{"expression":"count(field.satisfaction_score where field.survey_type = 'customer' and field.satisfaction_score >= 4) / count(field.satisfaction_score where field.survey_type = 'customer')","inputs":[],"fields":["satisfaction_score","survey_date","survey_type"]},"dau_mau":{"expression":"metric.daily_active_users_dau / metric.monthly_active_users_mau","inputs":[{"ref":"daily_active_users_dau","role":"numerator","polarity":"positive"},{"ref":"monthly_active_users_mau","role":"denominator","polarity":"negative"}],"fields":["event_date","product_event_type","user_id"]},"deployment_frequency":{"expression":"count_distinct(field.deployment_id)","inputs":[],"fields":["deploy_date","deployment_id"]},"dso":{"expression":"sum(field.accounts_receivable) at period_end / metric.revenue_gaap * period_days","inputs":[{"ref":"revenue_gaap","role":"denominator","polarity":"negative"}],"fields":["accounts_receivable","period_start","revenue","snapshot_date"]},"employee_turnover":{"expression":"count_distinct(field.employee_id where field.termination_date >= period_start and field.termination_date <= period_end) / ((metric.total_headcount at period_start + metric.total_headcount at period_end) / 2)","inputs":[{"ref":"total_headcount","role":"denominator","polarity":"negative"}],"fields":["employee_id","employee_status","snapshot_date","termination_date"]},"enps":{"expression":"(count(field.nps_score where field.survey_type = 'employee' and field.nps_score >= 9) - count(field.nps_score where field.survey_type = 'employee' and field.nps_score <= 6)) / count(field.nps_score where field.survey_type = 'employee') * 100","inputs":[],"fields":["nps_score","survey_date","survey_type"]},"expansion_mrr":{"expression":"sum(field.mrr_change where field.event_type = 'expansion')","inputs":[],"fields":["event_date","event_type","mrr_change"]},"expansion_rate":{"expression":"metric.expansion_mrr / metric.mrr at period_start","inputs":[{"ref":"expansion_mrr","role":"numerator","polarity":"positive"},{"ref":"mrr","role":"denominator","polarity":"negative","baseline":true}],"fields":["event_date","event_type","mrr","mrr_change","snapshot_date","subscription_status"]},"fcf":{"expression":"sum(field.operating_cash_flow) - sum(field.capital_expenditures)","inputs":[],"fields":["capital_expenditures","operating_cash_flow","period_start"]},"feature_adoption":{"expression":"count_distinct(field.user_id where field.feature_id is not null) / count_distinct(field.user_id where field.product_event_type = 'qualifying')","inputs":[],"fields":["event_date","feature_id","product_event_type","user_id"]},"forecast_accuracy":{"expression":"1 - abs(sum(field.forecasted_revenue) - sum(field.actual_revenue)) / sum(field.actual_revenue)","inputs":[],"fields":["actual_revenue","forecasted_revenue","period_start"]},"frt":{"expression":"(median(field.first_response_at - field.created_at)) * 1440","inputs":[],"fields":["created_at","first_response_at"]},"gross_margin":{"expression":"(sum(field.revenue) - sum(field.cost where field.cost_function = 'infrastructure')) / sum(field.revenue)","inputs":[],"fields":["cost","cost_function","event_date","period_start","revenue"]},"grr":{"expression":"(metric.mrr at period_start - metric.contraction_mrr - metric.churned_mrr) / metric.mrr at period_start over cohort(field.customer_id, period_start)","inputs":[{"ref":"churned_mrr","role":"numerator","polarity":"negative"},{"ref":"contraction_mrr","role":"numerator","polarity":"negative"},{"ref":"mrr","role":"numerator","polarity":"mixed","baseline":true}],"fields":["customer_id","customer_status","event_date","event_type","mrr","mrr_change","snapshot_date","subscription_status"],"adjustedVariant":"(sum(field.mrr_start) + sum(field.mrr_change where field.event_type in ('contraction', 'churn') and field.change_nature = 'permanent')) / sum(field.mrr_start) over cohort(field.customer_id, period_start)"},"health_score":{"expression":"avg(field.composite_score where field.customer_status = 'active') at period_end","inputs":[],"fields":["composite_score","customer_status","snapshot_date"]},"logo_churn_rate":{"expression":"metric.churned_customers / metric.total_customers at period_start","inputs":[{"ref":"churned_customers","role":"numerator","polarity":"positive"},{"ref":"total_customers","role":"denominator","polarity":"negative","baseline":true}],"fields":["customer_id","customer_status","event_date","event_type","snapshot_date"]},"ltv":{"expression":"metric.arpa * metric.gross_margin / metric.revenue_churn_rate","inputs":[{"ref":"arpa","role":"numerator","polarity":"positive"},{"ref":"gross_margin","role":"numerator","polarity":"positive"},{"ref":"revenue_churn_rate","role":"denominator","polarity":"negative"}],"fields":["cost","cost_function","customer_id","customer_status","event_date","event_type","mrr","mrr_change","period_start","revenue","snapshot_date","subscription_status"]},"ltv_cac_ratio":{"expression":"metric.ltv / metric.cac","inputs":[{"ref":"cac","role":"denominator","polarity":"negative"},{"ref":"ltv","role":"numerator","polarity":"positive"}],"fields":["cost","cost_function","customer_id","customer_status","event_date","event_type","mrr","mrr_change","period_start","revenue","snapshot_date","subscription_status"]},"lvr":{"expression":"(metric.mqls - lag(metric.mqls, 1 month)) / lag(metric.mqls, 1 month)","inputs":[{"ref":"mqls","role":"numerator","polarity":"mixed"}],"fields":["lead_id","mql_date","snapshot_date"]},"magic_number":{"expression":"(metric.arr - lag(metric.arr, 1 quarter)) / lag(window(sum(field.cost where field.cost_function = 'gtm'), 1 quarter), 1 quarter)","inputs":[{"ref":"arr","role":"numerator","polarity":"mixed"}],"fields":["cost","cost_function","event_date","mrr","snapshot_date","subscription_status"]},"marketing_cac":{"expression":"sum(field.cost where field.cost_function = 'gtm' and field.cost_centre = 'marketing') / count_distinct(field.customer_id where field.event_type = 'new')","inputs":[],"fields":["cost","cost_centre","cost_function","customer_id","event_date","event_type"]},"marketing_sourced_pipeline":{"expression":"sum(field.opportunity_amount where field.marketing_source = 'marketing' and field.opportunity_stage not in ('closed_won', 'closed_lost'))","inputs":[],"fields":["marketing_source","opportunity_amount","opportunity_stage","snapshot_date"]},"mqls":{"expression":"count_distinct(field.lead_id where in_period(field.mql_date))","inputs":[],"fields":["lead_id","mql_date","snapshot_date"]},"mrr":{"expression":"sum(field.mrr where field.subscription_status = 'active') at period_end","inputs":[],"fields":["mrr","snapshot_date","subscription_status"]},"mrr_growth_rate":{"expression":"(metric.mrr - lag(metric.mrr, 1 month)) / lag(metric.mrr, 1 month)","inputs":[{"ref":"mrr","role":"numerator","polarity":"mixed"}],"fields":["mrr","snapshot_date","subscription_status"]},"mttr":{"expression":"(avg(field.resolved_at - field.started_at)) * 1440","inputs":[],"fields":["resolved_at","started_at"]},"net_new_mrr":{"expression":"metric.new_mrr + metric.expansion_mrr + metric.reactivation_mrr - metric.churned_mrr - metric.contraction_mrr","inputs":[{"ref":"churned_mrr","role":"subtrahend","polarity":"negative"},{"ref":"contraction_mrr","role":"subtrahend","polarity":"negative"},{"ref":"expansion_mrr","role":"addend","polarity":"positive"},{"ref":"new_mrr","role":"addend","polarity":"positive"},{"ref":"reactivation_mrr","role":"addend","polarity":"positive"}],"fields":["event_date","event_type","mrr_change"]},"new_customers":{"expression":"count_distinct(field.customer_id where field.event_type = 'new')","inputs":[],"fields":["customer_id","event_date","event_type"]},"new_mrr":{"expression":"sum(field.mrr_change where field.event_type = 'new')","inputs":[],"fields":["event_date","event_type","mrr_change"]},"nps":{"expression":"(count(field.nps_score where field.survey_type = 'customer' and field.nps_score >= 9) - count(field.nps_score where field.survey_type = 'customer' and field.nps_score <= 6)) / count(field.nps_score where field.survey_type = 'customer') * 100","inputs":[],"fields":["nps_score","survey_date","survey_type"]},"nrr":{"expression":"(metric.mrr at period_start + metric.expansion_mrr - metric.contraction_mrr - metric.churned_mrr) / metric.mrr at period_start over cohort(field.customer_id, period_start)","inputs":[{"ref":"churned_mrr","role":"numerator","polarity":"negative"},{"ref":"contraction_mrr","role":"numerator","polarity":"negative"},{"ref":"expansion_mrr","role":"numerator","polarity":"positive"},{"ref":"mrr","role":"numerator","polarity":"mixed","baseline":true}],"fields":["customer_id","customer_status","event_date","event_type","mrr","mrr_change","snapshot_date","subscription_status"],"adjustedVariant":"(sum(field.mrr_start) + sum(field.mrr_change where field.event_type in ('expansion', 'contraction', 'churn') and field.change_nature = 'permanent')) / sum(field.mrr_start) over cohort(field.customer_id, period_start)"},"onboarding_completion":{"expression":"count_distinct(field.onboarding_id where in_period(field.onboarding_completion_date)) / count_distinct(field.onboarding_id where in_period(field.onboarding_start_date))","inputs":[],"fields":["onboarding_completion_date","onboarding_id","onboarding_start_date","snapshot_date"]},"operating_margin":{"expression":"metric.gross_margin - metric.opex_ratio","inputs":[{"ref":"gross_margin","role":"addend","polarity":"positive"},{"ref":"opex_ratio","role":"subtrahend","polarity":"negative"}],"fields":["cost","cost_function","event_date","period_start","revenue"]},"partner_sourced_revenue":{"expression":"sum(field.opportunity_amount where field.partner_sourced = true and field.opportunity_stage = 'closed_won' and in_period(field.close_date))","inputs":[],"fields":["close_date","opportunity_amount","opportunity_stage","partner_sourced","snapshot_date"]},"pipeline_coverage":{"expression":"sum(field.opportunity_amount where field.opportunity_stage not in ('closed_won', 'closed_lost')) / sum(field.quota)","inputs":[],"fields":["opportunity_amount","opportunity_stage","period_start","quota","snapshot_date"]},"pipeline_value":{"expression":"sum(field.opportunity_amount * field.stage_probability where field.opportunity_stage not in ('closed_won', 'closed_lost'))","inputs":[],"fields":["opportunity_amount","opportunity_stage","snapshot_date","stage_probability"]},"pqas":{"expression":"count_distinct(field.customer_id where field.criteria_met = true) at period_end","inputs":[],"fields":["criteria_met","customer_id","snapshot_date"]},"prepaid_credit_balance":{"expression":"sum(field.credit_amount where field.credit_event_type in ('purchase', 'expiry', 'adjustment') or field.consumption_basis = 'committed') to_date","inputs":[],"fields":["consumption_basis","credit_amount","credit_event_type","event_date"]},"qbr_completion":{"expression":"count_distinct(field.customer_id where field.qbr_completed = true) / count_distinct(field.customer_id where field.qbr_due = true)","inputs":[],"fields":["customer_id","qbr_completed","qbr_due","snapshot_date"]},"quota_attainment":{"expression":"sum(field.closed_revenue) / sum(field.quota)","inputs":[],"fields":["closed_revenue","period_start","quota"]},"reactivation_mrr":{"expression":"sum(field.mrr_change where field.event_type = 'reactivation')","inputs":[],"fields":["event_date","event_type","mrr_change"]},"renewal_rate":{"expression":"count_distinct(field.subscription_id where field.renewed = true and in_period(field.contract_end)) / count_distinct(field.subscription_id where in_period(field.contract_end))","inputs":[],"fields":["contract_end","renewed","snapshot_date","subscription_id"]},"revenue_churn_rate":{"expression":"(metric.churned_mrr + metric.contraction_mrr) / metric.mrr at period_start","inputs":[{"ref":"churned_mrr","role":"numerator","polarity":"positive"},{"ref":"contraction_mrr","role":"numerator","polarity":"positive"},{"ref":"mrr","role":"denominator","polarity":"negative","baseline":true}],"fields":["event_date","event_type","mrr","mrr_change","snapshot_date","subscription_status"]},"revenue_per_employee":{"expression":"metric.arr / metric.total_headcount","inputs":[{"ref":"arr","role":"numerator","polarity":"positive"},{"ref":"total_headcount","role":"denominator","polarity":"negative"}],"fields":["employee_id","employee_status","mrr","snapshot_date","subscription_status"]},"rule_of_40":{"expression":"(metric.arr - lag(metric.arr, 1 year)) / lag(metric.arr, 1 year) + metric.ebitda_margin","inputs":[{"ref":"arr","role":"numerator","polarity":"mixed"},{"ref":"ebitda_margin","role":"addend","polarity":"positive"}],"fields":["ebitda","mrr","period_start","revenue","snapshot_date","subscription_status"]},"sales_cycle":{"expression":"avg(field.close_date - field.opportunity_created_date where field.opportunity_stage = 'closed_won' and in_period(field.close_date))","inputs":[],"fields":["close_date","opportunity_created_date","opportunity_stage","snapshot_date"]},"self_service_rate":{"expression":"sum(field.deflections) / (sum(field.deflections) + metric.ticket_volume)","inputs":[{"ref":"ticket_volume","role":"denominator","polarity":"negative"}],"fields":["created_at","deflections","period_start","ticket_id"]},"sqls":{"expression":"count_distinct(field.lead_id where in_period(field.sql_date))","inputs":[],"fields":["lead_id","snapshot_date","sql_date"]},"ticket_volume":{"expression":"count_distinct(field.ticket_id)","inputs":[],"fields":["created_at","ticket_id"]},"total_customers":{"expression":"count_distinct(field.customer_id where field.customer_status = 'active') at period_end","inputs":[],"fields":["customer_id","customer_status","snapshot_date"]},"trial_to_paid_conversion_rate":{"expression":"count_distinct(field.trial_id where field.trial_status = 'converted' and in_period(field.trial_end_date)) / count_distinct(field.trial_id where field.trial_status in ('converted', 'expired', 'cancelled') and in_period(field.trial_end_date))","inputs":[],"fields":["trial_end_date","trial_id","trial_status"]},"ttfv":{"expression":"median(field.milestone_date - field.contract_start where field.onboarding_milestone = 'first_value')","inputs":[],"fields":["contract_start","milestone_date","onboarding_milestone"]},"uptime":{"expression":"1 - sum(field.downtime_minutes) / (period_days * 1440)","inputs":[],"fields":["downtime_minutes","period_start"]},"usage_run_rate":{"expression":"-window(sum(field.credit_amount where field.credit_event_type = 'consumption' and field.consumption_basis = 'on_demand'), 3 month) * 4","inputs":[],"fields":["consumption_basis","credit_amount","credit_event_type","event_date"]},"win_rate":{"expression":"count(field.opportunity_id where field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / count(field.opportunity_id where field.opportunity_stage in ('closed_won', 'closed_lost') and in_period(field.close_date))","inputs":[],"fields":["close_date","opportunity_id","opportunity_stage","snapshot_date"]}},"accessControl":{"description":"Recommended sensitivity and access scope per metric. These are GUIDANCE, not enforcement. Actual policies should be expressed in Cedar, OPA, or warehouse RLS. See /v1/governance for the framework.","sensitivityTiers":{"public":"Shareable externally with no restriction (rare for internal SaaS metrics)","internal":"Shareable across the organization. Default for most operational metrics","confidential":"Cross-functional but sensitive. Typically restricted to managers and above","restricted":"Highly sensitive. Executive and finance-leadership only by default"},"accessScopes":{"unscoped":"Same value for everyone with access (e.g. company-wide ARR)","department-scoped":"Filtered by the viewer's department context","owner-scoped":"Visible only for records the viewer owns or manages (individual, team, territory, book or segment: interpretation lives in the adapter)"},"classifications":{"arr":{"sensitivityTier":"confidential","accessScope":"unscoped"},"mrr":{"sensitivityTier":"confidential","accessScope":"unscoped"},"arpa":{"sensitivityTier":"confidential","accessScope":"unscoped"},"mrr_growth_rate":{"sensitivityTier":"confidential","accessScope":"unscoped"},"new_mrr":{"sensitivityTier":"confidential","accessScope":"unscoped"},"expansion_mrr":{"sensitivityTier":"confidential","accessScope":"unscoped"},"churned_mrr":{"sensitivityTier":"confidential","accessScope":"unscoped"},"reactivation_mrr":{"sensitivityTier":"confidential","accessScope":"unscoped"},"total_customers":{"sensitivityTier":"internal","accessScope":"unscoped"},"new_customers":{"sensitivityTier":"confidential","accessScope":"unscoped"},"churned_customers":{"sensitivityTier":"confidential","accessScope":"unscoped"},"contraction_mrr":{"sensitivityTier":"confidential","accessScope":"unscoped"},"net_new_mrr":{"sensitivityTier":"confidential","accessScope":"unscoped"},"nrr":{"sensitivityTier":"confidential","accessScope":"unscoped"},"grr":{"sensitivityTier":"confidential","accessScope":"unscoped"},"gross_margin":{"sensitivityTier":"confidential","accessScope":"unscoped"},"rule_of_40":{"sensitivityTier":"restricted","accessScope":"unscoped"},"logo_churn_rate":{"sensitivityTier":"confidential","accessScope":"unscoped"},"revenue_churn_rate":{"sensitivityTier":"confidential","accessScope":"unscoped"},"nps":{"sensitivityTier":"internal","accessScope":"unscoped"},"cac":{"sensitivityTier":"confidential","accessScope":"unscoped"},"ltv":{"sensitivityTier":"confidential","accessScope":"unscoped"},"ltv_cac_ratio":{"sensitivityTier":"confidential","accessScope":"unscoped"},"cac_payback":{"sensitivityTier":"confidential","accessScope":"unscoped"},"pipeline_value":{"sensitivityTier":"confidential","accessScope":"owner-scoped"},"pipeline_coverage":{"sensitivityTier":"confidential","accessScope":"owner-scoped"},"win_rate":{"sensitivityTier":"confidential","accessScope":"department-scoped"},"acv":{"sensitivityTier":"confidential","accessScope":"owner-scoped"},"quota_attainment":{"sensitivityTier":"confidential","accessScope":"owner-scoped"},"sales_cycle":{"sensitivityTier":"internal","accessScope":"department-scoped"},"forecast_accuracy":{"sensitivityTier":"confidential","accessScope":"department-scoped"},"mqls":{"sensitivityTier":"internal","accessScope":"unscoped"},"sqls":{"sensitivityTier":"internal","accessScope":"unscoped"},"lvr":{"sensitivityTier":"internal","accessScope":"unscoped"},"marketing_cac":{"sensitivityTier":"confidential","accessScope":"unscoped"},"cpl":{"sensitivityTier":"confidential","accessScope":"department-scoped"},"marketing_sourced_pipeline":{"sensitivityTier":"confidential","accessScope":"department-scoped"},"health_score":{"sensitivityTier":"internal","accessScope":"owner-scoped"},"expansion_rate":{"sensitivityTier":"confidential","accessScope":"department-scoped"},"renewal_rate":{"sensitivityTier":"confidential","accessScope":"department-scoped"},"at_risk_rate":{"sensitivityTier":"internal","accessScope":"owner-scoped"},"qbr_completion":{"sensitivityTier":"internal","accessScope":"department-scoped"},"csat":{"sensitivityTier":"internal","accessScope":"department-scoped"},"frt":{"sensitivityTier":"internal","accessScope":"department-scoped"},"ticket_volume":{"sensitivityTier":"internal","accessScope":"department-scoped"},"self_service_rate":{"sensitivityTier":"internal","accessScope":"unscoped"},"ttfv":{"sensitivityTier":"internal","accessScope":"department-scoped"},"onboarding_completion":{"sensitivityTier":"internal","accessScope":"department-scoped"},"activation_rate":{"sensitivityTier":"internal","accessScope":"unscoped"},"trial_to_paid_conversion_rate":{"sensitivityTier":"internal","accessScope":"unscoped"},"dau_mau":{"sensitivityTier":"internal","accessScope":"unscoped"},"feature_adoption":{"sensitivityTier":"internal","accessScope":"unscoped"},"pqas":{"sensitivityTier":"internal","accessScope":"department-scoped"},"uptime":{"sensitivityTier":"internal","accessScope":"unscoped"},"deployment_frequency":{"sensitivityTier":"internal","accessScope":"department-scoped"},"mttr":{"sensitivityTier":"internal","accessScope":"department-scoped"},"operating_margin":{"sensitivityTier":"restricted","accessScope":"unscoped"},"fcf":{"sensitivityTier":"restricted","accessScope":"unscoped"},"burn_rate":{"sensitivityTier":"restricted","accessScope":"unscoped"},"revenue_per_employee":{"sensitivityTier":"restricted","accessScope":"unscoped"},"magic_number":{"sensitivityTier":"restricted","accessScope":"unscoped"},"dso":{"sensitivityTier":"confidential","accessScope":"unscoped"},"employee_turnover":{"sensitivityTier":"restricted","accessScope":"unscoped"},"enps":{"sensitivityTier":"restricted","accessScope":"unscoped"},"partner_sourced_revenue":{"sensitivityTier":"confidential","accessScope":"department-scoped"},"consumption_revenue":{"sensitivityTier":"confidential","accessScope":"unscoped"},"usage_run_rate":{"sensitivityTier":"confidential","accessScope":"unscoped"},"prepaid_credit_balance":{"sensitivityTier":"confidential","accessScope":"unscoped"},"arr_including_usage_run_rate":{"sensitivityTier":"confidential","accessScope":"unscoped"}}},"validationRules":{"mrr-growth-rate":[{"type":"benchmarks","ranges":[{"threshold":"15","label":"20% MoM"},{"threshold":"5","label":"10% MoM"},{"threshold":"2","label":"5% MoM"}],"source":"benchmarks"}],"net-revenue-retention-nrr":[{"type":"min","value":0,"unit":"percent"},{"type":"window","value":"trailing_12_months","note":"GASP specifies trailing 12 months for NRR"},{"type":"benchmarks","ranges":[{"threshold":"90%","label":"Leaky bucket. Growth requires constant new acquisition."},{"threshold":"90","label":"100%: Stable. You keep what you have."},{"threshold":"100","label":"110%: Good. Existing customers grow. (Median for VC-backed S"},{"threshold":"110","label":"120%: Great. Strong expansion motion."}],"source":"benchmarks"}],"gross-revenue-retention-grr":[{"type":"max","value":100,"unit":"percent","note":"GRR cannot exceed 100%: it excludes expansion revenue"},{"type":"min","value":0,"unit":"percent"},{"type":"benchmarks","ranges":[{"threshold":"80%","label":"Severe retention problem"},{"threshold":"80","label":"85%: Below average for most segments"},{"threshold":"85","label":"90%: Average for SMB-focused businesses (Median for bootstra"},{"threshold":"90","label":"95%: Good, typical for mid-market"}],"source":"benchmarks"}],"logo-churn-rate-customer-churn":[{"type":"min","value":0,"unit":"percent"},{"type":"max","value":100,"unit":"percent"},{"type":"period","value":"monthly","note":"Report as monthly rate; annualize separately if needed"},{"type":"benchmarks","ranges":[{"threshold":"<1%","label":"Good for established SaaS"},{"threshold":"1","label":"2%: Acceptable"},{"threshold":"2","label":"3%: Concerning"},{"threshold":">3%","label":"Requires attention"}],"source":"benchmarks"}],"revenue-churn-rate":[{"type":"min","value":0,"unit":"percent"},{"type":"max","value":100,"unit":"percent"},{"type":"benchmarks","ranges":[{"threshold":"<2%","label":"Good"},{"threshold":"2","label":"5%: Average"},{"threshold":">5%","label":"High (average annual churn ~4.9% for B2B SaaS)"}],"source":"benchmarks"}],"nps-net-promoter-score":[{"type":"min","value":-100},{"type":"max","value":100},{"type":"unit","value":"score","note":"NPS is a score, not a percentage: do not append %"},{"type":"benchmarks","ranges":[{"threshold":"0","label":"More detractors than promoters"},{"threshold":"0","label":"30: Average (B2B SaaS average: 36-41)"},{"threshold":"30","label":"50: Good"},{"threshold":"50","label":"70: Excellent (top performers)"}],"source":"benchmarks"}],"cac-customer-acquisition-cost":[{"type":"benchmarks","ranges":[{"threshold":"300","label":"$1,000"},{"threshold":"000","label":"$5,000"},{"threshold":"000","label":"$50,000+"},{"threshold":"3","label":"1 or higher (see LTV:CAC Ratio)"}],"source":"benchmarks"}],"ltvcac-ratio":[{"type":"min","value":0},{"type":"target","value":3,"note":"LTV:CAC > 3:1 is the standard threshold for healthy unit economics"},{"type":"benchmarks","ranges":[{"threshold":"1","label":"1: Losing money on every customer"},{"threshold":"1","label":"1 to 2:1: Breaking even or marginal, concerning to investors"},{"threshold":"3","label":"1 to 4:1: Industry standard, healthy sustainable growth (Med"},{"threshold":"4","label":"1 to 5:1: Strong business model"},{"threshold":"5","label":"1: Under-investing in growth; could be growing faster"}],"source":"benchmarks"}],"cac-payback-period":[{"type":"unit","value":"months","note":"Always expressed in months, not years"},{"type":"min","value":0},{"type":"benchmarks","ranges":[{"threshold":"12","label":"18 months: Acceptable (Median 2024: 18-20 months)"},{"threshold":"18","label":"24 months: Concerning for most segments"}],"source":"benchmarks"}],"gross-margin":[{"type":"max","value":100,"unit":"percent"},{"type":"min","value":0,"unit":"percent","note":"Negative gross margin possible but indicates fundamental issue"},{"type":"benchmarks","ranges":[{"threshold":"60%","label":"Low, may indicate infrastructure-heavy or services-heavy bus"},{"threshold":"60","label":"70%: Moderate (Seed/Series A acceptable while scaling)"},{"threshold":"70","label":"80%: Good, typical for SaaS (Most VCs require 70%+ for inves"},{"threshold":"75","label":"80%: Series B+ expected, attractive to investors"},{"threshold":"80","label":"85%: Best-in-class (commands valuation premium)"}],"source":"benchmarks"}],"rule-of-40":[{"type":"formula","value":"ARR Growth Rate (YoY) + EBITDA Margin","note":"GASP specifies ARR growth (not revenue growth) and EBITDA margin (not FCF margin)"},{"type":"target","value":40,"unit":"percent","note":"Score above 40% indicates healthy growth/profitability balance"},{"type":"benchmarks","ranges":[{"threshold":"20","label":"Struggling (Median public SaaS Q1 2025: 12-15%)"},{"threshold":"20","label":"40: Developing (Median mid-2024: 34%)"}],"source":"benchmarks"}],"at-risk-customer-rate":[{"type":"benchmarks","ranges":[{"threshold":"5%","label":"Healthy portfolio"},{"threshold":"5","label":"10%: Normal, requires attention"},{"threshold":"10","label":"20%: Elevated risk"},{"threshold":"20%","label":"Portfolio in trouble"}],"source":"benchmarks"}],"expansion-revenue-rate":[{"type":"benchmarks","ranges":[{"threshold":"10%","label":"Limited expansion motion"},{"threshold":"10","label":"20%: Moderate, typical for early-stage"},{"threshold":"20","label":"30%: Strong, solid benchmark for growth stage"},{"threshold":"30","label":"40%: Excellent, typical at $15M+ ARR"}],"source":"benchmarks"}],"renewal-rate":[{"type":"benchmarks","ranges":[{"threshold":"85%","label":"Concerning, indicates retention problem"},{"threshold":"85","label":"90%: Below average"},{"threshold":"90","label":"95%: Good (90% is the industry norm per 2025 data)"}],"source":"benchmarks"}],"accounts-per-csm":[{"type":"benchmarks","ranges":[{"threshold":"10","label":"50 (median ~22) | $100K+ |"},{"threshold":"50","label":"100 (median ~49) | $25K-$100K |"},{"threshold":"100","label":"250 | $5K-$25K |"},{"threshold":"300","label":"500+ | <$5K |"}],"source":"benchmarks"}],"uptime-availability":[{"type":"benchmarks","ranges":[{"threshold":"0%","label":"~7.3 hours downtime (unacceptable for most SaaS)"},{"threshold":"9%","label":"~43 minutes downtime (three nines)"},{"threshold":"95%","label":"~22 minutes downtime (typical SLA)"},{"threshold":"99%","label":"~4.3 minutes downtime (four nines, high reliability)"}],"source":"benchmarks"}],"error-rate":[{"type":"benchmarks","ranges":[{"threshold":"1%","label":"Excellent"},{"threshold":"1","label":"0.5%: Good"},{"threshold":"5","label":"1%: Acceptable"},{"threshold":"1%","label":"Needs attention"}],"source":"benchmarks"}],"latency-response-time":[{"type":"benchmarks","ranges":[{"threshold":"50","label":"< 100ms"},{"threshold":"95","label":"< 500ms"},{"threshold":"99","label":"< 1000ms"}],"source":"benchmarks"}],"mean-time-to-resolve-mttr":[{"type":"benchmarks","ranges":[{"threshold":"1","label":"< 1 hour"},{"threshold":"2","label":"< 4 hours"},{"threshold":"3","label":"< 24 hours"}],"source":"benchmarks"}],"change-failure-rate":[{"type":"benchmarks","ranges":[{"threshold":"0","label":"15%"},{"threshold":"16","label":"30%"},{"threshold":"31","label":"45%"},{"threshold":"46","label":"60%"}],"source":"benchmarks"}],"operating-margin-ebit-margin":[{"type":"benchmarks","ranges":[{"threshold":"50%","label":"Heavy investment phase"},{"threshold":"0%","label":"Growth mode"},{"threshold":"0","label":"20%: Path to profitability"},{"threshold":"20%","label":"Profitable and efficient"}],"source":"benchmarks"}],"free-cash-flow-margin":[{"type":"benchmarks","ranges":[{"threshold":"20%","label":"Heavy investment"},{"threshold":"0%","label":"Growth mode"},{"threshold":"0","label":"10%: Cash flow positive"},{"threshold":"10%","label":"Strong cash generation"}],"source":"benchmarks"}],"magic-number":[{"type":"benchmarks","ranges":[{"threshold":"5","label":"Inefficient, fix before scaling"},{"threshold":"5","label":"0.75: Acceptable"},{"threshold":"75","label":"1.0: Efficient (2024 median: 0.90)"},{"threshold":"0","label":"Very efficient, invest more aggressively"}],"source":"benchmarks"}],"burn-multiple":[{"type":"benchmarks","ranges":[{"threshold":"0","label":"1.5x: Strong (top quartile)"},{"threshold":"5","label":"2x: Median, acceptable"},{"threshold":"0","label":"3x: Concerning, especially above $20M ARR"}],"source":"benchmarks"}],"sm-as-of-revenue":[{"type":"benchmarks","ranges":[{"threshold":"80","label":"120%"},{"threshold":"40","label":"60%"},{"threshold":"20","label":"40%"}],"source":"benchmarks"}],"rd-as-of-revenue":[{"type":"benchmarks","ranges":[{"threshold":"15","label":"25%"}],"source":"benchmarks"}],"ga-as-of-revenue":[{"type":"benchmarks","ranges":[{"threshold":"10","label":"15%"}],"source":"benchmarks"}],"days-sales-outstanding-dso":[{"type":"benchmarks","ranges":[{"threshold":"30","label":"45 days: Good"},{"threshold":"45","label":"60 days: Average"}],"source":"benchmarks"}],"visitor-to-lead-rate":[{"type":"benchmarks","ranges":[{"threshold":"2%","label":"Below average, optimize capture"},{"threshold":"2","label":"3%: Average for B2B websites"},{"threshold":"3","label":"7%: Good (majority of SaaS market)"},{"threshold":"7","label":"12%: Excellent / top performers"}],"source":"benchmarks"}],"lead-to-mql-rate":[{"type":"benchmarks","ranges":[{"threshold":"15%","label":"Low quality leads or strict MQL criteria"},{"threshold":"15","label":"30%: Average"},{"threshold":"30","label":"50%: Good quality leads"},{"threshold":"50%","label":"May indicate loose criteria"}],"source":"benchmarks"}],"mql-to-sql-rate":[{"type":"benchmarks","ranges":[{"threshold":"20","label":"30%"}],"source":"benchmarks"}],"sql-to-opportunity-rate":[{"type":"benchmarks","ranges":[{"threshold":"30%","label":"Low conversion"},{"threshold":"30","label":"50%: Average"},{"threshold":"50%","label":"Good"}],"source":"benchmarks"}],"cost-per-mql":[{"type":"benchmarks","ranges":[{"threshold":"30","label":"$120"},{"threshold":"50","label":"$150"},{"threshold":"150","label":"$400"},{"threshold":"400","label":"$1000+"}],"source":"benchmarks"}],"time-to-first-value-ttfv":[{"type":"benchmarks","ranges":[{"threshold":"1","label":"2 weeks |"},{"threshold":"2","label":"4 weeks |"},{"threshold":"4","label":"12 weeks |"}],"source":"benchmarks"}],"onboarding-completion-rate":[{"type":"benchmarks","ranges":[{"threshold":"70%","label":"Low, investigate friction points"},{"threshold":"70","label":"85%: Average"},{"threshold":"85","label":"95%: Good"},{"threshold":"95%","label":"Excellent"}],"source":"benchmarks"}],"onboarding-csat":[{"type":"benchmarks","ranges":[{"threshold":"80%","label":"Investigate pain points"},{"threshold":"80","label":"90%: Average"},{"threshold":"90%","label":"Good"},{"threshold":"95%","label":"Excellent"}],"source":"benchmarks"}],"time-spent-per-onboarding":[{"type":"benchmarks","ranges":[{"threshold":"0","label":"2 hours"},{"threshold":"5","label":"15 hours"},{"threshold":"20","label":"50 hours"},{"threshold":"50","label":"200+ hours"}],"source":"benchmarks"}],"partner-activation-rate":[{"type":"benchmarks","ranges":[{"threshold":"20%","label":"Low activation"},{"threshold":"20","label":"40%: Average"},{"threshold":"40","label":"60%: Good"},{"threshold":"60%","label":"Strong enablement"}],"source":"benchmarks"}],"channel-revenue-percentage":[{"type":"benchmarks","ranges":[{"threshold":"10%","label":"Direct-dominant model"},{"threshold":"10","label":"30%: Developing channel"},{"threshold":"30","label":"50%: Balanced model"},{"threshold":"50%","label":"Channel-dominant model"}],"source":"benchmarks"}],"deal-registration-to-close-rate":[{"type":"benchmarks","ranges":[{"threshold":"20%","label":"Low quality or poor follow-through"},{"threshold":"20","label":"35%: Average"},{"threshold":"35%","label":"Good"}],"source":"benchmarks"}],"employee-turnover-rate":[{"type":"benchmarks","ranges":[{"threshold":"10%","label":"Excellent retention"},{"threshold":"10","label":"15%: Good"},{"threshold":"13","label":"20%: Average for tech (tech runs higher than other industrie"},{"threshold":"20","label":"25%: High for tech, investigate"},{"threshold":"25%","label":"Critical"}],"source":"benchmarks"}],"90-day-turnover":[{"type":"benchmarks","ranges":[{"threshold":"5%","label":"Good onboarding and hiring"},{"threshold":"5","label":"10%: Average"},{"threshold":"10%","label":"Hiring or onboarding issues"}],"source":"benchmarks"}],"employee-net-promoter-score-enps":[{"type":"benchmarks","ranges":[{"threshold":"0","label":"Poor engagement (investigate immediately)"},{"threshold":"0","label":"10: Below average"},{"threshold":"10","label":"30: Average (overall benchmark ~12-27)"},{"threshold":"30","label":"50: Good, leading companies"},{"threshold":"50","label":"Excellent"}],"source":"benchmarks"}],"engagement-score":[{"type":"benchmarks","ranges":[{"threshold":"60%","label":"Low engagement"},{"threshold":"60","label":"70%: Average"},{"threshold":"70","label":"80%: Good"},{"threshold":"80%","label":"High engagement"}],"source":"benchmarks"}],"time-to-fill":[{"type":"benchmarks","ranges":[{"threshold":"30","label":"45 days: Good"},{"threshold":"45","label":"60 days: Average"}],"source":"benchmarks"}],"offer-acceptance-rate":[{"type":"benchmarks","ranges":[{"threshold":"70%","label":"Low, may indicate compensation or culture issues"},{"threshold":"70","label":"85%: Average"},{"threshold":"85%","label":"Strong employer brand"}],"source":"benchmarks"}],"cost-per-hire":[{"type":"benchmarks","ranges":[{"threshold":"000","label":"$7,000"},{"threshold":"000","label":"$15,000"},{"threshold":"000","label":"$50,000+"}],"source":"benchmarks"}],"daumau-ratio-stickiness":[{"type":"min","value":0,"unit":"ratio"},{"type":"max","value":1,"unit":"ratio"},{"type":"benchmarks","ranges":[{"threshold":"10%","label":"Low stickiness, investigate product-market fit"},{"threshold":"10","label":"13%: Average for B2B SaaS (Mixpanel data: 13% median)"},{"threshold":"13","label":"20%: Good for B2B SaaS"},{"threshold":"20","label":"25%: Strong engagement"}],"source":"benchmarks"}],"waumau-ratio":[{"type":"benchmarks","ranges":[{"threshold":"40%","label":"Infrequent use"},{"threshold":"40","label":"60%: Moderate use"},{"threshold":"60%","label":"Regular weekly use"}],"source":"benchmarks"}],"activation-rate":[{"type":"benchmarks","ranges":[{"threshold":"20%","label":"Low activation, onboarding issue"},{"threshold":"20","label":"40%: Average"},{"threshold":"40","label":"60%: Good"},{"threshold":"60%","label":"Strong activation"}],"source":"benchmarks"}],"core-feature-adoption":[{"type":"benchmarks","ranges":[{"threshold":"30%","label":"Users not fully utilizing product"},{"threshold":"30","label":"50%: Moderate adoption"},{"threshold":"50","label":"70%: Good"},{"threshold":"70%","label":"Strong full-product adoption"}],"source":"benchmarks"}],"user-retention-day-n":[{"type":"benchmarks","ranges":[{"threshold":"20%","label":"Poor"},{"threshold":"20","label":"40%: Average"},{"threshold":"40%","label":"Good"}],"source":"benchmarks"}],"services-as-of-total-revenue":[{"type":"benchmarks","ranges":[{"threshold":"10%","label":"Product-led, minimal services"},{"threshold":"10","label":"20%: Services-assisted product"},{"threshold":"20","label":"30%: Balanced model"},{"threshold":"30%","label":"Services-heavy (may impact valuation multiples)"}],"source":"benchmarks"}],"services-gross-margin":[{"type":"benchmarks","ranges":[{"threshold":"20%","label":"Unprofitable, review pricing"},{"threshold":"20","label":"30%: Low margin"},{"threshold":"30","label":"40%: Average"},{"threshold":"40","label":"50%: Good"},{"threshold":"50%","label":"Excellent"}],"source":"benchmarks"}],"realization-rate":[{"type":"benchmarks","ranges":[{"threshold":"80%","label":"Significant discounting or write-offs"},{"threshold":"80","label":"90%: Average"},{"threshold":"90","label":"100%: Good pricing discipline"},{"threshold":"100%","label":"Premium pricing achieved"}],"source":"benchmarks"}],"billable-utilization":[{"type":"benchmarks","ranges":[{"threshold":"60%","label":"Underutilized"},{"threshold":"60","label":"70%: Average"},{"threshold":"70","label":"80%: Good"},{"threshold":"80%","label":"Maxed out (burnout risk)"}],"source":"benchmarks"}],"forecast-accuracy":[{"type":"benchmarks","ranges":[{"threshold":"70%","label":"Poor forecasting"},{"threshold":"70","label":"85%: Average"},{"threshold":"85","label":"95%: Good"},{"threshold":"95%","label":"Excellent"}],"source":"benchmarks"}],"quote-to-order-rate":[{"type":"benchmarks","ranges":[{"threshold":"20%","label":"Low conversion"},{"threshold":"20","label":"40%: Average"},{"threshold":"40","label":"60%: Good"},{"threshold":"60%","label":"Strong"}],"source":"benchmarks"}],"collection-effectiveness-index-cei":[{"type":"benchmarks","ranges":[{"threshold":"70%","label":"Poor"},{"threshold":"70","label":"80%: Average"},{"threshold":"80%","label":"Good"}],"source":"benchmarks"}],"pipeline-coverage-ratio":[{"type":"benchmarks","ranges":[{"threshold":"2","label":"3x: Light, acceptable for high win rate teams"},{"threshold":"3","label":"4x: Healthy for typical 25-33% win rates"}],"source":"benchmarks"}],"lead-to-opportunity-rate":[{"type":"benchmarks","ranges":[{"threshold":"5","label":"15%: Typical for inbound leads"},{"threshold":"1","label":"5%: Typical for outbound/cold leads"}],"source":"benchmarks"}],"sales-cycle-length":[{"type":"benchmarks","ranges":[{"threshold":"14","label":"40 days"},{"threshold":"60","label":"90 days"},{"threshold":"90","label":"180+ days"}],"source":"benchmarks"}],"quota-attainment":[{"type":"benchmarks","ranges":[{"threshold":"50%","label":"Below average"},{"threshold":"50","label":"80%: Average range"},{"threshold":"80","label":"100%: Strong performer"}],"source":"benchmarks"}],"ramp-time":[{"type":"benchmarks","ranges":[{"threshold":"2","label":"3 months"},{"threshold":"3","label":"4 months"},{"threshold":"4","label":"6 months"},{"threshold":"6","label":"9 months"}],"source":"benchmarks"}],"tickets-per-customer":[{"type":"benchmarks","ranges":[{"threshold":"5","label":"1.0/month: Typical"}],"source":"benchmarks"}],"first-response-time-frt":[{"type":"benchmarks","ranges":[{"threshold":"4","label":"6 hours | Industry average is 12+ hours |"}],"source":"benchmarks"}],"first-contact-resolution-fcr":[{"type":"benchmarks","ranges":[{"threshold":"60%","label":"Low, investigate agent training or issue complexity"},{"threshold":"60","label":"70%: Below average"},{"threshold":"70%","label":"Industry average (SQM Group 2024 data)"},{"threshold":"70","label":"80%: Good, competitive for SaaS"}],"source":"benchmarks"}],"reopen-rate":[{"type":"benchmarks","ranges":[{"threshold":"5%","label":"Good"},{"threshold":"5","label":"10%: Acceptable"},{"threshold":"10%","label":"Investigate resolution quality"}],"source":"benchmarks"}],"customer-satisfaction-score-csat":[{"type":"benchmarks","ranges":[{"threshold":"70%","label":"Poor, requires immediate attention"},{"threshold":"70","label":"80%: Below average (B2B SaaS average is ~68-78%)"},{"threshold":"80","label":"90%: Good"}],"source":"benchmarks"}],"customer-effort-score-ces":[{"type":"benchmarks","ranges":[{"threshold":"4","label":"High effort, frustrating"},{"threshold":"4","label":"5: Moderate"},{"threshold":"5","label":"6: Good"},{"threshold":"6","label":"Easy, effortless"}],"source":"benchmarks"}],"ticket-escalation-rate":[{"type":"benchmarks","ranges":[{"threshold":"5%","label":"Well-handled at Tier 1"},{"threshold":"5","label":"15%: Normal"},{"threshold":"15%","label":"May indicate training gaps or product issues"}],"source":"benchmarks"}],"tickets-per-agent":[{"type":"benchmarks","ranges":[{"threshold":"300","label":"500/month"},{"threshold":"400","label":"600/month"},{"threshold":"200","label":"400/month"}],"source":"benchmarks"}],"cost-per-ticket":[{"type":"benchmarks","ranges":[{"threshold":"3","label":"8"},{"threshold":"5","label":"15"},{"threshold":"10","label":"25"}],"source":"benchmarks"}],"self-service-rate-ticket-deflection":[{"type":"benchmarks","ranges":[{"threshold":"20%","label":"Low self-service adoption"},{"threshold":"20","label":"40%: Moderate"},{"threshold":"40","label":"60%: Good"},{"threshold":"60%","label":"Excellent"}],"source":"benchmarks"}],"arr-annual-recurring-revenue":[{"type":"formula","value":"MRR × 12","note":"Always derived from MRR, never calculated independently"},{"type":"min","value":0}],"prepaid-credit-balance":[{"type":"min","value":0,"note":"A prepaid balance cannot be negative: consumption beyond it is overage, not a negative balance."}]}},"queryTemplates":{"mrr":{"metric":"MRR (Monthly Recurring Revenue)","fields":["mrr","snapshot_date","subscription_status"],"datasets":["subscription"],"sourceTable":"subscription","grain":"End-of-month snapshot","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND {{subscription_status@subscription}} = 'active') AS mrr","staged":false,"placeholders":["mrr@subscription","snapshot_date@subscription","subscription_status@subscription"]},"arr":{"metric":"ARR (Annual Recurring Revenue)","fields":["mrr","snapshot_date","subscription_status"],"datasets":["subscription"],"sourceTable":"subscription","grain":"End-of-month snapshot","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND {{subscription_status@subscription}} = 'active')) * 12) AS arr","staged":false,"placeholders":["mrr@subscription","snapshot_date@subscription","subscription_status@subscription"]},"arpa":{"metric":"ARPA (Average Revenue Per Account)","fields":["customer_id","customer_status","mrr","snapshot_date","subscription_status"],"datasets":["customer","subscription"],"sourceTable":null,"grain":"End-of-month snapshot","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (CAST(((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND {{subscription_status@subscription}} = 'active')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{customer_status@customer}} = 'active')), 0)) AS arpa","staged":false,"placeholders":["customer_id@customer","customer_status@customer","mrr@subscription","snapshot_date@customer","snapshot_date@subscription","subscription_status@subscription"]},"mrr_growth_rate":{"metric":"MRR Growth Rate","fields":["mrr","snapshot_date","subscription_status"],"datasets":["subscription"],"sourceTable":"subscription","grain":"End-of-month snapshot","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (CAST((((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND {{subscription_status@subscription}} = 'active')) - ((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = ((({{_period_end}} + INTERVAL '1 day') - INTERVAL '1 month') - INTERVAL '1 day') AND {{subscription_status@subscription}} = 'active'))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = ((({{_period_end}} + INTERVAL '1 day') - INTERVAL '1 month') - INTERVAL '1 day') AND {{subscription_status@subscription}} = 'active')), 0)) AS mrr_growth_rate","staged":true,"placeholders":["mrr@subscription","snapshot_date@subscription","subscription_status@subscription"]},"new_mrr":{"metric":"New MRR","fields":["event_date","event_type","mrr_change"],"datasets":["revenue_event"],"sourceTable":"revenue_event","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'new') AS new_mrr","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr_change@revenue_event"]},"expansion_mrr":{"metric":"Expansion MRR","fields":["event_date","event_type","mrr_change"],"datasets":["revenue_event"],"sourceTable":"revenue_event","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'expansion') AS expansion_mrr","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr_change@revenue_event"]},"churned_mrr":{"metric":"Churned MRR","fields":["event_date","event_type","mrr_change"],"datasets":["revenue_event"],"sourceTable":"revenue_event","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'churn')) AS churned_mrr","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr_change@revenue_event"]},"contraction_mrr":{"metric":"Contraction MRR","fields":["event_date","event_type","mrr_change"],"datasets":["revenue_event"],"sourceTable":"revenue_event","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'contraction')) AS contraction_mrr","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr_change@revenue_event"]},"reactivation_mrr":{"metric":"Reactivation MRR","fields":["event_date","event_type","mrr_change"],"datasets":["revenue_event"],"sourceTable":"revenue_event","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'reactivation') AS reactivation_mrr","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr_change@revenue_event"]},"carry_mrr":{"metric":"Carry MRR","fields":["event_date","event_type","mrr","mrr_change","snapshot_date","subscription_status"],"datasets":["revenue_event","subscription"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT ((((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_start}} AND {{subscription_status@subscription}} = 'active')) - ((-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'churn')))) - ((-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'contraction')))) AS carry_mrr","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr@subscription","mrr_change@revenue_event","snapshot_date@subscription","subscription_status@subscription"]},"net_new_mrr":{"metric":"Net New MRR","fields":["event_date","event_type","mrr_change"],"datasets":["revenue_event"],"sourceTable":"revenue_event","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT ((((((SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'new')) + ((SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'expansion'))) + ((SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'reactivation'))) - ((-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'churn')))) - ((-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'contraction')))) AS net_new_mrr","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr_change@revenue_event"]},"total_customers":{"metric":"Total Customers","fields":["customer_id","customer_status","snapshot_date"],"datasets":["customer"],"sourceTable":"customer","grain":"End-of-month snapshot","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{customer_status@customer}} = 'active') AS total_customers","staged":false,"placeholders":["customer_id@customer","customer_status@customer","snapshot_date@customer"]},"new_customers":{"metric":"New Customers","fields":["customer_id","event_date","event_type"],"datasets":["revenue_event"],"sourceTable":"revenue_event","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{customer_id@revenue_event}}) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'new') AS new_customers","staged":false,"placeholders":["customer_id@revenue_event","event_date@revenue_event","event_type@revenue_event"]},"churned_customers":{"metric":"Churned Customers","fields":["customer_id","event_date","event_type"],"datasets":["revenue_event"],"sourceTable":"revenue_event","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{customer_id@revenue_event}}) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'churn') AS churned_customers","staged":false,"placeholders":["customer_id@revenue_event","event_date@revenue_event","event_type@revenue_event"]},"nrr":{"metric":"Net Revenue Retention (NRR)","fields":["customer_id","customer_status","event_date","event_type","mrr","mrr_change","snapshot_date","subscription_status"],"datasets":["customer","revenue_event","subscription"],"sourceTable":null,"grain":"Customer cohort at period start","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (CAST((((((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_start}} AND {{subscription_status@subscription}} = 'active' AND {{customer_id@subscription}} IN (SELECT {{customer_id@customer}} FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_start}} AND {{customer_status@customer}} = 'active'))) + ((SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'expansion' AND {{customer_id@revenue_event}} IN (SELECT {{customer_id@customer}} FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_start}} AND {{customer_status@customer}} = 'active')))) - ((-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'contraction' AND {{customer_id@revenue_event}} IN (SELECT {{customer_id@customer}} FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_start}} AND {{customer_status@customer}} = 'active'))))) - ((-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'churn' AND {{customer_id@revenue_event}} IN (SELECT {{customer_id@customer}} FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_start}} AND {{customer_status@customer}} = 'active'))))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_start}} AND {{subscription_status@subscription}} = 'active' AND {{customer_id@subscription}} IN (SELECT {{customer_id@customer}} FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_start}} AND {{customer_status@customer}} = 'active'))), 0)) AS nrr","staged":true,"placeholders":["customer_id@customer","customer_id@revenue_event","customer_id@subscription","customer_status@customer","event_date@revenue_event","event_type@revenue_event","mrr@subscription","mrr_change@revenue_event","snapshot_date@customer","snapshot_date@subscription","subscription_status@subscription"]},"grr":{"metric":"Gross Revenue Retention (GRR)","fields":["customer_id","customer_status","event_date","event_type","mrr","mrr_change","snapshot_date","subscription_status"],"datasets":["customer","revenue_event","subscription"],"sourceTable":null,"grain":"Customer cohort at period start","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (CAST(((((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_start}} AND {{subscription_status@subscription}} = 'active' AND {{customer_id@subscription}} IN (SELECT {{customer_id@customer}} FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_start}} AND {{customer_status@customer}} = 'active'))) - ((-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'contraction' AND {{customer_id@revenue_event}} IN (SELECT {{customer_id@customer}} FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_start}} AND {{customer_status@customer}} = 'active'))))) - ((-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'churn' AND {{customer_id@revenue_event}} IN (SELECT {{customer_id@customer}} FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_start}} AND {{customer_status@customer}} = 'active'))))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_start}} AND {{subscription_status@subscription}} = 'active' AND {{customer_id@subscription}} IN (SELECT {{customer_id@customer}} FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_start}} AND {{customer_status@customer}} = 'active'))), 0)) AS grr","staged":true,"placeholders":["customer_id@customer","customer_id@revenue_event","customer_id@subscription","customer_status@customer","event_date@revenue_event","event_type@revenue_event","mrr@subscription","mrr_change@revenue_event","snapshot_date@customer","snapshot_date@subscription","subscription_status@subscription"]},"logo_churn_rate":{"metric":"Logo Churn Rate (Customer Churn)","fields":["customer_id","customer_status","event_date","event_type","snapshot_date"],"datasets":["customer","revenue_event"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (CAST(((SELECT COUNT(DISTINCT {{customer_id@revenue_event}}) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'churn')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_start}} AND {{customer_status@customer}} = 'active')), 0)) AS logo_churn_rate","staged":false,"placeholders":["customer_id@customer","customer_id@revenue_event","customer_status@customer","event_date@revenue_event","event_type@revenue_event","snapshot_date@customer"]},"revenue_churn_rate":{"metric":"Revenue Churn Rate","fields":["event_date","event_type","mrr","mrr_change","snapshot_date","subscription_status"],"datasets":["revenue_event","subscription"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (CAST((((-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'churn'))) + ((-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'contraction')))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_start}} AND {{subscription_status@subscription}} = 'active')), 0)) AS revenue_churn_rate","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr@subscription","mrr_change@revenue_event","snapshot_date@subscription","subscription_status@subscription"]},"nps":{"metric":"NPS (Net Promoter Score)","fields":["nps_score","survey_date","survey_type"],"datasets":["survey_response"],"sourceTable":"survey_response","grain":"Per survey response","frequency":"Per response","source":"Survey Tool","parameterizedQuery":"SELECT ((CAST(((SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND ({{survey_type@survey_response}} = 'customer' AND {{nps_score@survey_response}} >= 9)) - (SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND ({{survey_type@survey_response}} = 'customer' AND {{nps_score@survey_response}} <= 6))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND {{survey_type@survey_response}} = 'customer'), 0)) * 100) AS nps","staged":false,"placeholders":["nps_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},"cac":{"metric":"CAC (Customer Acquisition Cost)","fields":["cost","cost_function","customer_id","event_date","event_type"],"datasets":["cost_event","revenue_event"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'gtm') AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{customer_id@revenue_event}}) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'new')), 0)) AS cac","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","customer_id@revenue_event","event_date@cost_event","event_date@revenue_event","event_type@revenue_event"]},"ltv":{"metric":"LTV (Customer Lifetime Value)","fields":["cost","cost_function","customer_id","customer_status","event_date","event_type","mrr","mrr_change","period_start","revenue","snapshot_date","subscription_status"],"datasets":["cost_event","customer","financials","revenue_event","subscription"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (CAST((((CAST(((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND {{subscription_status@subscription}} = 'active')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{customer_status@customer}} = 'active')), 0))) * ((CAST(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}) - (SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'infrastructure')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}), 0)))) AS DOUBLE PRECISION) / NULLIF(((CAST((((-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'churn'))) + ((-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'contraction')))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_start}} AND {{subscription_status@subscription}} = 'active')), 0))), 0)) AS ltv","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","customer_id@customer","customer_status@customer","event_date@cost_event","event_date@revenue_event","event_type@revenue_event","mrr@subscription","mrr_change@revenue_event","period_start@financials","revenue@financials","snapshot_date@customer","snapshot_date@subscription","subscription_status@subscription"]},"ltv_cac_ratio":{"metric":"LTV:CAC Ratio","fields":["cost","cost_function","customer_id","customer_status","event_date","event_type","mrr","mrr_change","period_start","revenue","snapshot_date","subscription_status"],"datasets":["cost_event","customer","financials","revenue_event","subscription"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (CAST(((CAST((((CAST(((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND {{subscription_status@subscription}} = 'active')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{customer_status@customer}} = 'active')), 0))) * ((CAST(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}) - (SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'infrastructure')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}), 0)))) AS DOUBLE PRECISION) / NULLIF(((CAST((((-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'churn'))) + ((-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'contraction')))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_start}} AND {{subscription_status@subscription}} = 'active')), 0))), 0))) AS DOUBLE PRECISION) / NULLIF(((CAST((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'gtm') AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{customer_id@revenue_event}}) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'new')), 0))), 0)) AS ltv_cac_ratio","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","customer_id@customer","customer_id@revenue_event","customer_status@customer","event_date@cost_event","event_date@revenue_event","event_type@revenue_event","mrr@subscription","mrr_change@revenue_event","period_start@financials","revenue@financials","snapshot_date@customer","snapshot_date@subscription","subscription_status@subscription"]},"cac_payback":{"metric":"CAC Payback Period","fields":["cost","cost_function","customer_id","customer_status","event_date","event_type","mrr","period_start","revenue","snapshot_date","subscription_status"],"datasets":["cost_event","customer","financials","revenue_event","subscription"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (CAST(((CAST((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'gtm') AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{customer_id@revenue_event}}) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'new')), 0))) AS DOUBLE PRECISION) / NULLIF((((CAST(((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND {{subscription_status@subscription}} = 'active')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{customer_status@customer}} = 'active')), 0))) * ((CAST(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}) - (SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'infrastructure')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}), 0)))), 0)) AS cac_payback","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","customer_id@customer","customer_id@revenue_event","customer_status@customer","event_date@cost_event","event_date@revenue_event","event_type@revenue_event","mrr@subscription","period_start@financials","revenue@financials","snapshot_date@customer","snapshot_date@subscription","subscription_status@subscription"]},"gross_margin":{"metric":"Gross Margin","fields":["cost","cost_function","event_date","period_start","revenue"],"datasets":["cost_event","financials"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}) - (SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'infrastructure')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}), 0)) AS gross_margin","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","period_start@financials","revenue@financials"]},"rule_of_40":{"metric":"Rule of 40","fields":["ebitda","mrr","period_start","revenue","snapshot_date","subscription_status"],"datasets":["financials","subscription"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT ((CAST((((((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND {{subscription_status@subscription}} = 'active')) * 12)) - ((((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = ((({{_period_end}} + INTERVAL '1 day') - INTERVAL '1 year') - INTERVAL '1 day') AND {{subscription_status@subscription}} = 'active')) * 12))) AS DOUBLE PRECISION) / NULLIF(((((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = ((({{_period_end}} + INTERVAL '1 day') - INTERVAL '1 year') - INTERVAL '1 day') AND {{subscription_status@subscription}} = 'active')) * 12)), 0)) + ((CAST((SELECT COALESCE(SUM({{ebitda@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}})), 0)))) AS rule_of_40","staged":true,"placeholders":["ebitda@financials","mrr@subscription","period_start@financials","revenue@financials","snapshot_date@subscription","subscription_status@subscription"]},"logo_retention_rate":{"metric":"Logo Retention Rate","fields":["customer_id","customer_status","event_date","event_type","snapshot_date"],"datasets":["customer","revenue_event"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (1 - ((CAST(((SELECT COUNT(DISTINCT {{customer_id@revenue_event}}) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'churn')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_start}} AND {{customer_status@customer}} = 'active')), 0)))) AS logo_retention_rate","staged":false,"placeholders":["customer_id@customer","customer_id@revenue_event","customer_status@customer","event_date@revenue_event","event_type@revenue_event","snapshot_date@customer"]},"health_score":{"metric":"Customer Health Score","fields":["composite_score","customer_status","snapshot_date"],"datasets":["customer"],"sourceTable":"customer","grain":"Weekly snapshot","frequency":"Weekly","source":"CS Platform","parameterizedQuery":"SELECT (SELECT AVG({{composite_score@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{customer_status@customer}} = 'active') AS health_score","staged":false,"placeholders":["composite_score@customer","customer_status@customer","snapshot_date@customer"]},"health_score_coverage":{"metric":"Health Score Coverage","fields":["composite_score","customer_id","customer_status","snapshot_date"],"datasets":["customer"],"sourceTable":"customer","grain":"Weekly snapshot","frequency":"Weekly","source":"CS Platform","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{composite_score@customer}} IS NOT NULL) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{customer_status@customer}} = 'active'), 0)) AS health_score_coverage","staged":false,"placeholders":["composite_score@customer","customer_id@customer","customer_status@customer","snapshot_date@customer"]},"at_risk_rate":{"metric":"At-Risk Customer Rate","fields":["composite_score","customer_id","snapshot_date"],"datasets":["customer"],"sourceTable":"customer","grain":"Weekly snapshot","frequency":"Weekly","source":"CS Platform","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{composite_score@customer}} < 40) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{composite_score@customer}} IS NOT NULL), 0)) AS at_risk_rate","staged":false,"placeholders":["composite_score@customer","customer_id@customer","snapshot_date@customer"]},"qbr_completion":{"metric":"Quarterly Business Review (QBR) Completion Rate","fields":["customer_id","qbr_completed","qbr_due","snapshot_date"],"datasets":["customer"],"sourceTable":"customer","grain":"Quarterly snapshot","frequency":"Quarterly","source":"CS Platform","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{qbr_completed@customer}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{qbr_due@customer}} = TRUE), 0)) AS qbr_completion","staged":false,"placeholders":["customer_id@customer","qbr_completed@customer","qbr_due@customer","snapshot_date@customer"]},"executive_sponsor_coverage":{"metric":"Executive Sponsor Coverage","fields":["contact_engaged","contact_role","customer_id","customer_status","snapshot_date"],"datasets":["contact","customer"],"sourceTable":null,"grain":"Weekly snapshot","frequency":"Weekly","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{customer_id@contact}}) FROM {{_table:contact}} WHERE {{snapshot_date@contact}} = {{_period_end}} AND ({{contact_role@contact}} = 'executive_sponsor' AND {{contact_engaged@contact}} = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{customer_status@customer}} = 'active'), 0)) AS executive_sponsor_coverage","staged":false,"placeholders":["contact_engaged@contact","contact_role@contact","customer_id@contact","customer_id@customer","customer_status@customer","snapshot_date@contact","snapshot_date@customer"]},"contact_coverage":{"metric":"Contact Coverage","fields":["contact_engaged","contact_id","customer_id","customer_status","snapshot_date"],"datasets":["contact","customer"],"sourceTable":null,"grain":"Weekly snapshot","frequency":"Weekly","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{contact_id@contact}}) FROM {{_table:contact}} WHERE {{snapshot_date@contact}} = {{_period_end}} AND {{contact_engaged@contact}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{customer_status@customer}} = 'active'), 0)) AS contact_coverage","staged":false,"placeholders":["contact_engaged@contact","contact_id@contact","customer_id@customer","customer_status@customer","snapshot_date@contact","snapshot_date@customer"]},"expansion_rate":{"metric":"Expansion Revenue Rate","fields":["event_date","event_type","mrr","mrr_change","snapshot_date","subscription_status"],"datasets":["revenue_event","subscription"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (CAST(((SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'expansion')) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_start}} AND {{subscription_status@subscription}} = 'active')), 0)) AS expansion_rate","staged":false,"placeholders":["event_date@revenue_event","event_type@revenue_event","mrr@subscription","mrr_change@revenue_event","snapshot_date@subscription","subscription_status@subscription"]},"license_utilization":{"metric":"License Utilization","fields":["license_status","seats_assigned","seats_purchased","snapshot_date"],"datasets":["license"],"sourceTable":"license","grain":"End-of-month snapshot","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{seats_assigned@license}}), 0) FROM {{_table:license}} WHERE {{snapshot_date@license}} = {{_period_end}} AND {{license_status@license}} = 'active') AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{seats_purchased@license}}), 0) FROM {{_table:license}} WHERE {{snapshot_date@license}} = {{_period_end}} AND {{license_status@license}} = 'active'), 0)) AS license_utilization","staged":false,"placeholders":["license_status@license","seats_assigned@license","seats_purchased@license","snapshot_date@license"]},"upsell_rate":{"metric":"Upsell Rate","fields":["amendment_type","customer_id","event_date","snapshot_date","upgrade_eligible"],"datasets":["amendment_event","customer"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{customer_id@amendment_event}}) FROM {{_table:amendment_event}} WHERE {{event_date@amendment_event}} >= {{_period_start}} AND {{event_date@amendment_event}} <= {{_period_end}} AND {{amendment_type@amendment_event}} = 'upgrade') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_start}} AND {{upgrade_eligible@customer}} = TRUE), 0)) AS upsell_rate","staged":false,"placeholders":["amendment_type@amendment_event","customer_id@amendment_event","customer_id@customer","event_date@amendment_event","snapshot_date@customer","upgrade_eligible@customer"]},"cross_sell_rate":{"metric":"Cross-sell Rate","fields":["amendment_type","customer_id","customer_status","event_date","snapshot_date"],"datasets":["amendment_event","customer"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{customer_id@amendment_event}}) FROM {{_table:amendment_event}} WHERE {{event_date@amendment_event}} >= {{_period_start}} AND {{event_date@amendment_event}} <= {{_period_end}} AND {{amendment_type@amendment_event}} = 'cross_sell') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_start}} AND {{customer_status@customer}} = 'active'), 0)) AS cross_sell_rate","staged":false,"placeholders":["amendment_type@amendment_event","customer_id@amendment_event","customer_id@customer","customer_status@customer","event_date@amendment_event","snapshot_date@customer"]},"renewal_rate":{"metric":"Renewal Rate","fields":["contract_end","renewed","snapshot_date","subscription_id"],"datasets":["subscription"],"sourceTable":"subscription","grain":"Monthly aggregate","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{subscription_id@subscription}}) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND ({{renewed@subscription}} = TRUE AND ({{contract_end@subscription}} >= {{_period_start}} AND {{contract_end@subscription}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{subscription_id@subscription}}) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND ({{contract_end@subscription}} >= {{_period_start}} AND {{contract_end@subscription}} <= {{_period_end}})), 0)) AS renewal_rate","staged":false,"placeholders":["contract_end@subscription","renewed@subscription","snapshot_date@subscription","subscription_id@subscription"]},"renewal_forecast_accuracy":{"metric":"Renewal Forecast Accuracy","fields":["contract_end","forecast_renewal_amount","renewal_amount","renewed","snapshot_date"],"datasets":["subscription"],"sourceTable":"subscription","grain":"Monthly aggregate","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (1 - (CAST(ABS(((SELECT COALESCE(SUM({{forecast_renewal_amount@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND ({{contract_end@subscription}} >= {{_period_start}} AND {{contract_end@subscription}} <= {{_period_end}})) - (SELECT COALESCE(SUM({{renewal_amount@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND (({{contract_end@subscription}} >= {{_period_start}} AND {{contract_end@subscription}} <= {{_period_end}}) AND {{renewed@subscription}} = TRUE)))) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{renewal_amount@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND (({{contract_end@subscription}} >= {{_period_start}} AND {{contract_end@subscription}} <= {{_period_end}}) AND {{renewed@subscription}} = TRUE)), 0))) AS renewal_forecast_accuracy","staged":false,"placeholders":["contract_end@subscription","forecast_renewal_amount@subscription","renewal_amount@subscription","renewed@subscription","snapshot_date@subscription"]},"days_to_renewal":{"metric":"Days to Renewal","fields":["contract_end","snapshot_date"],"datasets":["subscription"],"sourceTable":"subscription","grain":"End-of-month snapshot","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (SELECT AVG(({{contract_end@subscription}} - {{snapshot_date@subscription}})) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}}) AS days_to_renewal","staged":false,"placeholders":["contract_end@subscription","snapshot_date@subscription"]},"accounts_per_csm":{"metric":"Accounts per CSM","fields":["csm_id","customer_id","snapshot_date"],"datasets":["customer"],"sourceTable":"customer","grain":"Weekly snapshot","frequency":"Weekly","source":"CS Platform","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}}) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{csm_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}}), 0)) AS accounts_per_csm","staged":false,"placeholders":["csm_id@customer","customer_id@customer","snapshot_date@customer"]},"arr_per_csm":{"metric":"ARR per CSM","fields":["csm_id","mrr","snapshot_date","subscription_status"],"datasets":["customer","subscription"],"sourceTable":null,"grain":"End-of-month snapshot","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (CAST(((((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND {{subscription_status@subscription}} = 'active')) * 12)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{csm_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}}), 0)) AS arr_per_csm","staged":false,"placeholders":["csm_id@customer","mrr@subscription","snapshot_date@customer","snapshot_date@subscription","subscription_status@subscription"]},"uptime":{"metric":"Uptime (Availability)","fields":["downtime_minutes","period_start"],"datasets":["service_metrics"],"sourceTable":"service_metrics","grain":"Per service per interval, aggregate per period","frequency":"Real-time","source":"Monitoring","parameterizedQuery":"SELECT (1 - (CAST((SELECT COALESCE(SUM({{downtime_minutes@service_metrics}}), 0) FROM {{_table:service_metrics}} WHERE {{period_start@service_metrics}} >= {{_period_start}} AND {{period_start@service_metrics}} <= {{_period_end}}) AS DOUBLE PRECISION) / NULLIF((({{_period_end}} - {{_period_start}} + 1) * 1440), 0))) AS uptime","staged":false,"placeholders":["downtime_minutes@service_metrics","period_start@service_metrics"]},"sla_adherence":{"metric":"SLA Adherence","fields":["period_start","service_id","sla_met"],"datasets":["service_metrics"],"sourceTable":"service_metrics","grain":"Per service per interval, aggregate per period","frequency":"Real-time","source":"Monitoring","parameterizedQuery":"SELECT (CAST((SELECT COUNT({{service_id@service_metrics}}) FROM {{_table:service_metrics}} WHERE {{period_start@service_metrics}} >= {{_period_start}} AND {{period_start@service_metrics}} <= {{_period_end}} AND {{sla_met@service_metrics}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{service_id@service_metrics}}) FROM {{_table:service_metrics}} WHERE {{period_start@service_metrics}} >= {{_period_start}} AND {{period_start@service_metrics}} <= {{_period_end}}), 0)) AS sla_adherence","staged":false,"placeholders":["period_start@service_metrics","service_id@service_metrics","sla_met@service_metrics"]},"error_rate":{"metric":"Error Rate","fields":["error_count","period_start","request_count"],"datasets":["service_metrics"],"sourceTable":"service_metrics","grain":"Per service per interval, aggregate daily","frequency":"Daily","source":"Monitoring","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{error_count@service_metrics}}), 0) FROM {{_table:service_metrics}} WHERE {{period_start@service_metrics}} >= {{_period_start}} AND {{period_start@service_metrics}} <= {{_period_end}}) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{request_count@service_metrics}}), 0) FROM {{_table:service_metrics}} WHERE {{period_start@service_metrics}} >= {{_period_start}} AND {{period_start@service_metrics}} <= {{_period_end}}), 0)) AS error_rate","staged":false,"placeholders":["error_count@service_metrics","period_start@service_metrics","request_count@service_metrics"]},"latency_response_time":{"metric":"Latency (Response Time)","fields":["period_start","response_time_ms"],"datasets":["service_metrics"],"sourceTable":"service_metrics","grain":"Per service per interval, aggregate daily","frequency":"Daily","source":"Monitoring","parameterizedQuery":"SELECT (SELECT PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY {{response_time_ms@service_metrics}}) FROM {{_table:service_metrics}} WHERE {{period_start@service_metrics}} >= {{_period_start}} AND {{period_start@service_metrics}} <= {{_period_end}}) AS latency_response_time","staged":false,"placeholders":["period_start@service_metrics","response_time_ms@service_metrics"]},"incident_count":{"metric":"Incident Count","fields":["incident_id","started_at"],"datasets":["incident"],"sourceTable":"incident","grain":"Per event","frequency":"Per incident","source":"Incident Management","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{incident_id@incident}}) FROM {{_table:incident}} WHERE {{started_at@incident}} >= {{_period_start}} AND {{started_at@incident}} < ({{_period_end}} + INTERVAL '1 day')) AS incident_count","staged":false,"placeholders":["incident_id@incident","started_at@incident"]},"mean_time_to_detect_mttd":{"metric":"Mean Time to Detect (MTTD)","fields":["detected_at","started_at"],"datasets":["incident"],"sourceTable":"incident","grain":"Per event","frequency":"Per incident","source":"Incident Management","parameterizedQuery":"SELECT ((SELECT AVG((EXTRACT(EPOCH FROM ({{detected_at@incident}} - {{started_at@incident}})) / 86400.0)) FROM {{_table:incident}} WHERE {{started_at@incident}} >= {{_period_start}} AND {{started_at@incident}} < ({{_period_end}} + INTERVAL '1 day')) * 1440) AS mean_time_to_detect_mttd","staged":false,"placeholders":["detected_at@incident","started_at@incident"]},"mean_time_to_acknowledge_mtta":{"metric":"Mean Time to Acknowledge (MTTA)","fields":["acknowledged_at","detected_at","started_at"],"datasets":["incident"],"sourceTable":"incident","grain":"Per event","frequency":"Per incident","source":"Incident Management","parameterizedQuery":"SELECT ((SELECT AVG((EXTRACT(EPOCH FROM ({{acknowledged_at@incident}} - {{detected_at@incident}})) / 86400.0)) FROM {{_table:incident}} WHERE {{started_at@incident}} >= {{_period_start}} AND {{started_at@incident}} < ({{_period_end}} + INTERVAL '1 day')) * 1440) AS mean_time_to_acknowledge_mtta","staged":false,"placeholders":["acknowledged_at@incident","detected_at@incident","started_at@incident"]},"mttr":{"metric":"Mean Time to Resolve (MTTR)","fields":["resolved_at","started_at"],"datasets":["incident"],"sourceTable":"incident","grain":"Per event","frequency":"Per deploy","source":"Incident Management","parameterizedQuery":"SELECT ((SELECT AVG((EXTRACT(EPOCH FROM ({{resolved_at@incident}} - {{started_at@incident}})) / 86400.0)) FROM {{_table:incident}} WHERE {{started_at@incident}} >= {{_period_start}} AND {{started_at@incident}} < ({{_period_end}} + INTERVAL '1 day')) * 1440) AS mttr","staged":false,"placeholders":["resolved_at@incident","started_at@incident"]},"change_failure_rate":{"metric":"Change Failure Rate","fields":["deploy_date","deployment_id","incident_id"],"datasets":["deployment"],"sourceTable":"deployment","grain":"Per event","frequency":"Per deploy","source":"CI/CD","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{deployment_id@deployment}}) FROM {{_table:deployment}} WHERE {{deploy_date@deployment}} >= {{_period_start}} AND {{deploy_date@deployment}} < ({{_period_end}} + INTERVAL '1 day') AND {{incident_id@deployment}} IS NOT NULL) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{deployment_id@deployment}}) FROM {{_table:deployment}} WHERE {{deploy_date@deployment}} >= {{_period_start}} AND {{deploy_date@deployment}} < ({{_period_end}} + INTERVAL '1 day')), 0)) AS change_failure_rate","staged":false,"placeholders":["deploy_date@deployment","deployment_id@deployment","incident_id@deployment"]},"deployment_frequency":{"metric":"Deployment Frequency","fields":["deploy_date","deployment_id"],"datasets":["deployment"],"sourceTable":"deployment","grain":"Per event","frequency":"Per deploy","source":"CI/CD","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{deployment_id@deployment}}) FROM {{_table:deployment}} WHERE {{deploy_date@deployment}} >= {{_period_start}} AND {{deploy_date@deployment}} < ({{_period_end}} + INTERVAL '1 day')) AS deployment_frequency","staged":false,"placeholders":["deploy_date@deployment","deployment_id@deployment"]},"lead_time_for_changes":{"metric":"Lead Time for Changes","fields":["committed_at","deploy_date"],"datasets":["deployment"],"sourceTable":"deployment","grain":"Per event","frequency":"Per deploy","source":"CI/CD","parameterizedQuery":"SELECT ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (EXTRACT(EPOCH FROM ({{deploy_date@deployment}} - {{committed_at@deployment}})) / 86400.0)) FROM {{_table:deployment}} WHERE {{deploy_date@deployment}} >= {{_period_start}} AND {{deploy_date@deployment}} < ({{_period_end}} + INTERVAL '1 day')) * 24) AS lead_time_for_changes","staged":false,"placeholders":["committed_at@deployment","deploy_date@deployment"]},"mean_time_to_recovery_mttr":{"metric":"Mean Time to Recovery (MTTR)","fields":["recovery_time","started_at"],"datasets":["incident"],"sourceTable":"incident","grain":"Per event","frequency":"Per deploy","source":"Incident Management","parameterizedQuery":"SELECT (SELECT AVG({{recovery_time@incident}}) FROM {{_table:incident}} WHERE {{started_at@incident}} >= {{_period_start}} AND {{started_at@incident}} < ({{_period_end}} + INTERVAL '1 day')) AS mean_time_to_recovery_mttr","staged":false,"placeholders":["recovery_time@incident","started_at@incident"]},"infrastructure_utilization":{"metric":"Infrastructure Utilization","fields":["period_start","utilization"],"datasets":["service_metrics"],"sourceTable":"service_metrics","grain":"Per service per interval, aggregate daily","frequency":"Daily","source":"Cloud Provider","parameterizedQuery":"SELECT (SELECT AVG({{utilization@service_metrics}}) FROM {{_table:service_metrics}} WHERE {{period_start@service_metrics}} >= {{_period_start}} AND {{period_start@service_metrics}} <= {{_period_end}}) AS infrastructure_utilization","staged":false,"placeholders":["period_start@service_metrics","utilization@service_metrics"]},"infrastructure_cost_per_customer":{"metric":"Infrastructure Cost per Customer","fields":["cost","cost_function","customer_id","customer_status","event_date","snapshot_date"],"datasets":["cost_event","customer"],"sourceTable":null,"grain":"Per service per interval, aggregate daily","frequency":"Daily","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'infrastructure') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{customer_status@customer}} = 'active'), 0)) AS infrastructure_cost_per_customer","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","customer_id@customer","customer_status@customer","event_date@cost_event","snapshot_date@customer"]},"headroom":{"metric":"Headroom","fields":["period_start","utilization"],"datasets":["service_metrics"],"sourceTable":"service_metrics","grain":"Per service per interval, aggregate daily","frequency":"Daily","source":"Cloud Provider","parameterizedQuery":"SELECT (1 - ((SELECT AVG({{utilization@service_metrics}}) FROM {{_table:service_metrics}} WHERE {{period_start@service_metrics}} >= {{_period_start}} AND {{period_start@service_metrics}} <= {{_period_end}}))) AS headroom","staged":false,"placeholders":["period_start@service_metrics","utilization@service_metrics"]},"vulnerability_count":{"metric":"Vulnerability Count","fields":["snapshot_date","vulnerability_id","vulnerability_status"],"datasets":["vulnerability"],"sourceTable":"vulnerability","grain":"Daily snapshot","frequency":"Daily","source":"Security Scanner","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{vulnerability_id@vulnerability}}) FROM {{_table:vulnerability}} WHERE {{snapshot_date@vulnerability}} = {{_period_end}} AND {{vulnerability_status@vulnerability}} = 'open') AS vulnerability_count","staged":false,"placeholders":["snapshot_date@vulnerability","vulnerability_id@vulnerability","vulnerability_status@vulnerability"]},"time_to_patch":{"metric":"Time to Patch","fields":["discovered_at","patched_at","snapshot_date"],"datasets":["vulnerability"],"sourceTable":"vulnerability","grain":"Per event","frequency":"Per incident","source":"Security Scanner","parameterizedQuery":"SELECT ((SELECT AVG((EXTRACT(EPOCH FROM ({{patched_at@vulnerability}} - {{discovered_at@vulnerability}})) / 86400.0)) FROM {{_table:vulnerability}} WHERE {{snapshot_date@vulnerability}} = {{_period_end}} AND ({{patched_at@vulnerability}} >= {{_period_start}} AND {{patched_at@vulnerability}} < ({{_period_end}} + INTERVAL '1 day'))) * 24) AS time_to_patch","staged":false,"placeholders":["discovered_at@vulnerability","patched_at@vulnerability","snapshot_date@vulnerability"]},"security_incident_count":{"metric":"Security Incident Count","fields":["incident_id","incident_type","started_at"],"datasets":["incident"],"sourceTable":"incident","grain":"Per event","frequency":"Per incident","source":"Incident Management","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{incident_id@incident}}) FROM {{_table:incident}} WHERE {{started_at@incident}} >= {{_period_start}} AND {{started_at@incident}} < ({{_period_end}} + INTERVAL '1 day') AND {{incident_type@incident}} = 'security') AS security_incident_count","staged":false,"placeholders":["incident_id@incident","incident_type@incident","started_at@incident"]},"revenue_gaap":{"metric":"Revenue (GAAP)","fields":["period_start","revenue"],"datasets":["financials"],"sourceTable":"financials","grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}) AS revenue_gaap","staged":false,"placeholders":["period_start@financials","revenue@financials"]},"bookings":{"metric":"Bookings","fields":["contract_event_type","event_date","tcv"],"datasets":["contract_event"],"sourceTable":"contract_event","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{tcv@contract_event}}), 0) FROM {{_table:contract_event}} WHERE {{event_date@contract_event}} >= {{_period_start}} AND {{event_date@contract_event}} <= {{_period_end}} AND {{contract_event_type@contract_event}} IN ('new_contract', 'renewal', 'amendment')) AS bookings","staged":false,"placeholders":["contract_event_type@contract_event","event_date@contract_event","tcv@contract_event"]},"billings":{"metric":"Billings","fields":["invoice_amount","invoice_date","snapshot_date"],"datasets":["invoice"],"sourceTable":"invoice","grain":"Per event","frequency":"Per transaction","source":"Billing","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{invoice_amount@invoice}}), 0) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}} AND ({{invoice_date@invoice}} >= {{_period_start}} AND {{invoice_date@invoice}} <= {{_period_end}})) AS billings","staged":false,"placeholders":["invoice_amount@invoice","invoice_date@invoice","snapshot_date@invoice"]},"consumption_revenue":{"metric":"Consumption Revenue","fields":["credit_amount","credit_event_type","event_date"],"datasets":["credit_event"],"sourceTable":"credit_event","grain":"Per credit event, aggregate monthly","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (-(SELECT COALESCE(SUM({{credit_amount@credit_event}}), 0) FROM {{_table:credit_event}} WHERE {{event_date@credit_event}} >= {{_period_start}} AND {{event_date@credit_event}} <= {{_period_end}} AND {{credit_event_type@credit_event}} = 'consumption')) AS consumption_revenue","staged":false,"placeholders":["credit_amount@credit_event","credit_event_type@credit_event","event_date@credit_event"]},"usage_run_rate":{"metric":"Usage Run-Rate","fields":["consumption_basis","credit_amount","credit_event_type","event_date"],"datasets":["credit_event"],"sourceTable":"credit_event","grain":"On-demand consumption in the trailing 3 months ending at period end, annualised","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT ((-(SELECT COALESCE(SUM({{credit_amount@credit_event}}), 0) FROM {{_table:credit_event}} WHERE {{event_date@credit_event}} >= (({{_period_end}} + INTERVAL '1 day') - INTERVAL '3 month') AND {{event_date@credit_event}} <= {{_period_end}} AND ({{credit_event_type@credit_event}} = 'consumption' AND {{consumption_basis@credit_event}} = 'on_demand'))) * 4) AS usage_run_rate","staged":false,"placeholders":["consumption_basis@credit_event","credit_amount@credit_event","credit_event_type@credit_event","event_date@credit_event"]},"prepaid_credit_balance":{"metric":"Prepaid Credit Balance","fields":["consumption_basis","credit_amount","credit_event_type","event_date"],"datasets":["credit_event"],"sourceTable":"credit_event","grain":"Cumulative balance at period end","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{credit_amount@credit_event}}), 0) FROM {{_table:credit_event}} WHERE {{event_date@credit_event}} <= {{_period_end}} AND ({{credit_event_type@credit_event}} IN ('purchase', 'expiry', 'adjustment') OR {{consumption_basis@credit_event}} = 'committed')) AS prepaid_credit_balance","staged":false,"placeholders":["consumption_basis@credit_event","credit_amount@credit_event","credit_event_type@credit_event","event_date@credit_event"]},"arr_including_usage_run_rate":{"metric":"ARR Including Usage Run-Rate","fields":["consumption_basis","credit_amount","credit_event_type","event_date","mrr","snapshot_date","subscription_status"],"datasets":["credit_event","subscription"],"sourceTable":null,"grain":"On-demand consumption in the trailing 3 months ending at period end, annualised","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (((((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND {{subscription_status@subscription}} = 'active')) * 12)) + (((-(SELECT COALESCE(SUM({{credit_amount@credit_event}}), 0) FROM {{_table:credit_event}} WHERE {{event_date@credit_event}} >= (({{_period_end}} + INTERVAL '1 day') - INTERVAL '3 month') AND {{event_date@credit_event}} <= {{_period_end}} AND ({{credit_event_type@credit_event}} = 'consumption' AND {{consumption_basis@credit_event}} = 'on_demand'))) * 4))) AS arr_including_usage_run_rate","staged":false,"placeholders":["consumption_basis@credit_event","credit_amount@credit_event","credit_event_type@credit_event","event_date@credit_event","mrr@subscription","snapshot_date@subscription","subscription_status@subscription"]},"credit_breakage":{"metric":"Credit Breakage","fields":["credit_amount","credit_event_type","event_date"],"datasets":["credit_event"],"sourceTable":"credit_event","grain":"Per credit event, aggregate monthly","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (-(SELECT COALESCE(SUM({{credit_amount@credit_event}}), 0) FROM {{_table:credit_event}} WHERE {{event_date@credit_event}} >= {{_period_start}} AND {{event_date@credit_event}} <= {{_period_end}} AND {{credit_event_type@credit_event}} = 'expiry')) AS credit_breakage","staged":false,"placeholders":["credit_amount@credit_event","credit_event_type@credit_event","event_date@credit_event"]},"consumption_revenue_growth_rate":{"metric":"Consumption Revenue Growth Rate","fields":["credit_amount","credit_event_type","event_date"],"datasets":["credit_event"],"sourceTable":"credit_event","grain":"Per credit event, aggregate monthly","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (CAST((((-(SELECT COALESCE(SUM({{credit_amount@credit_event}}), 0) FROM {{_table:credit_event}} WHERE {{event_date@credit_event}} >= {{_period_start}} AND {{event_date@credit_event}} <= {{_period_end}} AND {{credit_event_type@credit_event}} = 'consumption'))) - ((-(SELECT COALESCE(SUM({{credit_amount@credit_event}}), 0) FROM {{_table:credit_event}} WHERE {{event_date@credit_event}} >= ({{_period_start}} - INTERVAL '1 month') AND {{event_date@credit_event}} <= ((({{_period_end}} + INTERVAL '1 day') - INTERVAL '1 month') - INTERVAL '1 day') AND {{credit_event_type@credit_event}} = 'consumption')))) AS DOUBLE PRECISION) / NULLIF(((-(SELECT COALESCE(SUM({{credit_amount@credit_event}}), 0) FROM {{_table:credit_event}} WHERE {{event_date@credit_event}} >= ({{_period_start}} - INTERVAL '1 month') AND {{event_date@credit_event}} <= ((({{_period_end}} + INTERVAL '1 day') - INTERVAL '1 month') - INTERVAL '1 day') AND {{credit_event_type@credit_event}} = 'consumption'))), 0)) AS consumption_revenue_growth_rate","staged":true,"placeholders":["credit_amount@credit_event","credit_event_type@credit_event","event_date@credit_event"]},"consumption_net_revenue_retention":{"metric":"Consumption Net Revenue Retention","fields":["credit_amount","credit_event_type","customer_id","customer_status","event_date","snapshot_date"],"datasets":["credit_event","customer"],"sourceTable":null,"grain":"Customer cohort at period start","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (CAST(((-(SELECT COALESCE(SUM({{credit_amount@credit_event}}), 0) FROM {{_table:credit_event}} WHERE {{event_date@credit_event}} >= {{_period_start}} AND {{event_date@credit_event}} <= {{_period_end}} AND {{credit_event_type@credit_event}} = 'consumption' AND {{customer_id@credit_event}} IN (SELECT {{customer_id@customer}} FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_start}} AND {{customer_status@customer}} = 'active')))) AS DOUBLE PRECISION) / NULLIF(((-(SELECT COALESCE(SUM({{credit_amount@credit_event}}), 0) FROM {{_table:credit_event}} WHERE {{event_date@credit_event}} >= ({{_period_start}} - INTERVAL '12 month') AND {{event_date@credit_event}} <= ((({{_period_end}} + INTERVAL '1 day') - INTERVAL '12 month') - INTERVAL '1 day') AND {{credit_event_type@credit_event}} = 'consumption' AND {{customer_id@credit_event}} IN (SELECT {{customer_id@customer}} FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_start}} AND {{customer_status@customer}} = 'active')))), 0)) AS consumption_net_revenue_retention","staged":true,"placeholders":["credit_amount@credit_event","credit_event_type@credit_event","customer_id@credit_event","customer_id@customer","customer_status@customer","event_date@credit_event","snapshot_date@customer"]},"revenue_per_employee":{"metric":"Revenue per Employee","fields":["employee_id","employee_status","mrr","snapshot_date","subscription_status"],"datasets":["employee","subscription"],"sourceTable":null,"grain":"End-of-month snapshot","frequency":"Monthly","source":"HRIS","parameterizedQuery":"SELECT (CAST(((((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND {{subscription_status@subscription}} = 'active')) * 12)) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND {{employee_status@employee}} = 'active')), 0)) AS revenue_per_employee","staged":false,"placeholders":["employee_id@employee","employee_status@employee","mrr@subscription","snapshot_date@employee","snapshot_date@subscription","subscription_status@subscription"]},"operating_margin":{"metric":"Operating Margin (EBIT Margin)","fields":["cost","cost_function","event_date","period_start","revenue"],"datasets":["cost_event","financials"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (((CAST(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}) - (SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'infrastructure')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}), 0))) - ((CAST((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} <> 'infrastructure') AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}})), 0)))) AS operating_margin","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","period_start@financials","revenue@financials"]},"ebitda_margin":{"metric":"EBITDA Margin","fields":["ebitda","period_start","revenue"],"datasets":["financials"],"sourceTable":"financials","grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{ebitda@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}})), 0)) AS ebitda_margin","staged":false,"placeholders":["ebitda@financials","period_start@financials","revenue@financials"]},"net_income_margin":{"metric":"Net Income Margin","fields":["net_income","period_start","revenue"],"datasets":["financials"],"sourceTable":"financials","grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{net_income@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}})), 0)) AS net_income_margin","staged":false,"placeholders":["net_income@financials","period_start@financials","revenue@financials"]},"burn_rate":{"metric":"Cash Burn Rate","fields":["cash_balance","snapshot_date"],"datasets":["balance_sheet"],"sourceTable":"balance_sheet","grain":"End-of-month snapshot","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST(((SELECT COALESCE(SUM({{cash_balance@balance_sheet}}), 0) FROM {{_table:balance_sheet}} WHERE {{snapshot_date@balance_sheet}} = {{_period_start}}) - (SELECT COALESCE(SUM({{cash_balance@balance_sheet}}), 0) FROM {{_table:balance_sheet}} WHERE {{snapshot_date@balance_sheet}} = {{_period_end}})) AS DOUBLE PRECISION) / NULLIF((CAST(({{_period_end}} - {{_period_start}} + 1) AS DOUBLE PRECISION) / 30.4375), 0)) AS burn_rate","staged":false,"placeholders":["cash_balance@balance_sheet","snapshot_date@balance_sheet"]},"cash_runway":{"metric":"Cash Runway","fields":["cash_balance","snapshot_date"],"datasets":["balance_sheet"],"sourceTable":"balance_sheet","grain":"End-of-month snapshot","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{cash_balance@balance_sheet}}), 0) FROM {{_table:balance_sheet}} WHERE {{snapshot_date@balance_sheet}} = {{_period_end}}) AS DOUBLE PRECISION) / NULLIF(((CAST(((SELECT COALESCE(SUM({{cash_balance@balance_sheet}}), 0) FROM {{_table:balance_sheet}} WHERE {{snapshot_date@balance_sheet}} = {{_period_start}}) - (SELECT COALESCE(SUM({{cash_balance@balance_sheet}}), 0) FROM {{_table:balance_sheet}} WHERE {{snapshot_date@balance_sheet}} = {{_period_end}})) AS DOUBLE PRECISION) / NULLIF((CAST(({{_period_end}} - {{_period_start}} + 1) AS DOUBLE PRECISION) / 30.4375), 0))), 0)) AS cash_runway","staged":false,"placeholders":["cash_balance@balance_sheet","snapshot_date@balance_sheet"]},"fcf":{"metric":"Free Cash Flow (FCF)","fields":["capital_expenditures","operating_cash_flow","period_start"],"datasets":["financials"],"sourceTable":"financials","grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT ((SELECT COALESCE(SUM({{operating_cash_flow@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}) - (SELECT COALESCE(SUM({{capital_expenditures@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}})) AS fcf","staged":false,"placeholders":["capital_expenditures@financials","operating_cash_flow@financials","period_start@financials"]},"free_cash_flow_margin":{"metric":"Free Cash Flow Margin","fields":["capital_expenditures","operating_cash_flow","period_start","revenue"],"datasets":["financials"],"sourceTable":"financials","grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((((SELECT COALESCE(SUM({{operating_cash_flow@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}) - (SELECT COALESCE(SUM({{capital_expenditures@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}})), 0)) AS free_cash_flow_margin","staged":false,"placeholders":["capital_expenditures@financials","operating_cash_flow@financials","period_start@financials","revenue@financials"]},"magic_number":{"metric":"Magic Number","fields":["cost","cost_function","event_date","mrr","snapshot_date","subscription_status"],"datasets":["cost_event","subscription"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((((((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND {{subscription_status@subscription}} = 'active')) * 12)) - ((((SELECT COALESCE(SUM({{mrr@subscription}}), 0) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = ((({{_period_end}} + INTERVAL '1 day') - INTERVAL '3 month') - INTERVAL '1 day') AND {{subscription_status@subscription}} = 'active')) * 12))) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= ((((({{_period_end}} + INTERVAL '1 day') - INTERVAL '3 month') - INTERVAL '1 day') + INTERVAL '1 day') - INTERVAL '3 month') AND {{event_date@cost_event}} <= ((({{_period_end}} + INTERVAL '1 day') - INTERVAL '3 month') - INTERVAL '1 day') AND {{cost_function@cost_event}} = 'gtm'), 0)) AS magic_number","staged":true,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","mrr@subscription","snapshot_date@subscription","subscription_status@subscription"]},"burn_multiple":{"metric":"Burn Multiple","fields":["cash_balance","event_date","event_type","mrr_change","snapshot_date"],"datasets":["balance_sheet","revenue_event"],"sourceTable":null,"grain":"End-of-month snapshot","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (CAST(((CAST(((SELECT COALESCE(SUM({{cash_balance@balance_sheet}}), 0) FROM {{_table:balance_sheet}} WHERE {{snapshot_date@balance_sheet}} = {{_period_start}}) - (SELECT COALESCE(SUM({{cash_balance@balance_sheet}}), 0) FROM {{_table:balance_sheet}} WHERE {{snapshot_date@balance_sheet}} = {{_period_end}})) AS DOUBLE PRECISION) / NULLIF((CAST(({{_period_end}} - {{_period_start}} + 1) AS DOUBLE PRECISION) / 30.4375), 0))) AS DOUBLE PRECISION) / NULLIF(((((((((SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'new')) + ((SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'expansion'))) + ((SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'reactivation'))) - ((-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'churn')))) - ((-(SELECT COALESCE(SUM({{mrr_change@revenue_event}}), 0) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'contraction'))))) * 12), 0)) AS burn_multiple","staged":false,"placeholders":["cash_balance@balance_sheet","event_date@revenue_event","event_type@revenue_event","mrr_change@revenue_event","snapshot_date@balance_sheet"]},"opex_ratio":{"metric":"Opex Ratio","fields":["cost","cost_function","event_date","period_start","revenue"],"datasets":["cost_event","financials"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} <> 'infrastructure') AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}})), 0)) AS opex_ratio","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","period_start@financials","revenue@financials"]},"sm_as_of_revenue":{"metric":"S&M as % of Revenue","fields":["cost","cost_function","event_date","period_start","revenue"],"datasets":["cost_event","financials"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'gtm') AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}})), 0)) AS sm_as_of_revenue","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","period_start@financials","revenue@financials"]},"rd_as_of_revenue":{"metric":"R&D as % of Revenue","fields":["cost","cost_function","event_date","period_start","revenue"],"datasets":["cost_event","financials"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'research_development') AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}})), 0)) AS rd_as_of_revenue","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","period_start@financials","revenue@financials"]},"ga_as_of_revenue":{"metric":"G&A as % of Revenue","fields":["cost","cost_function","event_date","period_start","revenue"],"datasets":["cost_event","financials"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'general_administrative') AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}})), 0)) AS ga_as_of_revenue","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","period_start@financials","revenue@financials"]},"collection_rate":{"metric":"Collection Rate","fields":["invoice_amount","invoice_date","payment_date","snapshot_date"],"datasets":["invoice"],"sourceTable":"invoice","grain":"Per event","frequency":"Per transaction","source":"Billing","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{invoice_amount@invoice}}), 0) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}} AND (({{invoice_date@invoice}} >= {{_period_start}} AND {{invoice_date@invoice}} <= {{_period_end}}) AND {{payment_date@invoice}} IS NOT NULL)) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{invoice_amount@invoice}}), 0) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}} AND ({{invoice_date@invoice}} >= {{_period_start}} AND {{invoice_date@invoice}} <= {{_period_end}}))), 0)) AS collection_rate","staged":false,"placeholders":["invoice_amount@invoice","invoice_date@invoice","payment_date@invoice","snapshot_date@invoice"]},"bad_debt_rate":{"metric":"Bad Debt Rate","fields":["bad_debt_expense","period_start","revenue"],"datasets":["financials"],"sourceTable":"financials","grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{bad_debt_expense@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}})), 0)) AS bad_debt_rate","staged":false,"placeholders":["bad_debt_expense@financials","period_start@financials","revenue@financials"]},"visitors":{"metric":"Visitors","fields":["period_start","unique_visitors"],"datasets":["web_traffic"],"sourceTable":"web_traffic","grain":"Daily aggregate","frequency":"Daily","source":"Web Analytics","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{unique_visitors@web_traffic}}), 0) FROM {{_table:web_traffic}} WHERE {{period_start@web_traffic}} >= {{_period_start}} AND {{period_start@web_traffic}} <= {{_period_end}}) AS visitors","staged":false,"placeholders":["period_start@web_traffic","unique_visitors@web_traffic"]},"visitor_to_lead_rate":{"metric":"Visitor-to-Lead Rate","fields":["lead_created_date","lead_id","period_start","snapshot_date","unique_visitors"],"datasets":["lead","web_traffic"],"sourceTable":null,"grain":"Daily aggregate","frequency":"Daily","source":"CRM","parameterizedQuery":"SELECT (CAST(((SELECT COUNT(DISTINCT {{lead_id@lead}}) FROM {{_table:lead}} WHERE {{snapshot_date@lead}} = {{_period_end}} AND ({{lead_created_date@lead}} >= {{_period_start}} AND {{lead_created_date@lead}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{unique_visitors@web_traffic}}), 0) FROM {{_table:web_traffic}} WHERE {{period_start@web_traffic}} >= {{_period_start}} AND {{period_start@web_traffic}} <= {{_period_end}})), 0)) AS visitor_to_lead_rate","staged":false,"placeholders":["lead_created_date@lead","lead_id@lead","period_start@web_traffic","snapshot_date@lead","unique_visitors@web_traffic"]},"leads":{"metric":"Leads","fields":["lead_created_date","lead_id","snapshot_date"],"datasets":["lead"],"sourceTable":"lead","grain":"Per lead stage date, aggregate daily","frequency":"Daily","source":"CRM","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{lead_id@lead}}) FROM {{_table:lead}} WHERE {{snapshot_date@lead}} = {{_period_end}} AND ({{lead_created_date@lead}} >= {{_period_start}} AND {{lead_created_date@lead}} <= {{_period_end}})) AS leads","staged":false,"placeholders":["lead_created_date@lead","lead_id@lead","snapshot_date@lead"]},"mqls":{"metric":"Marketing Qualified Leads (MQLs)","fields":["lead_id","mql_date","snapshot_date"],"datasets":["lead"],"sourceTable":"lead","grain":"Per lead stage date, aggregate daily","frequency":"Daily","source":"Marketing Automation","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{lead_id@lead}}) FROM {{_table:lead}} WHERE {{snapshot_date@lead}} = {{_period_end}} AND ({{mql_date@lead}} >= {{_period_start}} AND {{mql_date@lead}} <= {{_period_end}})) AS mqls","staged":false,"placeholders":["lead_id@lead","mql_date@lead","snapshot_date@lead"]},"lead_to_mql_rate":{"metric":"Lead-to-MQL Rate","fields":["lead_created_date","lead_id","mql_date","snapshot_date"],"datasets":["lead"],"sourceTable":"lead","grain":"Per lead stage date, aggregate daily","frequency":"Daily","source":"Marketing Automation","parameterizedQuery":"SELECT (CAST(((SELECT COUNT(DISTINCT {{lead_id@lead}}) FROM {{_table:lead}} WHERE {{snapshot_date@lead}} = {{_period_end}} AND ({{mql_date@lead}} >= {{_period_start}} AND {{mql_date@lead}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{lead_id@lead}}) FROM {{_table:lead}} WHERE {{snapshot_date@lead}} = {{_period_end}} AND ({{lead_created_date@lead}} >= {{_period_start}} AND {{lead_created_date@lead}} <= {{_period_end}}))), 0)) AS lead_to_mql_rate","staged":false,"placeholders":["lead_created_date@lead","lead_id@lead","mql_date@lead","snapshot_date@lead"]},"sqls":{"metric":"Sales Qualified Leads (SQLs)","fields":["lead_id","snapshot_date","sql_date"],"datasets":["lead"],"sourceTable":"lead","grain":"Per lead stage date, aggregate daily","frequency":"Daily","source":"CRM","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{lead_id@lead}}) FROM {{_table:lead}} WHERE {{snapshot_date@lead}} = {{_period_end}} AND ({{sql_date@lead}} >= {{_period_start}} AND {{sql_date@lead}} <= {{_period_end}})) AS sqls","staged":false,"placeholders":["lead_id@lead","snapshot_date@lead","sql_date@lead"]},"mql_to_sql_rate":{"metric":"MQL-to-SQL Rate","fields":["lead_id","mql_date","snapshot_date","sql_date"],"datasets":["lead"],"sourceTable":"lead","grain":"Per lead stage date, aggregate daily","frequency":"Daily","source":"CRM","parameterizedQuery":"SELECT (CAST(((SELECT COUNT(DISTINCT {{lead_id@lead}}) FROM {{_table:lead}} WHERE {{snapshot_date@lead}} = {{_period_end}} AND ({{sql_date@lead}} >= {{_period_start}} AND {{sql_date@lead}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{lead_id@lead}}) FROM {{_table:lead}} WHERE {{snapshot_date@lead}} = {{_period_end}} AND ({{mql_date@lead}} >= {{_period_start}} AND {{mql_date@lead}} <= {{_period_end}}))), 0)) AS mql_to_sql_rate","staged":false,"placeholders":["lead_id@lead","mql_date@lead","snapshot_date@lead","sql_date@lead"]},"sql_to_opportunity_rate":{"metric":"SQL-to-Opportunity Rate","fields":["lead_id","opportunity_created_date","opportunity_id","snapshot_date","sql_date"],"datasets":["lead","opportunity"],"sourceTable":null,"grain":"Per lead stage date, aggregate daily","frequency":"Daily","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{opportunity_created_date@opportunity}} >= {{_period_start}} AND {{opportunity_created_date@opportunity}} <= {{_period_end}})) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{lead_id@lead}}) FROM {{_table:lead}} WHERE {{snapshot_date@lead}} = {{_period_end}} AND ({{sql_date@lead}} >= {{_period_start}} AND {{sql_date@lead}} <= {{_period_end}}))), 0)) AS sql_to_opportunity_rate","staged":false,"placeholders":["lead_id@lead","opportunity_created_date@opportunity","opportunity_id@opportunity","snapshot_date@lead","snapshot_date@opportunity","sql_date@lead"]},"lvr":{"metric":"Lead Velocity Rate (LVR)","fields":["lead_id","mql_date","snapshot_date"],"datasets":["lead"],"sourceTable":"lead","grain":"Monthly aggregate","frequency":"Monthly","source":"Marketing Automation","parameterizedQuery":"SELECT (CAST((((SELECT COUNT(DISTINCT {{lead_id@lead}}) FROM {{_table:lead}} WHERE {{snapshot_date@lead}} = {{_period_end}} AND ({{mql_date@lead}} >= {{_period_start}} AND {{mql_date@lead}} <= {{_period_end}}))) - ((SELECT COUNT(DISTINCT {{lead_id@lead}}) FROM {{_table:lead}} WHERE {{snapshot_date@lead}} = ((({{_period_end}} + INTERVAL '1 day') - INTERVAL '1 month') - INTERVAL '1 day') AND ({{mql_date@lead}} >= ({{_period_start}} - INTERVAL '1 month') AND {{mql_date@lead}} <= ((({{_period_end}} + INTERVAL '1 day') - INTERVAL '1 month') - INTERVAL '1 day'))))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{lead_id@lead}}) FROM {{_table:lead}} WHERE {{snapshot_date@lead}} = ((({{_period_end}} + INTERVAL '1 day') - INTERVAL '1 month') - INTERVAL '1 day') AND ({{mql_date@lead}} >= ({{_period_start}} - INTERVAL '1 month') AND {{mql_date@lead}} <= ((({{_period_end}} + INTERVAL '1 day') - INTERVAL '1 month') - INTERVAL '1 day')))), 0)) AS lvr","staged":true,"placeholders":["lead_id@lead","mql_date@lead","snapshot_date@lead"]},"marketing_cac":{"metric":"Marketing CAC","fields":["cost","cost_centre","cost_function","customer_id","event_date","event_type"],"datasets":["cost_event","revenue_event"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND ({{cost_function@cost_event}} = 'gtm' AND {{cost_centre@cost_event}} = 'marketing')) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{customer_id@revenue_event}}) FROM {{_table:revenue_event}} WHERE {{event_date@revenue_event}} >= {{_period_start}} AND {{event_date@revenue_event}} <= {{_period_end}} AND {{event_type@revenue_event}} = 'new'), 0)) AS marketing_cac","staged":false,"placeholders":["cost@cost_event","cost_centre@cost_event","cost_function@cost_event","customer_id@revenue_event","event_date@cost_event","event_date@revenue_event","event_type@revenue_event"]},"cac_by_channel":{"metric":"CAC by Channel","fields":["ad_spend","channel","close_date","opportunity_id","opportunity_stage","period_start","snapshot_date"],"datasets":["campaign","opportunity"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"CRM","parameterizedQuery":"SELECT _d.channel AS channel, (CAST((SELECT COALESCE(SUM({{ad_spend@campaign}}), 0) FROM {{_table:campaign}} WHERE {{period_start@campaign}} >= {{_period_start}} AND {{period_start@campaign}} <= {{_period_end}} AND {{channel@campaign}} = _d.channel) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{opportunity_stage@opportunity}} = 'closed_won' AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}})) AND {{channel@opportunity}} = _d.channel), 0)) AS cac_by_channel\nFROM (SELECT 'paid_ads' AS channel UNION ALL SELECT 'organic_search' AS channel UNION ALL SELECT 'email' AS channel UNION ALL SELECT 'events' AS channel UNION ALL SELECT 'content' AS channel UNION ALL SELECT 'referral' AS channel UNION ALL SELECT 'marketplace' AS channel UNION ALL SELECT 'direct' AS channel UNION ALL SELECT 'other' AS channel) _d","staged":false,"placeholders":["ad_spend@campaign","channel@campaign","channel@opportunity","close_date@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","period_start@campaign","snapshot_date@opportunity"],"breakdown":{"field":"channel"}},"cpl":{"metric":"Cost per Lead (CPL)","fields":["cost","cost_centre","cost_function","event_date","lead_created_date","lead_id","snapshot_date"],"datasets":["cost_event","lead"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND ({{cost_function@cost_event}} = 'gtm' AND {{cost_centre@cost_event}} = 'marketing')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{lead_id@lead}}) FROM {{_table:lead}} WHERE {{snapshot_date@lead}} = {{_period_end}} AND ({{lead_created_date@lead}} >= {{_period_start}} AND {{lead_created_date@lead}} <= {{_period_end}}))), 0)) AS cpl","staged":false,"placeholders":["cost@cost_event","cost_centre@cost_event","cost_function@cost_event","event_date@cost_event","lead_created_date@lead","lead_id@lead","snapshot_date@lead"]},"cost_per_mql":{"metric":"Cost per MQL","fields":["cost","cost_centre","cost_function","event_date","lead_id","mql_date","snapshot_date"],"datasets":["cost_event","lead"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND ({{cost_function@cost_event}} = 'gtm' AND {{cost_centre@cost_event}} = 'marketing')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{lead_id@lead}}) FROM {{_table:lead}} WHERE {{snapshot_date@lead}} = {{_period_end}} AND ({{mql_date@lead}} >= {{_period_start}} AND {{mql_date@lead}} <= {{_period_end}}))), 0)) AS cost_per_mql","staged":false,"placeholders":["cost@cost_event","cost_centre@cost_event","cost_function@cost_event","event_date@cost_event","lead_id@lead","mql_date@lead","snapshot_date@lead"]},"marketing_sourced_pipeline":{"metric":"Marketing Sourced Pipeline","fields":["marketing_source","opportunity_amount","opportunity_stage","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Daily snapshot","frequency":"Daily","source":"CRM","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{marketing_source@opportunity}} = 'marketing' AND {{opportunity_stage@opportunity}} NOT IN ('closed_won', 'closed_lost'))) AS marketing_sourced_pipeline","staged":false,"placeholders":["marketing_source@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},"marketing_sourced_revenue":{"metric":"Marketing Sourced Revenue","fields":["close_date","marketing_source","opportunity_amount","opportunity_stage","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"CRM","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{marketing_source@opportunity}} = 'marketing' AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))) AS marketing_sourced_revenue","staged":false,"placeholders":["close_date@opportunity","marketing_source@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},"marketing_influenced_pipelinerevenue":{"metric":"Marketing Influenced Pipeline/Revenue","fields":["marketing_influenced","opportunity_amount","opportunity_stage","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Daily snapshot","frequency":"Daily","source":"CRM","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{marketing_influenced@opportunity}} = TRUE AND {{opportunity_stage@opportunity}} NOT IN ('closed_won', 'closed_lost'))) AS marketing_influenced_pipelinerevenue","staged":false,"placeholders":["marketing_influenced@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},"organic_traffic":{"metric":"Organic Traffic","fields":["period_start","traffic_source","unique_visitors"],"datasets":["web_traffic"],"sourceTable":"web_traffic","grain":"Daily aggregate","frequency":"Daily","source":"Web Analytics","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{unique_visitors@web_traffic}}), 0) FROM {{_table:web_traffic}} WHERE {{period_start@web_traffic}} >= {{_period_start}} AND {{period_start@web_traffic}} <= {{_period_end}} AND {{traffic_source@web_traffic}} = 'organic_search') AS organic_traffic","staged":false,"placeholders":["period_start@web_traffic","traffic_source@web_traffic","unique_visitors@web_traffic"]},"paid_media_efficiency_roas":{"metric":"Paid Media Efficiency (ROAS)","fields":["ad_spend","channel","close_date","opportunity_amount","opportunity_stage","period_start","snapshot_date"],"datasets":["campaign","opportunity"],"sourceTable":null,"grain":"Daily aggregate","frequency":"Daily","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{channel@opportunity}} = 'paid_ads' AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{ad_spend@campaign}}), 0) FROM {{_table:campaign}} WHERE {{period_start@campaign}} >= {{_period_start}} AND {{period_start@campaign}} <= {{_period_end}} AND {{channel@campaign}} = 'paid_ads'), 0)) AS paid_media_efficiency_roas","staged":false,"placeholders":["ad_spend@campaign","channel@campaign","channel@opportunity","close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","period_start@campaign","snapshot_date@opportunity"]},"share_of_voice":{"metric":"Share of Voice","fields":["is_competitor","mention_count","period_start"],"datasets":["brand_mention"],"sourceTable":"brand_mention","grain":"Daily aggregate","frequency":"Daily","source":"Web Analytics","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{mention_count@brand_mention}}), 0) FROM {{_table:brand_mention}} WHERE {{period_start@brand_mention}} >= {{_period_start}} AND {{period_start@brand_mention}} <= {{_period_end}} AND {{is_competitor@brand_mention}} = FALSE) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{mention_count@brand_mention}}), 0) FROM {{_table:brand_mention}} WHERE {{period_start@brand_mention}} >= {{_period_start}} AND {{period_start@brand_mention}} <= {{_period_end}}), 0)) AS share_of_voice","staged":false,"placeholders":["is_competitor@brand_mention","mention_count@brand_mention","period_start@brand_mention"]},"nps_marketing_context":{"metric":"NPS (Marketing context)","fields":["nps_score","survey_date","survey_type"],"datasets":["survey_response"],"sourceTable":"survey_response","grain":"Per survey response","frequency":"Per response","source":"Survey Tool","parameterizedQuery":"SELECT ((CAST(((SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND ({{survey_type@survey_response}} = 'prospect' AND {{nps_score@survey_response}} >= 9)) - (SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND ({{survey_type@survey_response}} = 'prospect' AND {{nps_score@survey_response}} <= 6))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND {{survey_type@survey_response}} = 'prospect'), 0)) * 100) AS nps_marketing_context","staged":false,"placeholders":["nps_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},"ttfv":{"metric":"Time to First Value (TTFV)","fields":["contract_start","milestone_date","onboarding_milestone"],"datasets":["onboarding_milestone"],"sourceTable":"onboarding_milestone","grain":"Per event","frequency":"Daily","source":"CS Platform","parameterizedQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ({{milestone_date@onboarding_milestone}} - {{contract_start@onboarding_milestone}})) FROM {{_table:onboarding_milestone}} WHERE {{milestone_date@onboarding_milestone}} >= {{_period_start}} AND {{milestone_date@onboarding_milestone}} <= {{_period_end}} AND {{onboarding_milestone@onboarding_milestone}} = 'first_value') AS ttfv","staged":false,"placeholders":["contract_start@onboarding_milestone","milestone_date@onboarding_milestone","onboarding_milestone@onboarding_milestone"]},"time_to_go_live":{"metric":"Time to Go-Live","fields":["contract_start","milestone_date","onboarding_milestone"],"datasets":["onboarding_milestone"],"sourceTable":"onboarding_milestone","grain":"Per event","frequency":"Daily","source":"CS Platform","parameterizedQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ({{milestone_date@onboarding_milestone}} - {{contract_start@onboarding_milestone}})) FROM {{_table:onboarding_milestone}} WHERE {{milestone_date@onboarding_milestone}} >= {{_period_start}} AND {{milestone_date@onboarding_milestone}} <= {{_period_end}} AND {{onboarding_milestone@onboarding_milestone}} = 'go_live') AS time_to_go_live","staged":false,"placeholders":["contract_start@onboarding_milestone","milestone_date@onboarding_milestone","onboarding_milestone@onboarding_milestone"]},"time_to_full_adoption":{"metric":"Time to Full Adoption","fields":["contract_start","milestone_date","onboarding_milestone"],"datasets":["onboarding_milestone"],"sourceTable":"onboarding_milestone","grain":"Per event","frequency":"Daily","source":"CS Platform","parameterizedQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ({{milestone_date@onboarding_milestone}} - {{contract_start@onboarding_milestone}})) FROM {{_table:onboarding_milestone}} WHERE {{milestone_date@onboarding_milestone}} >= {{_period_start}} AND {{milestone_date@onboarding_milestone}} <= {{_period_end}} AND {{onboarding_milestone@onboarding_milestone}} = 'full_adoption') AS time_to_full_adoption","staged":false,"placeholders":["contract_start@onboarding_milestone","milestone_date@onboarding_milestone","onboarding_milestone@onboarding_milestone"]},"onboarding_duration":{"metric":"Onboarding Duration","fields":["onboarding_completion_date","onboarding_start_date","snapshot_date"],"datasets":["onboarding"],"sourceTable":"onboarding","grain":"Per event","frequency":"Per onboarding","source":"CS Platform","parameterizedQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ({{onboarding_completion_date@onboarding}} - {{onboarding_start_date@onboarding}})) FROM {{_table:onboarding}} WHERE {{snapshot_date@onboarding}} = {{_period_end}} AND ({{onboarding_completion_date@onboarding}} >= {{_period_start}} AND {{onboarding_completion_date@onboarding}} <= {{_period_end}})) AS onboarding_duration","staged":false,"placeholders":["onboarding_completion_date@onboarding","onboarding_start_date@onboarding","snapshot_date@onboarding"]},"onboarding_completion":{"metric":"Onboarding Completion Rate","fields":["onboarding_completion_date","onboarding_id","onboarding_start_date","snapshot_date"],"datasets":["onboarding"],"sourceTable":"onboarding","grain":"Per event, aggregate monthly","frequency":"Daily","source":"CS Platform","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{onboarding_id@onboarding}}) FROM {{_table:onboarding}} WHERE {{snapshot_date@onboarding}} = {{_period_end}} AND ({{onboarding_completion_date@onboarding}} >= {{_period_start}} AND {{onboarding_completion_date@onboarding}} <= {{_period_end}})) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{onboarding_id@onboarding}}) FROM {{_table:onboarding}} WHERE {{snapshot_date@onboarding}} = {{_period_end}} AND ({{onboarding_start_date@onboarding}} >= {{_period_start}} AND {{onboarding_start_date@onboarding}} <= {{_period_end}})), 0)) AS onboarding_completion","staged":false,"placeholders":["onboarding_completion_date@onboarding","onboarding_id@onboarding","onboarding_start_date@onboarding","snapshot_date@onboarding"]},"onboarding_milestone_completion_rate":{"metric":"Onboarding Milestone Completion Rate","fields":["milestone_date","milestone_due_date","onboarding_id"],"datasets":["onboarding_milestone"],"sourceTable":"onboarding_milestone","grain":"Per event","frequency":"Per milestone","source":"CS Platform","parameterizedQuery":"SELECT (CAST((SELECT COUNT({{onboarding_id@onboarding_milestone}}) FROM {{_table:onboarding_milestone}} WHERE ((({{milestone_due_date@onboarding_milestone}} >= {{_period_start}} AND {{milestone_due_date@onboarding_milestone}} <= {{_period_end}}) AND {{milestone_date@onboarding_milestone}} IS NOT NULL) AND {{milestone_date@onboarding_milestone}} <= {{_period_end}})) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{onboarding_id@onboarding_milestone}}) FROM {{_table:onboarding_milestone}} WHERE ({{milestone_due_date@onboarding_milestone}} >= {{_period_start}} AND {{milestone_due_date@onboarding_milestone}} <= {{_period_end}})), 0)) AS onboarding_milestone_completion_rate","staged":false,"placeholders":["milestone_date@onboarding_milestone","milestone_due_date@onboarding_milestone","onboarding_id@onboarding_milestone"]},"on_time_completion_rate":{"metric":"On-Time Completion Rate","fields":["onboarding_completion_date","onboarding_id","snapshot_date","target_date"],"datasets":["onboarding"],"sourceTable":"onboarding","grain":"Per event, aggregate monthly","frequency":"Daily","source":"CS Platform","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{onboarding_id@onboarding}}) FROM {{_table:onboarding}} WHERE {{snapshot_date@onboarding}} = {{_period_end}} AND (({{onboarding_completion_date@onboarding}} >= {{_period_start}} AND {{onboarding_completion_date@onboarding}} <= {{_period_end}}) AND {{onboarding_completion_date@onboarding}} <= {{target_date@onboarding}})) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{onboarding_id@onboarding}}) FROM {{_table:onboarding}} WHERE {{snapshot_date@onboarding}} = {{_period_end}} AND ({{onboarding_completion_date@onboarding}} >= {{_period_start}} AND {{onboarding_completion_date@onboarding}} <= {{_period_end}})), 0)) AS on_time_completion_rate","staged":false,"placeholders":["onboarding_completion_date@onboarding","onboarding_id@onboarding","snapshot_date@onboarding","target_date@onboarding"]},"session_attendance_rate":{"metric":"Session Attendance Rate","fields":["attendees","onboarding_session_date"],"datasets":["onboarding_session"],"sourceTable":"onboarding_session","grain":"Per event, aggregate monthly","frequency":"Daily","source":"CS Platform","parameterizedQuery":"SELECT (CAST((SELECT COUNT({{onboarding_session_date@onboarding_session}}) FROM {{_table:onboarding_session}} WHERE {{onboarding_session_date@onboarding_session}} >= {{_period_start}} AND {{onboarding_session_date@onboarding_session}} <= {{_period_end}} AND {{attendees@onboarding_session}} > 0) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{onboarding_session_date@onboarding_session}}) FROM {{_table:onboarding_session}} WHERE {{onboarding_session_date@onboarding_session}} >= {{_period_start}} AND {{onboarding_session_date@onboarding_session}} <= {{_period_end}}), 0)) AS session_attendance_rate","staged":false,"placeholders":["attendees@onboarding_session","onboarding_session_date@onboarding_session"]},"task_completion_rate":{"metric":"Task Completion Rate","fields":["snapshot_date","steps_completed","steps_total"],"datasets":["onboarding"],"sourceTable":"onboarding","grain":"Per event, aggregate monthly","frequency":"Daily","source":"CS Platform","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{steps_completed@onboarding}}), 0) FROM {{_table:onboarding}} WHERE {{snapshot_date@onboarding}} = {{_period_end}}) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{steps_total@onboarding}}), 0) FROM {{_table:onboarding}} WHERE {{snapshot_date@onboarding}} = {{_period_end}}), 0)) AS task_completion_rate","staged":false,"placeholders":["snapshot_date@onboarding","steps_completed@onboarding","steps_total@onboarding"]},"onboarding_csat":{"metric":"Onboarding CSAT","fields":["satisfaction_score","survey_date","survey_type"],"datasets":["survey_response"],"sourceTable":"survey_response","grain":"Per survey response","frequency":"Per response","source":"Survey Tool","parameterizedQuery":"SELECT (CAST((SELECT COUNT({{satisfaction_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND ({{survey_type@survey_response}} = 'onboarding' AND {{satisfaction_score@survey_response}} >= 4)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{satisfaction_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND {{survey_type@survey_response}} = 'onboarding'), 0)) AS onboarding_csat","staged":false,"placeholders":["satisfaction_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},"onboarding_nps":{"metric":"Onboarding NPS","fields":["nps_score","survey_date","survey_type"],"datasets":["survey_response"],"sourceTable":"survey_response","grain":"Per survey response","frequency":"Per response","source":"Survey Tool","parameterizedQuery":"SELECT ((CAST(((SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND ({{survey_type@survey_response}} = 'onboarding' AND {{nps_score@survey_response}} >= 9)) - (SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND ({{survey_type@survey_response}} = 'onboarding' AND {{nps_score@survey_response}} <= 6))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND {{survey_type@survey_response}} = 'onboarding'), 0)) * 100) AS onboarding_nps","staged":false,"placeholders":["nps_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},"onboardings_per_resource":{"metric":"Onboardings per Resource","fields":["onboarding_completion_date","onboarding_id","resource_id","snapshot_date"],"datasets":["onboarding"],"sourceTable":"onboarding","grain":"Per event","frequency":"Per onboarding","source":"CS Platform","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{onboarding_id@onboarding}}) FROM {{_table:onboarding}} WHERE {{snapshot_date@onboarding}} = {{_period_end}} AND ({{onboarding_completion_date@onboarding}} >= {{_period_start}} AND {{onboarding_completion_date@onboarding}} <= {{_period_end}})) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{resource_id@onboarding}}) FROM {{_table:onboarding}} WHERE {{snapshot_date@onboarding}} = {{_period_end}} AND ({{onboarding_completion_date@onboarding}} >= {{_period_start}} AND {{onboarding_completion_date@onboarding}} <= {{_period_end}})), 0)) AS onboardings_per_resource","staged":false,"placeholders":["onboarding_completion_date@onboarding","onboarding_id@onboarding","resource_id@onboarding","snapshot_date@onboarding"]},"cost_per_onboarding":{"metric":"Cost per Onboarding","fields":["cost","cost_function","event_date","onboarding_completion_date","onboarding_id","snapshot_date"],"datasets":["cost_event","onboarding"],"sourceTable":null,"grain":"Per event","frequency":"Per onboarding","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'onboarding') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{onboarding_id@onboarding}}) FROM {{_table:onboarding}} WHERE {{snapshot_date@onboarding}} = {{_period_end}} AND ({{onboarding_completion_date@onboarding}} >= {{_period_start}} AND {{onboarding_completion_date@onboarding}} <= {{_period_end}})), 0)) AS cost_per_onboarding","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","onboarding_completion_date@onboarding","onboarding_id@onboarding","snapshot_date@onboarding"]},"time_spent_per_onboarding":{"metric":"Time Spent per Onboarding","fields":["hours","onboarding_completion_date","onboarding_id","snapshot_date"],"datasets":["onboarding"],"sourceTable":"onboarding","grain":"Per event","frequency":"Per onboarding","source":"CS Platform","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{hours@onboarding}}), 0) FROM {{_table:onboarding}} WHERE {{snapshot_date@onboarding}} = {{_period_end}} AND ({{onboarding_completion_date@onboarding}} >= {{_period_start}} AND {{onboarding_completion_date@onboarding}} <= {{_period_end}})) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{onboarding_id@onboarding}}) FROM {{_table:onboarding}} WHERE {{snapshot_date@onboarding}} = {{_period_end}} AND ({{onboarding_completion_date@onboarding}} >= {{_period_start}} AND {{onboarding_completion_date@onboarding}} <= {{_period_end}})), 0)) AS time_spent_per_onboarding","staged":false,"placeholders":["hours@onboarding","onboarding_completion_date@onboarding","onboarding_id@onboarding","snapshot_date@onboarding"]},"activation_rate":{"metric":"Onboarding-to-Active Rate (Activation Rate)","fields":["activation_date","customer_id","onboarding_completion_date","snapshot_date"],"datasets":["customer"],"sourceTable":"customer","grain":"Per event, aggregate monthly","frequency":"Daily","source":"CS Platform","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND (({{onboarding_completion_date@customer}} >= {{_period_start}} AND {{onboarding_completion_date@customer}} <= {{_period_end}}) AND {{activation_date@customer}} IS NOT NULL)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND ({{onboarding_completion_date@customer}} >= {{_period_start}} AND {{onboarding_completion_date@customer}} <= {{_period_end}})), 0)) AS activation_rate","staged":false,"placeholders":["activation_date@customer","customer_id@customer","onboarding_completion_date@customer","snapshot_date@customer"]},"day_30_retention_post_onboarding":{"metric":"30-Day Retention (Post-Onboarding)","fields":["customer_id","customer_status","last_active_date","onboarding_completion_date","snapshot_date"],"datasets":["customer"],"sourceTable":"customer","grain":"Monthly cohort","frequency":"Daily","source":"Billing","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND (({{onboarding_completion_date@customer}} IS NOT NULL AND {{customer_status@customer}} = 'active') AND ({{last_active_date@customer}} - {{onboarding_completion_date@customer}}) >= 30)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{onboarding_completion_date@customer}} IS NOT NULL), 0)) AS day_30_retention_post_onboarding","staged":false,"placeholders":["customer_id@customer","customer_status@customer","last_active_date@customer","onboarding_completion_date@customer","snapshot_date@customer"]},"feature_adoption_at_go_live":{"metric":"Feature Adoption at Go-Live","fields":["event_date","feature_id","snapshot_date","usage_count"],"datasets":["feature","product_event"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{feature_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}} AND {{usage_count@product_event}} > 0) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{feature_id@feature}}) FROM {{_table:feature}} WHERE {{snapshot_date@feature}} = {{_period_end}}), 0)) AS feature_adoption_at_go_live","staged":false,"placeholders":["event_date@product_event","feature_id@feature","feature_id@product_event","snapshot_date@feature","usage_count@product_event"]},"total_active_partners":{"metric":"Total Active Partners","fields":["partner_id","partner_status","snapshot_date"],"datasets":["partner"],"sourceTable":"partner","grain":"End-of-month snapshot","frequency":"Monthly","source":"Partner Management","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{partner_id@partner}}) FROM {{_table:partner}} WHERE {{snapshot_date@partner}} = {{_period_end}} AND {{partner_status@partner}} = 'active') AS total_active_partners","staged":false,"placeholders":["partner_id@partner","partner_status@partner","snapshot_date@partner"]},"partner_tier_distribution":{"metric":"Partner Tier Distribution","fields":["partner_id","partner_tier","snapshot_date"],"datasets":["partner"],"sourceTable":"partner","grain":"End-of-month snapshot","frequency":"Monthly","source":"Partner Management","parameterizedQuery":"SELECT _d.partner_tier AS partner_tier, (CAST((SELECT COUNT(DISTINCT {{partner_id@partner}}) FROM {{_table:partner}} WHERE {{snapshot_date@partner}} = {{_period_end}} AND {{partner_tier@partner}} = _d.partner_tier) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{partner_id@partner}}) FROM {{_table:partner}} WHERE {{snapshot_date@partner}} = {{_period_end}}), 0)) AS partner_tier_distribution\nFROM (SELECT 'registered' AS partner_tier UNION ALL SELECT 'silver' AS partner_tier UNION ALL SELECT 'gold' AS partner_tier UNION ALL SELECT 'platinum' AS partner_tier) _d","staged":false,"placeholders":["partner_id@partner","partner_tier@partner","snapshot_date@partner"],"breakdown":{"field":"partner_tier"}},"partner_activation_rate":{"metric":"Partner Activation Rate","fields":["partner_id","partner_recruited_date","partner_status","snapshot_date"],"datasets":["partner"],"sourceTable":"partner","grain":"Per event, aggregate monthly","frequency":"Monthly","source":"Partner Management","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{partner_id@partner}}) FROM {{_table:partner}} WHERE {{snapshot_date@partner}} = {{_period_end}} AND (({{partner_recruited_date@partner}} >= {{_period_start}} AND {{partner_recruited_date@partner}} <= {{_period_end}}) AND {{partner_status@partner}} = 'active')) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{partner_id@partner}}) FROM {{_table:partner}} WHERE {{snapshot_date@partner}} = {{_period_end}} AND ({{partner_recruited_date@partner}} >= {{_period_start}} AND {{partner_recruited_date@partner}} <= {{_period_end}})), 0)) AS partner_activation_rate","staged":false,"placeholders":["partner_id@partner","partner_recruited_date@partner","partner_status@partner","snapshot_date@partner"]},"partner_churn_rate":{"metric":"Partner Churn Rate","fields":["partner_churn_date","partner_id","partner_status","snapshot_date"],"datasets":["partner"],"sourceTable":"partner","grain":"Per event, aggregate monthly","frequency":"Monthly","source":"Partner Management","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{partner_id@partner}}) FROM {{_table:partner}} WHERE {{snapshot_date@partner}} = {{_period_end}} AND ({{partner_churn_date@partner}} >= {{_period_start}} AND {{partner_churn_date@partner}} <= {{_period_end}})) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{partner_id@partner}}) FROM {{_table:partner}} WHERE {{snapshot_date@partner}} = {{_period_start}} AND {{partner_status@partner}} = 'active'), 0)) AS partner_churn_rate","staged":false,"placeholders":["partner_churn_date@partner","partner_id@partner","partner_status@partner","snapshot_date@partner"]},"partner_sourced_revenue":{"metric":"Partner-Sourced Revenue","fields":["close_date","opportunity_amount","opportunity_stage","partner_sourced","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Per event, aggregate monthly","frequency":"Monthly","source":"CRM","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{partner_sourced@opportunity}} = TRUE AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))) AS partner_sourced_revenue","staged":false,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","partner_sourced@opportunity","snapshot_date@opportunity"]},"partner_influenced_revenue":{"metric":"Partner-Influenced Revenue","fields":["close_date","opportunity_amount","opportunity_stage","partner_id","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Per event, aggregate monthly","frequency":"Monthly","source":"CRM","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{partner_id@opportunity}} IS NOT NULL AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))) AS partner_influenced_revenue","staged":false,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","partner_id@opportunity","snapshot_date@opportunity"]},"channel_revenue_percentage":{"metric":"Channel Revenue Percentage","fields":["close_date","opportunity_amount","opportunity_stage","partner_sourced","period_start","revenue","snapshot_date"],"datasets":["financials","opportunity"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Monthly","source":"CRM","parameterizedQuery":"SELECT (CAST(((SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{partner_sourced@opportunity}} = TRUE AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}})))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}})), 0)) AS channel_revenue_percentage","staged":false,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","partner_sourced@opportunity","period_start@financials","revenue@financials","snapshot_date@opportunity"]},"partner_revenue_growth":{"metric":"Partner Revenue Growth","fields":["close_date","opportunity_amount","opportunity_stage","partner_sourced","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Per event, aggregate monthly","frequency":"Monthly","source":"CRM","parameterizedQuery":"SELECT (CAST((((SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{partner_sourced@opportunity}} = TRUE AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}})))) - ((SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = ((({{_period_end}} + INTERVAL '1 day') - INTERVAL '1 year') - INTERVAL '1 day') AND (({{partner_sourced@opportunity}} = TRUE AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= ({{_period_start}} - INTERVAL '1 year') AND {{close_date@opportunity}} <= ((({{_period_end}} + INTERVAL '1 day') - INTERVAL '1 year') - INTERVAL '1 day')))))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = ((({{_period_end}} + INTERVAL '1 day') - INTERVAL '1 year') - INTERVAL '1 day') AND (({{partner_sourced@opportunity}} = TRUE AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= ({{_period_start}} - INTERVAL '1 year') AND {{close_date@opportunity}} <= ((({{_period_end}} + INTERVAL '1 day') - INTERVAL '1 year') - INTERVAL '1 day'))))), 0)) AS partner_revenue_growth","staged":true,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","partner_sourced@opportunity","snapshot_date@opportunity"]},"average_partner_revenue":{"metric":"Average Partner Revenue","fields":["close_date","opportunity_amount","opportunity_stage","partner_id","partner_status","snapshot_date"],"datasets":["opportunity","partner"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Monthly","source":"CRM","parameterizedQuery":"SELECT (CAST(((SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{partner_id@opportunity}} IS NOT NULL AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}})))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{partner_id@partner}}) FROM {{_table:partner}} WHERE {{snapshot_date@partner}} = {{_period_end}} AND {{partner_status@partner}} = 'active')), 0)) AS average_partner_revenue","staged":false,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","partner_id@opportunity","partner_id@partner","partner_status@partner","snapshot_date@opportunity","snapshot_date@partner"]},"partner_deal_registration_volume":{"metric":"Partner Deal Registration Volume","fields":["registration_date","registration_id","snapshot_date"],"datasets":["deal_registration"],"sourceTable":"deal_registration","grain":"Per event","frequency":"Per registration","source":"Partner Management","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{registration_id@deal_registration}}) FROM {{_table:deal_registration}} WHERE {{snapshot_date@deal_registration}} = {{_period_end}} AND ({{registration_date@deal_registration}} >= {{_period_start}} AND {{registration_date@deal_registration}} <= {{_period_end}})) AS partner_deal_registration_volume","staged":false,"placeholders":["registration_date@deal_registration","registration_id@deal_registration","snapshot_date@deal_registration"]},"deal_registration_to_close_rate":{"metric":"Deal Registration-to-Close Rate","fields":["close_date","opportunity_stage","registration_date","registration_id","snapshot_date"],"datasets":["deal_registration"],"sourceTable":"deal_registration","grain":"Per event","frequency":"Per registration","source":"Partner Management","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{registration_id@deal_registration}}) FROM {{_table:deal_registration}} WHERE {{snapshot_date@deal_registration}} = {{_period_end}} AND ({{opportunity_stage@deal_registration}} = 'closed_won' AND ({{close_date@deal_registration}} >= {{_period_start}} AND {{close_date@deal_registration}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{registration_id@deal_registration}}) FROM {{_table:deal_registration}} WHERE {{snapshot_date@deal_registration}} = {{_period_end}} AND ({{registration_date@deal_registration}} >= {{_period_start}} AND {{registration_date@deal_registration}} <= {{_period_end}})), 0)) AS deal_registration_to_close_rate","staged":false,"placeholders":["close_date@deal_registration","opportunity_stage@deal_registration","registration_date@deal_registration","registration_id@deal_registration","snapshot_date@deal_registration"]},"partner_win_rate":{"metric":"Partner Win Rate","fields":["close_date","opportunity_id","opportunity_stage","partner_id","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COUNT({{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{partner_id@opportunity}} IS NOT NULL AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{partner_id@opportunity}} IS NOT NULL AND {{opportunity_stage@opportunity}} IN ('closed_won', 'closed_lost')) AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))), 0)) AS partner_win_rate","staged":false,"placeholders":["close_date@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","partner_id@opportunity","snapshot_date@opportunity"]},"partner_deal_size":{"metric":"Partner Deal Size","fields":["close_date","opportunity_amount","opportunity_id","opportunity_stage","partner_sourced","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"CRM","parameterizedQuery":"SELECT (CAST(((SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{partner_sourced@opportunity}} = TRUE AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}})))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{partner_sourced@opportunity}} = TRUE AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))), 0)) AS partner_deal_size","staged":false,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","partner_sourced@opportunity","snapshot_date@opportunity"]},"partner_sales_cycle":{"metric":"Partner Sales Cycle","fields":["close_date","opportunity_stage","registration_date","snapshot_date"],"datasets":["deal_registration"],"sourceTable":"deal_registration","grain":"Per event","frequency":"Per registration","source":"Partner Management","parameterizedQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ({{close_date@deal_registration}} - {{registration_date@deal_registration}})) FROM {{_table:deal_registration}} WHERE {{snapshot_date@deal_registration}} = {{_period_end}} AND ({{opportunity_stage@deal_registration}} = 'closed_won' AND ({{close_date@deal_registration}} >= {{_period_start}} AND {{close_date@deal_registration}} <= {{_period_end}}))) AS partner_sales_cycle","staged":false,"placeholders":["close_date@deal_registration","opportunity_stage@deal_registration","registration_date@deal_registration","snapshot_date@deal_registration"]},"certification_rate":{"metric":"Certification Rate","fields":["certification_status","partner_id","partner_status","snapshot_date"],"datasets":["partner"],"sourceTable":"partner","grain":"End-of-month snapshot","frequency":"Monthly","source":"Partner Management","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{partner_id@partner}}) FROM {{_table:partner}} WHERE {{snapshot_date@partner}} = {{_period_end}} AND {{certification_status@partner}} = 'certified') AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{partner_id@partner}}) FROM {{_table:partner}} WHERE {{snapshot_date@partner}} = {{_period_end}} AND {{partner_status@partner}} = 'active')), 0)) AS certification_rate","staged":false,"placeholders":["certification_status@partner","partner_id@partner","partner_status@partner","snapshot_date@partner"]},"training_completion":{"metric":"Training Completion","fields":["partner_id","snapshot_date","training_completed"],"datasets":["partner"],"sourceTable":"partner","grain":"End-of-month snapshot","frequency":"Monthly","source":"Partner Management","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{partner_id@partner}}) FROM {{_table:partner}} WHERE {{snapshot_date@partner}} = {{_period_end}} AND {{training_completed@partner}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{partner_id@partner}}) FROM {{_table:partner}} WHERE {{snapshot_date@partner}} = {{_period_end}}), 0)) AS training_completion","staged":false,"placeholders":["partner_id@partner","snapshot_date@partner","training_completed@partner"]},"joint_marketing_activities":{"metric":"Joint Marketing Activities","fields":["activity_date","activity_id","partner_activity_type"],"datasets":["partner_activity"],"sourceTable":"partner_activity","grain":"Per event, aggregate monthly","frequency":"Monthly","source":"Partner Management","parameterizedQuery":"SELECT (SELECT COUNT({{activity_id@partner_activity}}) FROM {{_table:partner_activity}} WHERE {{activity_date@partner_activity}} >= {{_period_start}} AND {{activity_date@partner_activity}} <= {{_period_end}} AND {{partner_activity_type@partner_activity}} IN ('webinar', 'event', 'content', 'campaign')) AS joint_marketing_activities","staged":false,"placeholders":["activity_date@partner_activity","activity_id@partner_activity","partner_activity_type@partner_activity"]},"partner_nps":{"metric":"Partner NPS","fields":["nps_score","survey_date","survey_type"],"datasets":["survey_response"],"sourceTable":"survey_response","grain":"Per survey response, aggregate quarterly","frequency":"Quarterly","source":"Survey Tool","parameterizedQuery":"SELECT ((CAST(((SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND ({{survey_type@survey_response}} = 'partner' AND {{nps_score@survey_response}} >= 9)) - (SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND ({{survey_type@survey_response}} = 'partner' AND {{nps_score@survey_response}} <= 6))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND {{survey_type@survey_response}} = 'partner'), 0)) * 100) AS partner_nps","staged":false,"placeholders":["nps_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},"partner_margin_commission":{"metric":"Partner Margin / Commission","fields":["close_date","cost","cost_function","event_date","opportunity_amount","opportunity_stage","partner_sourced","snapshot_date"],"datasets":["cost_event","opportunity"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Monthly","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'partner_commission') AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{partner_sourced@opportunity}} = TRUE AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}})))), 0)) AS partner_margin_commission","staged":false,"placeholders":["close_date@opportunity","cost@cost_event","cost_function@cost_event","event_date@cost_event","opportunity_amount@opportunity","opportunity_stage@opportunity","partner_sourced@opportunity","snapshot_date@opportunity"]},"cost_of_partner_acquisition":{"metric":"Cost of Partner Acquisition","fields":["cost","cost_function","event_date","partner_id","partner_recruited_date","snapshot_date"],"datasets":["cost_event","partner"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'partner_program') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{partner_id@partner}}) FROM {{_table:partner}} WHERE {{snapshot_date@partner}} = {{_period_end}} AND ({{partner_recruited_date@partner}} >= {{_period_start}} AND {{partner_recruited_date@partner}} <= {{_period_end}})), 0)) AS cost_of_partner_acquisition","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","partner_id@partner","partner_recruited_date@partner","snapshot_date@partner"]},"partner_lifetime_value":{"metric":"Partner Lifetime Value","fields":["close_date","opportunity_amount","opportunity_stage","partner_churn_date","partner_id","partner_status","snapshot_date"],"datasets":["opportunity","partner"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Partner Management","parameterizedQuery":"SELECT (CAST(((CAST(((SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{partner_id@opportunity}} IS NOT NULL AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}})))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{partner_id@partner}}) FROM {{_table:partner}} WHERE {{snapshot_date@partner}} = {{_period_end}} AND {{partner_status@partner}} = 'active')), 0))) AS DOUBLE PRECISION) / NULLIF(((CAST((SELECT COUNT(DISTINCT {{partner_id@partner}}) FROM {{_table:partner}} WHERE {{snapshot_date@partner}} = {{_period_end}} AND ({{partner_churn_date@partner}} >= {{_period_start}} AND {{partner_churn_date@partner}} <= {{_period_end}})) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{partner_id@partner}}) FROM {{_table:partner}} WHERE {{snapshot_date@partner}} = {{_period_start}} AND {{partner_status@partner}} = 'active'), 0))), 0)) AS partner_lifetime_value","staged":false,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","partner_churn_date@partner","partner_id@opportunity","partner_id@partner","partner_status@partner","snapshot_date@opportunity","snapshot_date@partner"]},"partner_roi":{"metric":"Partner ROI","fields":["close_date","cost","cost_function","event_date","opportunity_amount","opportunity_stage","partner_sourced","snapshot_date"],"datasets":["cost_event","opportunity"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Monthly","source":"CRM","parameterizedQuery":"SELECT (CAST((((SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{partner_sourced@opportunity}} = TRUE AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}})))) - (SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'partner_program')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'partner_program'), 0)) AS partner_roi","staged":false,"placeholders":["close_date@opportunity","cost@cost_event","cost_function@cost_event","event_date@cost_event","opportunity_amount@opportunity","opportunity_stage@opportunity","partner_sourced@opportunity","snapshot_date@opportunity"]},"marketplace_revenue":{"metric":"Marketplace Revenue","fields":["channel","close_date","opportunity_amount","opportunity_stage","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Per event, aggregate monthly","frequency":"Monthly","source":"CRM","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{channel@opportunity}} = 'marketplace' AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))) AS marketplace_revenue","staged":false,"placeholders":["channel@opportunity","close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},"marketplace_as_of_revenue":{"metric":"Marketplace as % of Revenue","fields":["channel","close_date","opportunity_amount","opportunity_stage","period_start","revenue","snapshot_date"],"datasets":["financials","opportunity"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Monthly","source":"CRM","parameterizedQuery":"SELECT (CAST(((SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{channel@opportunity}} = 'marketplace' AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}})))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}})), 0)) AS marketplace_as_of_revenue","staged":false,"placeholders":["channel@opportunity","close_date@opportunity","opportunity_amount@opportunity","opportunity_stage@opportunity","period_start@financials","revenue@financials","snapshot_date@opportunity"]},"total_headcount":{"metric":"Total Headcount","fields":["employee_id","employee_status","snapshot_date"],"datasets":["employee"],"sourceTable":"employee","grain":"End-of-month snapshot","frequency":"Monthly","source":"HRIS","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND {{employee_status@employee}} = 'active') AS total_headcount","staged":false,"placeholders":["employee_id@employee","employee_status@employee","snapshot_date@employee"]},"headcount_growth_rate":{"metric":"Headcount Growth Rate","fields":["employee_id","employee_status","snapshot_date"],"datasets":["employee"],"sourceTable":"employee","grain":"End-of-month snapshot","frequency":"Monthly","source":"HRIS","parameterizedQuery":"SELECT (CAST((((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND {{employee_status@employee}} = 'active')) - ((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_start}} AND {{employee_status@employee}} = 'active'))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_start}} AND {{employee_status@employee}} = 'active')), 0)) AS headcount_growth_rate","staged":false,"placeholders":["employee_id@employee","employee_status@employee","snapshot_date@employee"]},"employee_turnover":{"metric":"Employee Turnover Rate","fields":["employee_id","employee_status","snapshot_date","termination_date"],"datasets":["employee"],"sourceTable":"employee","grain":"Monthly aggregate","frequency":"Monthly","source":"HRIS","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND ({{termination_date@employee}} >= {{_period_start}} AND {{termination_date@employee}} <= {{_period_end}})) AS DOUBLE PRECISION) / NULLIF((CAST((((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_start}} AND {{employee_status@employee}} = 'active')) + ((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND {{employee_status@employee}} = 'active'))) AS DOUBLE PRECISION) / 2), 0)) AS employee_turnover","staged":false,"placeholders":["employee_id@employee","employee_status@employee","snapshot_date@employee","termination_date@employee"]},"voluntary_turnover_rate":{"metric":"Voluntary Turnover Rate","fields":["employee_id","employee_status","snapshot_date","termination_date","termination_type"],"datasets":["employee"],"sourceTable":"employee","grain":"Monthly aggregate","frequency":"Monthly","source":"HRIS","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND ({{termination_type@employee}} = 'voluntary' AND ({{termination_date@employee}} >= {{_period_start}} AND {{termination_date@employee}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((CAST((((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_start}} AND {{employee_status@employee}} = 'active')) + ((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND {{employee_status@employee}} = 'active'))) AS DOUBLE PRECISION) / 2), 0)) AS voluntary_turnover_rate","staged":false,"placeholders":["employee_id@employee","employee_status@employee","snapshot_date@employee","termination_date@employee","termination_type@employee"]},"involuntary_turnover_rate":{"metric":"Involuntary Turnover Rate","fields":["employee_id","employee_status","snapshot_date","termination_date","termination_type"],"datasets":["employee"],"sourceTable":"employee","grain":"Monthly aggregate","frequency":"Monthly","source":"HRIS","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND ({{termination_type@employee}} = 'involuntary' AND ({{termination_date@employee}} >= {{_period_start}} AND {{termination_date@employee}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((CAST((((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_start}} AND {{employee_status@employee}} = 'active')) + ((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND {{employee_status@employee}} = 'active'))) AS DOUBLE PRECISION) / 2), 0)) AS involuntary_turnover_rate","staged":false,"placeholders":["employee_id@employee","employee_status@employee","snapshot_date@employee","termination_date@employee","termination_type@employee"]},"regrettable_turnover":{"metric":"Regrettable Turnover","fields":["employee_id","employee_status","is_high_performer","snapshot_date","termination_date","termination_type"],"datasets":["employee"],"sourceTable":"employee","grain":"Monthly aggregate","frequency":"Monthly","source":"HRIS","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND (({{termination_type@employee}} = 'voluntary' AND {{is_high_performer@employee}} = TRUE) AND ({{termination_date@employee}} >= {{_period_start}} AND {{termination_date@employee}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_start}} AND ({{is_high_performer@employee}} = TRUE AND {{employee_status@employee}} = 'active')), 0)) AS regrettable_turnover","staged":false,"placeholders":["employee_id@employee","employee_status@employee","is_high_performer@employee","snapshot_date@employee","termination_date@employee","termination_type@employee"]},"average_tenure":{"metric":"Average Tenure","fields":["employee_status","hire_date","snapshot_date"],"datasets":["employee"],"sourceTable":"employee","grain":"End-of-month snapshot","frequency":"Monthly","source":"HRIS","parameterizedQuery":"SELECT (CAST((SELECT AVG(({{snapshot_date@employee}} - {{hire_date@employee}})) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND {{employee_status@employee}} = 'active') AS DOUBLE PRECISION) / 30.4375) AS average_tenure","staged":false,"placeholders":["employee_status@employee","hire_date@employee","snapshot_date@employee"]},"day_90_turnover":{"metric":"90-Day Turnover","fields":["employee_id","hire_date","snapshot_date","termination_date"],"datasets":["employee"],"sourceTable":"employee","grain":"Monthly aggregate","frequency":"Monthly","source":"HRIS","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND ({{termination_date@employee}} IS NOT NULL AND ({{termination_date@employee}} - {{hire_date@employee}}) <= 90)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND ({{hire_date@employee}} >= {{_period_start}} AND {{hire_date@employee}} <= {{_period_end}})), 0)) AS day_90_turnover","staged":false,"placeholders":["employee_id@employee","hire_date@employee","snapshot_date@employee","termination_date@employee"]},"enps":{"metric":"Employee Net Promoter Score (eNPS)","fields":["nps_score","survey_date","survey_type"],"datasets":["survey_response"],"sourceTable":"survey_response","grain":"Per survey response, aggregate quarterly","frequency":"Quarterly","source":"Survey Tool","parameterizedQuery":"SELECT ((CAST(((SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND ({{survey_type@survey_response}} = 'employee' AND {{nps_score@survey_response}} >= 9)) - (SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND ({{survey_type@survey_response}} = 'employee' AND {{nps_score@survey_response}} <= 6))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND {{survey_type@survey_response}} = 'employee'), 0)) * 100) AS enps","staged":false,"placeholders":["nps_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},"engagement_score":{"metric":"Engagement Score","fields":["engagement_score","survey_date","survey_type"],"datasets":["survey_response"],"sourceTable":"survey_response","grain":"Per survey response, aggregate quarterly","frequency":"Quarterly","source":"Survey Tool","parameterizedQuery":"SELECT (SELECT AVG({{engagement_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND {{survey_type@survey_response}} = 'employee') AS engagement_score","staged":false,"placeholders":["engagement_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},"survey_participation_rate":{"metric":"Survey Participation Rate","fields":["response_id","survey_completed","survey_date","survey_type"],"datasets":["survey_response"],"sourceTable":"survey_response","grain":"Per survey response, aggregate quarterly","frequency":"Quarterly","source":"Survey Tool","parameterizedQuery":"SELECT (CAST((SELECT COUNT({{response_id@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND ({{survey_type@survey_response}} = 'employee' AND {{survey_completed@survey_response}} = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{response_id@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND {{survey_type@survey_response}} = 'employee'), 0)) AS survey_participation_rate","staged":false,"placeholders":["response_id@survey_response","survey_completed@survey_response","survey_date@survey_response","survey_type@survey_response"]},"open_positions":{"metric":"Open Positions","fields":["requisition_id","requisition_status","snapshot_date"],"datasets":["requisition"],"sourceTable":"requisition","grain":"End-of-month snapshot","frequency":"Monthly","source":"ATS","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{requisition_id@requisition}}) FROM {{_table:requisition}} WHERE {{snapshot_date@requisition}} = {{_period_end}} AND {{requisition_status@requisition}} = 'open') AS open_positions","staged":false,"placeholders":["requisition_id@requisition","requisition_status@requisition","snapshot_date@requisition"]},"time_to_fill":{"metric":"Time to Fill","fields":["filled_date","requisition_opened_date","snapshot_date"],"datasets":["requisition"],"sourceTable":"requisition","grain":"Per event","frequency":"Per hire","source":"ATS","parameterizedQuery":"SELECT (SELECT AVG(({{filled_date@requisition}} - {{requisition_opened_date@requisition}})) FROM {{_table:requisition}} WHERE {{snapshot_date@requisition}} = {{_period_end}} AND ({{filled_date@requisition}} >= {{_period_start}} AND {{filled_date@requisition}} <= {{_period_end}})) AS time_to_fill","staged":false,"placeholders":["filled_date@requisition","requisition_opened_date@requisition","snapshot_date@requisition"]},"time_to_hire":{"metric":"Time to Hire","fields":["application_date","hire_date","snapshot_date"],"datasets":["employee"],"sourceTable":"employee","grain":"Per event","frequency":"Per hire","source":"ATS","parameterizedQuery":"SELECT (SELECT AVG(({{hire_date@employee}} - {{application_date@employee}})) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND ({{hire_date@employee}} >= {{_period_start}} AND {{hire_date@employee}} <= {{_period_end}})) AS time_to_hire","staged":false,"placeholders":["application_date@employee","hire_date@employee","snapshot_date@employee"]},"offer_acceptance_rate":{"metric":"Offer Acceptance Rate","fields":["offer_status","requisition_id","snapshot_date"],"datasets":["requisition"],"sourceTable":"requisition","grain":"Per event","frequency":"Per hire","source":"ATS","parameterizedQuery":"SELECT (CAST((SELECT COUNT({{requisition_id@requisition}}) FROM {{_table:requisition}} WHERE {{snapshot_date@requisition}} = {{_period_end}} AND {{offer_status@requisition}} = 'accepted') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{requisition_id@requisition}}) FROM {{_table:requisition}} WHERE {{snapshot_date@requisition}} = {{_period_end}} AND {{offer_status@requisition}} IN ('accepted', 'declined')), 0)) AS offer_acceptance_rate","staged":false,"placeholders":["offer_status@requisition","requisition_id@requisition","snapshot_date@requisition"]},"quality_of_hire":{"metric":"Quality of Hire","fields":["hire_date","performance_rating","snapshot_date"],"datasets":["employee"],"sourceTable":"employee","grain":"Per event","frequency":"Per hire","source":"HRIS","parameterizedQuery":"SELECT (SELECT AVG({{performance_rating@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND (({{hire_date@employee}} IS NOT NULL AND ({{snapshot_date@employee}} - {{hire_date@employee}}) >= 182) AND ({{snapshot_date@employee}} - {{hire_date@employee}}) <= 365)) AS quality_of_hire","staged":false,"placeholders":["hire_date@employee","performance_rating@employee","snapshot_date@employee"]},"cost_per_hire":{"metric":"Cost per Hire","fields":["cost","cost_function","employee_id","event_date","hire_date","snapshot_date"],"datasets":["cost_event","employee"],"sourceTable":null,"grain":"Per event","frequency":"Per hire","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'recruiting') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND ({{hire_date@employee}} >= {{_period_start}} AND {{hire_date@employee}} <= {{_period_end}})), 0)) AS cost_per_hire","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","employee_id@employee","event_date@cost_event","hire_date@employee","snapshot_date@employee"]},"source_of_hire":{"metric":"Source of Hire","fields":["employee_id","hire_date","hire_source","snapshot_date"],"datasets":["employee"],"sourceTable":"employee","grain":"Per event","frequency":"Per hire","source":"HRIS","parameterizedQuery":"SELECT _d.hire_source AS hire_source, (CAST((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND ({{hire_date@employee}} >= {{_period_start}} AND {{hire_date@employee}} <= {{_period_end}}) AND {{hire_source@employee}} = _d.hire_source) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND ({{hire_date@employee}} >= {{_period_start}} AND {{hire_date@employee}} <= {{_period_end}})), 0)) AS source_of_hire\nFROM (SELECT 'referral' AS hire_source UNION ALL SELECT 'inbound' AS hire_source UNION ALL SELECT 'sourced' AS hire_source UNION ALL SELECT 'agency' AS hire_source UNION ALL SELECT 'internal' AS hire_source UNION ALL SELECT 'campus' AS hire_source UNION ALL SELECT 'other' AS hire_source) _d","staged":false,"placeholders":["employee_id@employee","hire_date@employee","hire_source@employee","snapshot_date@employee"],"breakdown":{"field":"hire_source"}},"compa_ratio":{"metric":"Compa-Ratio","fields":["market_midpoint","salary","snapshot_date"],"datasets":["employee"],"sourceTable":"employee","grain":"Annual snapshot","frequency":"Annual","source":"HRIS","parameterizedQuery":"SELECT (SELECT AVG((CAST({{salary@employee}} AS DOUBLE PRECISION) / NULLIF({{market_midpoint@employee}}, 0))) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}}) AS compa_ratio","staged":false,"placeholders":["market_midpoint@employee","salary@employee","snapshot_date@employee"]},"pay_equity_ratio":{"metric":"Pay Equity Ratio","fields":["salary","snapshot_date","underrepresented_group"],"datasets":["employee"],"sourceTable":"employee","grain":"Annual snapshot","frequency":"Annual","source":"HRIS","parameterizedQuery":"SELECT (CAST((SELECT AVG({{salary@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND {{underrepresented_group@employee}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT AVG({{salary@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND {{underrepresented_group@employee}} = FALSE), 0)) AS pay_equity_ratio","staged":false,"placeholders":["salary@employee","snapshot_date@employee","underrepresented_group@employee"]},"diversity_representation":{"metric":"Diversity Representation","fields":["employee_id","employee_status","snapshot_date","underrepresented_group"],"datasets":["employee"],"sourceTable":"employee","grain":"End-of-month snapshot","frequency":"Monthly","source":"HRIS","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND ({{underrepresented_group@employee}} = TRUE AND {{employee_status@employee}} = 'active')) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND {{employee_status@employee}} = 'active'), 0)) AS diversity_representation","staged":false,"placeholders":["employee_id@employee","employee_status@employee","snapshot_date@employee","underrepresented_group@employee"]},"diversity_in_leadership":{"metric":"Diversity in Leadership","fields":["employee_id","employee_status","job_level","snapshot_date","underrepresented_group"],"datasets":["employee"],"sourceTable":"employee","grain":"End-of-month snapshot","frequency":"Monthly","source":"HRIS","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND (({{underrepresented_group@employee}} = TRUE AND {{job_level@employee}} IN ('manager', 'director', 'vp', 'c_level')) AND {{employee_status@employee}} = 'active')) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND ({{job_level@employee}} IN ('manager', 'director', 'vp', 'c_level') AND {{employee_status@employee}} = 'active')), 0)) AS diversity_in_leadership","staged":false,"placeholders":["employee_id@employee","employee_status@employee","job_level@employee","snapshot_date@employee","underrepresented_group@employee"]},"diversity_hiring_rate":{"metric":"Diversity Hiring Rate","fields":["employee_id","hire_date","snapshot_date","underrepresented_group"],"datasets":["employee"],"sourceTable":"employee","grain":"Per event","frequency":"Per hire","source":"HRIS","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND (({{underrepresented_group@employee}} = TRUE AND {{hire_date@employee}} >= {{_period_start}}) AND {{hire_date@employee}} <= {{_period_end}})) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{employee_id@employee}}) FROM {{_table:employee}} WHERE {{snapshot_date@employee}} = {{_period_end}} AND ({{hire_date@employee}} >= {{_period_start}} AND {{hire_date@employee}} <= {{_period_end}})), 0)) AS diversity_hiring_rate","staged":false,"placeholders":["employee_id@employee","hire_date@employee","snapshot_date@employee","underrepresented_group@employee"]},"daily_active_users_dau":{"metric":"Daily Active Users (DAU)","fields":["event_date","product_event_type","user_id"],"datasets":["product_event"],"sourceTable":"product_event","grain":"Distinct users in a trailing window (1, 7 or 30 days) ending at period end","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{user_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= (({{_period_end}} + INTERVAL '1 day') - INTERVAL '1 day') AND {{event_date@product_event}} <= {{_period_end}} AND {{product_event_type@product_event}} = 'qualifying') AS daily_active_users_dau","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","user_id@product_event"]},"weekly_active_users_wau":{"metric":"Weekly Active Users (WAU)","fields":["event_date","product_event_type","user_id"],"datasets":["product_event"],"sourceTable":"product_event","grain":"Distinct users in a trailing window (1, 7 or 30 days) ending at period end","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{user_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= (({{_period_end}} + INTERVAL '1 day') - INTERVAL '7 day') AND {{event_date@product_event}} <= {{_period_end}} AND {{product_event_type@product_event}} = 'qualifying') AS weekly_active_users_wau","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","user_id@product_event"]},"monthly_active_users_mau":{"metric":"Monthly Active Users (MAU)","fields":["event_date","product_event_type","user_id"],"datasets":["product_event"],"sourceTable":"product_event","grain":"Distinct users in a trailing window (1, 7 or 30 days) ending at period end","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{user_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= (({{_period_end}} + INTERVAL '1 day') - INTERVAL '30 day') AND {{event_date@product_event}} <= {{_period_end}} AND {{product_event_type@product_event}} = 'qualifying') AS monthly_active_users_mau","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","user_id@product_event"]},"dau_mau":{"metric":"DAU/MAU Ratio (Stickiness)","fields":["event_date","product_event_type","user_id"],"datasets":["product_event"],"sourceTable":"product_event","grain":"Distinct users in a trailing window (1, 7 or 30 days) ending at period end","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (CAST(((SELECT COUNT(DISTINCT {{user_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= (({{_period_end}} + INTERVAL '1 day') - INTERVAL '1 day') AND {{event_date@product_event}} <= {{_period_end}} AND {{product_event_type@product_event}} = 'qualifying')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{user_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= (({{_period_end}} + INTERVAL '1 day') - INTERVAL '30 day') AND {{event_date@product_event}} <= {{_period_end}} AND {{product_event_type@product_event}} = 'qualifying')), 0)) AS dau_mau","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","user_id@product_event"]},"waumau_ratio":{"metric":"WAU/MAU Ratio","fields":["event_date","product_event_type","user_id"],"datasets":["product_event"],"sourceTable":"product_event","grain":"Distinct users in a trailing window (1, 7 or 30 days) ending at period end","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (CAST(((SELECT COUNT(DISTINCT {{user_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= (({{_period_end}} + INTERVAL '1 day') - INTERVAL '7 day') AND {{event_date@product_event}} <= {{_period_end}} AND {{product_event_type@product_event}} = 'qualifying')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{user_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= (({{_period_end}} + INTERVAL '1 day') - INTERVAL '30 day') AND {{event_date@product_event}} <= {{_period_end}} AND {{product_event_type@product_event}} = 'qualifying')), 0)) AS waumau_ratio","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","user_id@product_event"]},"active_accounts":{"metric":"Active Accounts","fields":["customer_id","event_date","product_event_type"],"datasets":["product_event"],"sourceTable":"product_event","grain":"Per event, aggregate monthly","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{customer_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}} AND {{product_event_type@product_event}} = 'qualifying') AS active_accounts","staged":false,"placeholders":["customer_id@product_event","event_date@product_event","product_event_type@product_event"]},"product_activation_rate":{"metric":"Activation Rate","fields":["activation_date","signup_date","snapshot_date","user_id"],"datasets":["user"],"sourceTable":"user","grain":"Per event, aggregate monthly","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{user_id@user}}) FROM {{_table:user}} WHERE {{snapshot_date@user}} = {{_period_end}} AND (({{signup_date@user}} >= {{_period_start}} AND {{signup_date@user}} <= {{_period_end}}) AND {{activation_date@user}} IS NOT NULL)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{user_id@user}}) FROM {{_table:user}} WHERE {{snapshot_date@user}} = {{_period_end}} AND ({{signup_date@user}} >= {{_period_start}} AND {{signup_date@user}} <= {{_period_end}})), 0)) AS product_activation_rate","staged":false,"placeholders":["activation_date@user","signup_date@user","snapshot_date@user","user_id@user"]},"trial_to_paid_conversion_rate":{"metric":"Trial-to-Paid Conversion Rate","fields":["trial_end_date","trial_id","trial_status"],"datasets":["trial"],"sourceTable":"trial","grain":"Per event, aggregate monthly","frequency":"Daily","source":"Billing","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{trial_id@trial}}) FROM {{_table:trial}} WHERE {{trial_end_date@trial}} >= {{_period_start}} AND {{trial_end_date@trial}} <= {{_period_end}} AND ({{trial_status@trial}} = 'converted' AND ({{trial_end_date@trial}} >= {{_period_start}} AND {{trial_end_date@trial}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{trial_id@trial}}) FROM {{_table:trial}} WHERE {{trial_end_date@trial}} >= {{_period_start}} AND {{trial_end_date@trial}} <= {{_period_end}} AND ({{trial_status@trial}} IN ('converted', 'expired', 'cancelled') AND ({{trial_end_date@trial}} >= {{_period_start}} AND {{trial_end_date@trial}} <= {{_period_end}}))), 0)) AS trial_to_paid_conversion_rate","staged":false,"placeholders":["trial_end_date@trial","trial_id@trial","trial_status@trial"]},"feature_adoption":{"metric":"Feature Adoption Rate","fields":["event_date","feature_id","product_event_type","user_id"],"datasets":["product_event"],"sourceTable":"product_event","grain":"Per event, aggregate monthly","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{user_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}} AND {{feature_id@product_event}} IS NOT NULL) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{user_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}} AND {{product_event_type@product_event}} = 'qualifying'), 0)) AS feature_adoption","staged":false,"placeholders":["event_date@product_event","feature_id@product_event","product_event_type@product_event","user_id@product_event"]},"core_feature_adoption":{"metric":"Core Feature Adoption","fields":["core_features_adopted","event_date","product_event_type","snapshot_date","user_id"],"datasets":["product_event","user"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{user_id@user}}) FROM {{_table:user}} WHERE {{snapshot_date@user}} = {{_period_end}} AND {{core_features_adopted@user}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{user_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}} AND {{product_event_type@product_event}} = 'qualifying'), 0)) AS core_feature_adoption","staged":false,"placeholders":["core_features_adopted@user","event_date@product_event","product_event_type@product_event","snapshot_date@user","user_id@product_event","user_id@user"]},"feature_depth":{"metric":"Feature Depth","fields":["event_date","usage_count","user_id"],"datasets":["product_event"],"sourceTable":"product_event","grain":"Per event, aggregate monthly","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{usage_count@product_event}}), 0) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}}) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{user_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}} AND {{usage_count@product_event}} > 0), 0)) AS feature_depth","staged":false,"placeholders":["event_date@product_event","usage_count@product_event","user_id@product_event"]},"time_to_feature_adoption":{"metric":"Time to Feature Adoption","fields":["first_use_date","signup_date","snapshot_date"],"datasets":["user"],"sourceTable":"user","grain":"Per event, aggregate monthly","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ({{first_use_date@user}} - {{signup_date@user}})) FROM {{_table:user}} WHERE {{snapshot_date@user}} = {{_period_end}} AND ({{first_use_date@user}} >= {{_period_start}} AND {{first_use_date@user}} <= {{_period_end}})) AS time_to_feature_adoption","staged":false,"placeholders":["first_use_date@user","signup_date@user","snapshot_date@user"]},"breadth_of_adoption":{"metric":"Breadth of Adoption","fields":["customer_id","event_date","feature_id","product_event_type"],"datasets":["product_event"],"sourceTable":"product_event","grain":"Per event, aggregate monthly","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (CAST((SELECT COUNT(*) FROM (SELECT DISTINCT {{customer_id@product_event}}, {{feature_id@product_event}} FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}} AND {{customer_id@product_event}} IS NOT NULL AND {{feature_id@product_event}} IS NOT NULL) _pairs) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{customer_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}} AND {{product_event_type@product_event}} = 'qualifying')), 0)) AS breadth_of_adoption","staged":false,"placeholders":["customer_id@product_event","event_date@product_event","feature_id@product_event","product_event_type@product_event"]},"session_frequency":{"metric":"Session Frequency","fields":["event_date","product_event_type","session_id","user_id"],"datasets":["product_event"],"sourceTable":"product_event","grain":"Per event, aggregate monthly","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{session_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}}) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{user_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}} AND {{product_event_type@product_event}} = 'qualifying'), 0)) AS session_frequency","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","session_id@product_event","user_id@product_event"]},"session_duration":{"metric":"Session Duration","fields":["event_date","session_duration"],"datasets":["product_event"],"sourceTable":"product_event","grain":"Per event, aggregate monthly","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (SELECT AVG({{session_duration@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}}) AS session_duration","staged":false,"placeholders":["event_date@product_event","session_duration@product_event"]},"time_in_product":{"metric":"Time in Product","fields":["event_date","session_duration","snapshot_date","user_id"],"datasets":["product_event","user"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{session_duration@product_event}}), 0) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}}) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{user_id@user}}) FROM {{_table:user}} WHERE {{snapshot_date@user}} = {{_period_end}}), 0)) AS time_in_product","staged":false,"placeholders":["event_date@product_event","session_duration@product_event","snapshot_date@user","user_id@user"]},"actions_per_session":{"metric":"Actions per Session","fields":["event_date","session_id","usage_count"],"datasets":["product_event"],"sourceTable":"product_event","grain":"Per event, aggregate monthly","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{usage_count@product_event}}), 0) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}}) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{session_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}}), 0)) AS actions_per_session","staged":false,"placeholders":["event_date@product_event","session_id@product_event","usage_count@product_event"]},"pqas":{"metric":"Product Qualified Accounts (PQAs)","fields":["criteria_met","customer_id","snapshot_date"],"datasets":["customer"],"sourceTable":"customer","grain":"Daily snapshot","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{criteria_met@customer}} = TRUE) AS pqas","staged":false,"placeholders":["criteria_met@customer","customer_id@customer","snapshot_date@customer"]},"user_retention_day_n":{"metric":"User Retention (Day N)","fields":["event_date","product_event_type","signup_date","snapshot_date","user_id"],"datasets":["product_event","user"],"sourceTable":null,"grain":"Monthly cohort","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{user_id@product_event}}) FROM {{_table:product_event}} WHERE (({{product_event_type@product_event}} = 'qualifying' AND ({{signup_date@product_event}} >= {{_period_start}} AND {{signup_date@product_event}} <= {{_period_end}})) AND ({{event_date@product_event}} - {{signup_date@product_event}}) = 30)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{user_id@user}}) FROM {{_table:user}} WHERE {{snapshot_date@user}} = {{_period_end}} AND ({{signup_date@user}} >= {{_period_start}} AND {{signup_date@user}} <= {{_period_end}})), 0)) AS user_retention_day_n","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","signup_date@product_event","signup_date@user","snapshot_date@user","user_id@product_event","user_id@user"]},"cohort_retention":{"metric":"Cohort Retention","fields":["event_date","product_event_type","signup_date","snapshot_date","user_id"],"datasets":["product_event","user"],"sourceTable":null,"grain":"Monthly cohort","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{user_id@product_event}}) FROM {{_table:product_event}} WHERE ((({{product_event_type@product_event}} = 'qualifying' AND ({{signup_date@product_event}} >= {{_period_start}} AND {{signup_date@product_event}} <= {{_period_end}})) AND ({{event_date@product_event}} - {{signup_date@product_event}}) >= 49) AND ({{event_date@product_event}} - {{signup_date@product_event}}) < 56)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{user_id@user}}) FROM {{_table:user}} WHERE {{snapshot_date@user}} = {{_period_end}} AND ({{signup_date@user}} >= {{_period_start}} AND {{signup_date@user}} <= {{_period_end}})), 0)) AS cohort_retention","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","signup_date@product_event","signup_date@user","snapshot_date@user","user_id@product_event","user_id@user"]},"resurrection_rate":{"metric":"Resurrection Rate","fields":["event_date","product_event_type","snapshot_date","user_id","user_status"],"datasets":["product_event","user"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{user_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}} AND {{product_event_type@product_event}} = 'reactivation') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{user_id@user}}) FROM {{_table:user}} WHERE {{snapshot_date@user}} = {{_period_start}} AND {{user_status@user}} = 'dormant'), 0)) AS resurrection_rate","staged":false,"placeholders":["event_date@product_event","product_event_type@product_event","snapshot_date@user","user_id@product_event","user_id@user","user_status@user"]},"release_frequency":{"metric":"Release Frequency","fields":["release_date","release_id"],"datasets":["release"],"sourceTable":"release","grain":"Per event","frequency":"Per deploy","source":"CI/CD","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{release_id@release}}) FROM {{_table:release}} WHERE {{release_date@release}} >= {{_period_start}} AND {{release_date@release}} <= {{_period_end}}) AS release_frequency","staged":false,"placeholders":["release_date@release","release_id@release"]},"feature_delivery_rate":{"metric":"Feature Delivery Rate","fields":["actual_date","feature_id","planned_date","snapshot_date"],"datasets":["feature"],"sourceTable":"feature","grain":"Per event","frequency":"Per milestone","source":"CI/CD","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{feature_id@feature}}) FROM {{_table:feature}} WHERE {{snapshot_date@feature}} = {{_period_end}} AND (({{planned_date@feature}} >= {{_period_start}} AND {{planned_date@feature}} <= {{_period_end}}) AND {{actual_date@feature}} <= {{planned_date@feature}})) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{feature_id@feature}}) FROM {{_table:feature}} WHERE {{snapshot_date@feature}} = {{_period_end}} AND ({{planned_date@feature}} >= {{_period_start}} AND {{planned_date@feature}} <= {{_period_end}})), 0)) AS feature_delivery_rate","staged":false,"placeholders":["actual_date@feature","feature_id@feature","planned_date@feature","snapshot_date@feature"]},"roadmap_completion":{"metric":"Roadmap Completion","fields":["roadmap_item_completed","roadmap_item_id","snapshot_date"],"datasets":["roadmap_item"],"sourceTable":"roadmap_item","grain":"Open work items at period end","frequency":"Daily","source":"Derived","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{roadmap_item_id@roadmap_item}}) FROM {{_table:roadmap_item}} WHERE {{snapshot_date@roadmap_item}} = {{_period_end}} AND {{roadmap_item_completed@roadmap_item}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{roadmap_item_id@roadmap_item}}) FROM {{_table:roadmap_item}} WHERE {{snapshot_date@roadmap_item}} = {{_period_end}}), 0)) AS roadmap_completion","staged":false,"placeholders":["roadmap_item_completed@roadmap_item","roadmap_item_id@roadmap_item","snapshot_date@roadmap_item"]},"time_to_market":{"metric":"Time to Market","fields":["feature_created_date","release_date","snapshot_date"],"datasets":["feature"],"sourceTable":"feature","grain":"Per event","frequency":"Per milestone","source":"CI/CD","parameterizedQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ({{release_date@feature}} - {{feature_created_date@feature}})) FROM {{_table:feature}} WHERE {{snapshot_date@feature}} = {{_period_end}} AND ({{release_date@feature}} >= {{_period_start}} AND {{release_date@feature}} <= {{_period_end}})) AS time_to_market","staged":false,"placeholders":["feature_created_date@feature","release_date@feature","snapshot_date@feature"]},"error_rate_user_facing":{"metric":"Error Rate (User-Facing)","fields":["event_date","event_id","product_event_type"],"datasets":["product_event"],"sourceTable":"product_event","grain":"Per event, aggregate monthly","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (CAST((SELECT COUNT({{event_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}} AND {{product_event_type@product_event}} = 'error') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{event_id@product_event}}) FROM {{_table:product_event}} WHERE {{event_date@product_event}} >= {{_period_start}} AND {{event_date@product_event}} <= {{_period_end}} AND {{product_event_type@product_event}} IN ('action', 'error')), 0)) AS error_rate_user_facing","staged":false,"placeholders":["event_date@product_event","event_id@product_event","product_event_type@product_event"]},"bug_escape_rate":{"metric":"Bug Escape Rate","fields":["created_at","issue_environment","issue_id","issue_type"],"datasets":["issue"],"sourceTable":"issue","grain":"Per event, aggregate monthly","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{issue_id@issue}}) FROM {{_table:issue}} WHERE {{created_at@issue}} >= {{_period_start}} AND {{created_at@issue}} < ({{_period_end}} + INTERVAL '1 day') AND ({{issue_type@issue}} = 'bug' AND {{issue_environment@issue}} = 'production')) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{issue_id@issue}}) FROM {{_table:issue}} WHERE {{created_at@issue}} >= {{_period_start}} AND {{created_at@issue}} < ({{_period_end}} + INTERVAL '1 day') AND {{issue_type@issue}} = 'bug'), 0)) AS bug_escape_rate","staged":false,"placeholders":["created_at@issue","issue_environment@issue","issue_id@issue","issue_type@issue"]},"user_reported_issues":{"metric":"User-Reported Issues","fields":["created_at","issue_id","issue_source","issue_type"],"datasets":["issue"],"sourceTable":"issue","grain":"Per event, aggregate monthly","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{issue_id@issue}}) FROM {{_table:issue}} WHERE {{created_at@issue}} >= {{_period_start}} AND {{created_at@issue}} < ({{_period_end}} + INTERVAL '1 day') AND ({{issue_type@issue}} = 'bug' AND {{issue_source@issue}} = 'user_report')) AS user_reported_issues","staged":false,"placeholders":["created_at@issue","issue_id@issue","issue_source@issue","issue_type@issue"]},"feature_request_volume":{"metric":"Feature Request Volume","fields":["created_at","issue_id","issue_type"],"datasets":["issue"],"sourceTable":"issue","grain":"Per event, aggregate monthly","frequency":"Daily","source":"Product Analytics","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{issue_id@issue}}) FROM {{_table:issue}} WHERE {{created_at@issue}} >= {{_period_start}} AND {{created_at@issue}} < ({{_period_end}} + INTERVAL '1 day') AND {{issue_type@issue}} = 'feature_request') AS feature_request_volume","staged":false,"placeholders":["created_at@issue","issue_id@issue","issue_type@issue"]},"services_revenue":{"metric":"Services Revenue","fields":["period_start","revenue","revenue_type"],"datasets":["financials"],"sourceTable":"financials","grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}} AND {{revenue_type@financials}} = 'services') AS services_revenue","staged":false,"placeholders":["period_start@financials","revenue@financials","revenue_type@financials"]},"services_as_of_total_revenue":{"metric":"Services as % of Total Revenue","fields":["period_start","revenue","revenue_type"],"datasets":["financials"],"sourceTable":"financials","grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}} AND {{revenue_type@financials}} = 'services')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}}), 0)) AS services_as_of_total_revenue","staged":false,"placeholders":["period_start@financials","revenue@financials","revenue_type@financials"]},"services_attach_rate":{"metric":"Services Attach Rate","fields":["close_date","includes_services","opportunity_id","opportunity_stage","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{includes_services@opportunity}} = TRUE AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{opportunity_stage@opportunity}} = 'closed_won' AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))), 0)) AS services_attach_rate","staged":false,"placeholders":["close_date@opportunity","includes_services@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},"average_services_deal_size":{"metric":"Average Services Deal Size","fields":["opportunity_amount","opportunity_id","revenue_type","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND {{revenue_type@opportunity}} = 'services') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND {{revenue_type@opportunity}} = 'services'), 0)) AS average_services_deal_size","staged":false,"placeholders":["opportunity_amount@opportunity","opportunity_id@opportunity","revenue_type@opportunity","snapshot_date@opportunity"]},"services_backlog":{"metric":"Services Backlog","fields":["opportunity_amount","opportunity_stage","period_start","revenue","revenue_type","snapshot_date"],"datasets":["financials","opportunity"],"sourceTable":null,"grain":"Cumulative balance at period end","frequency":"Monthly","source":"CRM","parameterizedQuery":"SELECT ((SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{revenue_type@opportunity}} = 'services' AND {{opportunity_stage@opportunity}} = 'closed_won')) - ((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} <= {{_period_end}} AND {{revenue_type@financials}} = 'services'))) AS services_backlog","staged":false,"placeholders":["opportunity_amount@opportunity","opportunity_stage@opportunity","period_start@financials","revenue@financials","revenue_type@financials","revenue_type@opportunity","snapshot_date@opportunity"]},"services_gross_margin":{"metric":"Services Gross Margin","fields":["cost","cost_function","event_date","period_start","revenue","revenue_type"],"datasets":["cost_event","financials"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}} AND {{revenue_type@financials}} = 'services')) - (SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'services_delivery')) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}} AND {{revenue_type@financials}} = 'services')), 0)) AS services_gross_margin","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","event_date@cost_event","period_start@financials","revenue@financials","revenue_type@financials"]},"project_margin":{"metric":"Project Margin","fields":["project_completion_date","project_cost","project_revenue","snapshot_date"],"datasets":["project"],"sourceTable":"project","grain":"Monthly aggregate","frequency":"Monthly","source":"PSA","parameterizedQuery":"SELECT (CAST(((SELECT COALESCE(SUM({{project_revenue@project}}), 0) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}} AND ({{project_completion_date@project}} >= {{_period_start}} AND {{project_completion_date@project}} <= {{_period_end}})) - (SELECT COALESCE(SUM({{project_cost@project}}), 0) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}} AND ({{project_completion_date@project}} >= {{_period_start}} AND {{project_completion_date@project}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{project_revenue@project}}), 0) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}} AND ({{project_completion_date@project}} >= {{_period_start}} AND {{project_completion_date@project}} <= {{_period_end}})), 0)) AS project_margin","staged":false,"placeholders":["project_completion_date@project","project_cost@project","project_revenue@project","snapshot_date@project"]},"realization_rate":{"metric":"Realization Rate","fields":["billed_hours","billed_revenue","entry_date","standard_rate"],"datasets":["time_entry"],"sourceTable":"time_entry","grain":"Monthly aggregate","frequency":"Monthly","source":"PSA","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{billed_revenue@time_entry}}), 0) FROM {{_table:time_entry}} WHERE {{entry_date@time_entry}} >= {{_period_start}} AND {{entry_date@time_entry}} <= {{_period_end}}) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM(({{billed_hours@time_entry}} * {{standard_rate@time_entry}})), 0) FROM {{_table:time_entry}} WHERE {{entry_date@time_entry}} >= {{_period_start}} AND {{entry_date@time_entry}} <= {{_period_end}}), 0)) AS realization_rate","staged":false,"placeholders":["billed_hours@time_entry","billed_revenue@time_entry","entry_date@time_entry","standard_rate@time_entry"]},"write_off_rate":{"metric":"Write-off Rate","fields":["billed_hours","entry_date","written_off_hours"],"datasets":["time_entry"],"sourceTable":"time_entry","grain":"Monthly aggregate","frequency":"Monthly","source":"PSA","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{written_off_hours@time_entry}}), 0) FROM {{_table:time_entry}} WHERE {{entry_date@time_entry}} >= {{_period_start}} AND {{entry_date@time_entry}} <= {{_period_end}}) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{billed_hours@time_entry}}), 0) FROM {{_table:time_entry}} WHERE {{entry_date@time_entry}} >= {{_period_start}} AND {{entry_date@time_entry}} <= {{_period_end}}), 0)) AS write_off_rate","staged":false,"placeholders":["billed_hours@time_entry","entry_date@time_entry","written_off_hours@time_entry"]},"billable_utilization":{"metric":"Billable Utilization","fields":["available_hours","entry_date","hours","period_start","time_entry_type"],"datasets":["consultant","time_entry"],"sourceTable":null,"grain":"Weekly aggregate","frequency":"Weekly","source":"PSA","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{hours@time_entry}}), 0) FROM {{_table:time_entry}} WHERE {{entry_date@time_entry}} >= {{_period_start}} AND {{entry_date@time_entry}} <= {{_period_end}} AND {{time_entry_type@time_entry}} = 'billable') AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{available_hours@consultant}}), 0) FROM {{_table:consultant}} WHERE {{period_start@consultant}} >= {{_period_start}} AND {{period_start@consultant}} <= {{_period_end}}), 0)) AS billable_utilization","staged":false,"placeholders":["available_hours@consultant","entry_date@time_entry","hours@time_entry","period_start@consultant","time_entry_type@time_entry"]},"total_utilization":{"metric":"Total Utilization","fields":["available_hours","entry_date","hours","period_start","time_entry_type"],"datasets":["consultant","time_entry"],"sourceTable":null,"grain":"Weekly aggregate","frequency":"Weekly","source":"PSA","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{hours@time_entry}}), 0) FROM {{_table:time_entry}} WHERE {{entry_date@time_entry}} >= {{_period_start}} AND {{entry_date@time_entry}} <= {{_period_end}} AND {{time_entry_type@time_entry}} IN ('billable', 'training', 'pre_sales', 'internal')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{available_hours@consultant}}), 0) FROM {{_table:consultant}} WHERE {{period_start@consultant}} >= {{_period_start}} AND {{period_start@consultant}} <= {{_period_end}}), 0)) AS total_utilization","staged":false,"placeholders":["available_hours@consultant","entry_date@time_entry","hours@time_entry","period_start@consultant","time_entry_type@time_entry"]},"bench_rate":{"metric":"Bench Rate","fields":["consultant_id","period_start","project_id","snapshot_date"],"datasets":["consultant","project"],"sourceTable":null,"grain":"Weekly snapshot","frequency":"Weekly","source":"PSA","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{consultant_id@project}}) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}} AND {{project_id@project}} IS NULL) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{consultant_id@consultant}}) FROM {{_table:consultant}} WHERE {{period_start@consultant}} >= {{_period_start}} AND {{period_start@consultant}} <= {{_period_end}}), 0)) AS bench_rate","staged":false,"placeholders":["consultant_id@consultant","consultant_id@project","period_start@consultant","project_id@project","snapshot_date@project"]},"capacity":{"metric":"Capacity","fields":["available_hours","period_start"],"datasets":["consultant"],"sourceTable":"consultant","grain":"Weekly aggregate","frequency":"Weekly","source":"PSA","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{available_hours@consultant}}), 0) FROM {{_table:consultant}} WHERE {{period_start@consultant}} >= {{_period_start}} AND {{period_start@consultant}} <= {{_period_end}}) AS capacity","staged":false,"placeholders":["available_hours@consultant","period_start@consultant"]},"capacity_utilization":{"metric":"Capacity Utilization","fields":["available_hours","hours_budgeted","period_start","snapshot_date"],"datasets":["consultant","project"],"sourceTable":null,"grain":"Weekly aggregate","frequency":"Weekly","source":"PSA","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{hours_budgeted@project}}), 0) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}}) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{available_hours@consultant}}), 0) FROM {{_table:consultant}} WHERE {{period_start@consultant}} >= {{_period_start}} AND {{period_start@consultant}} <= {{_period_end}})), 0)) AS capacity_utilization","staged":false,"placeholders":["available_hours@consultant","hours_budgeted@project","period_start@consultant","snapshot_date@project"]},"on_time_delivery":{"metric":"On-Time Delivery","fields":["project_completion_date","project_id","snapshot_date","target_date"],"datasets":["project"],"sourceTable":"project","grain":"Per event","frequency":"Per milestone","source":"PSA","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{project_id@project}}) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}} AND (({{project_completion_date@project}} >= {{_period_start}} AND {{project_completion_date@project}} <= {{_period_end}}) AND {{project_completion_date@project}} <= {{target_date@project}})) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{project_id@project}}) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}} AND ({{project_completion_date@project}} >= {{_period_start}} AND {{project_completion_date@project}} <= {{_period_end}})), 0)) AS on_time_delivery","staged":false,"placeholders":["project_completion_date@project","project_id@project","snapshot_date@project","target_date@project"]},"on_budget_delivery":{"metric":"On-Budget Delivery","fields":["hours_actual","hours_budgeted","project_completion_date","project_id","snapshot_date"],"datasets":["project"],"sourceTable":"project","grain":"Per event","frequency":"Per milestone","source":"PSA","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{project_id@project}}) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}} AND (({{project_completion_date@project}} >= {{_period_start}} AND {{project_completion_date@project}} <= {{_period_end}}) AND {{hours_actual@project}} <= {{hours_budgeted@project}})) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{project_id@project}}) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}} AND ({{project_completion_date@project}} >= {{_period_start}} AND {{project_completion_date@project}} <= {{_period_end}})), 0)) AS on_budget_delivery","staged":false,"placeholders":["hours_actual@project","hours_budgeted@project","project_completion_date@project","project_id@project","snapshot_date@project"]},"scope_change_rate":{"metric":"Scope Change Rate","fields":["project_id","scope_changed","snapshot_date"],"datasets":["project"],"sourceTable":"project","grain":"Weekly snapshot","frequency":"Weekly","source":"PSA","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{project_id@project}}) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}} AND {{scope_changed@project}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{project_id@project}}) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}}), 0)) AS scope_change_rate","staged":false,"placeholders":["project_id@project","scope_changed@project","snapshot_date@project"]},"project_duration_accuracy":{"metric":"Project Duration Accuracy","fields":["project_completion_date","project_start_date","snapshot_date","target_date"],"datasets":["project"],"sourceTable":"project","grain":"Per event","frequency":"Per milestone","source":"PSA","parameterizedQuery":"SELECT (SELECT AVG((CAST(({{target_date@project}} - {{project_start_date@project}}) AS DOUBLE PRECISION) / NULLIF(({{project_completion_date@project}} - {{project_start_date@project}}), 0))) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}} AND ({{project_completion_date@project}} >= {{_period_start}} AND {{project_completion_date@project}} <= {{_period_end}})) AS project_duration_accuracy","staged":false,"placeholders":["project_completion_date@project","project_start_date@project","snapshot_date@project","target_date@project"]},"project_milestone_completion_rate":{"metric":"Project Milestone Completion Rate","fields":["actual_date","planned_date","project_milestone_id","snapshot_date"],"datasets":["project_milestone"],"sourceTable":"project_milestone","grain":"Per event","frequency":"Per milestone","source":"PSA","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{project_milestone_id@project_milestone}}) FROM {{_table:project_milestone}} WHERE {{snapshot_date@project_milestone}} = {{_period_end}} AND (({{actual_date@project_milestone}} >= {{_period_start}} AND {{actual_date@project_milestone}} <= {{_period_end}}) AND {{actual_date@project_milestone}} <= {{planned_date@project_milestone}})) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{project_milestone_id@project_milestone}}) FROM {{_table:project_milestone}} WHERE {{snapshot_date@project_milestone}} = {{_period_end}} AND ({{actual_date@project_milestone}} >= {{_period_start}} AND {{actual_date@project_milestone}} <= {{_period_end}})), 0)) AS project_milestone_completion_rate","staged":false,"placeholders":["actual_date@project_milestone","planned_date@project_milestone","project_milestone_id@project_milestone","snapshot_date@project_milestone"]},"project_csat":{"metric":"Project CSAT","fields":["satisfaction_score","survey_date","survey_type"],"datasets":["survey_response"],"sourceTable":"survey_response","grain":"Per survey response","frequency":"Per response","source":"Survey Tool","parameterizedQuery":"SELECT (CAST((SELECT COUNT({{satisfaction_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND ({{survey_type@survey_response}} = 'project' AND {{satisfaction_score@survey_response}} >= 4)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{satisfaction_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND {{survey_type@survey_response}} = 'project'), 0)) AS project_csat","staged":false,"placeholders":["satisfaction_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},"project_nps":{"metric":"Project NPS","fields":["nps_score","survey_date","survey_type"],"datasets":["survey_response"],"sourceTable":"survey_response","grain":"Per survey response","frequency":"Per response","source":"Survey Tool","parameterizedQuery":"SELECT ((CAST(((SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND ({{survey_type@survey_response}} = 'project' AND {{nps_score@survey_response}} >= 9)) - (SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND ({{survey_type@survey_response}} = 'project' AND {{nps_score@survey_response}} <= 6))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{nps_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND {{survey_type@survey_response}} = 'project'), 0)) * 100) AS project_nps","staged":false,"placeholders":["nps_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},"project_escalation_rate":{"metric":"Project Escalation Rate","fields":["escalated","project_id","snapshot_date"],"datasets":["project"],"sourceTable":"project","grain":"Weekly snapshot","frequency":"Weekly","source":"PSA","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{project_id@project}}) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}} AND {{escalated@project}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{project_id@project}}) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}}), 0)) AS project_escalation_rate","staged":false,"placeholders":["escalated@project","project_id@project","snapshot_date@project"]},"rework_rate":{"metric":"Rework Rate","fields":["deliverable_id","reworked","snapshot_date"],"datasets":["deliverable"],"sourceTable":"deliverable","grain":"Weekly snapshot","frequency":"Weekly","source":"PSA","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{deliverable_id@deliverable}}) FROM {{_table:deliverable}} WHERE {{snapshot_date@deliverable}} = {{_period_end}} AND {{reworked@deliverable}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{deliverable_id@deliverable}}) FROM {{_table:deliverable}} WHERE {{snapshot_date@deliverable}} = {{_period_end}}), 0)) AS rework_rate","staged":false,"placeholders":["deliverable_id@deliverable","reworked@deliverable","snapshot_date@deliverable"]},"reference_ability":{"metric":"Reference-ability","fields":["project_completion_date","project_id","referenceable","snapshot_date"],"datasets":["project"],"sourceTable":"project","grain":"Per event","frequency":"Per milestone","source":"PSA","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{project_id@project}}) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}} AND (({{project_completion_date@project}} >= {{_period_start}} AND {{project_completion_date@project}} <= {{_period_end}}) AND {{referenceable@project}} = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{project_id@project}}) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}} AND ({{project_completion_date@project}} >= {{_period_start}} AND {{project_completion_date@project}} <= {{_period_end}})), 0)) AS reference_ability","staged":false,"placeholders":["project_completion_date@project","project_id@project","referenceable@project","snapshot_date@project"]},"revenue_per_consultant":{"metric":"Revenue per Consultant","fields":["consultant_id","period_start","revenue","revenue_type"],"datasets":["consultant","financials"],"sourceTable":null,"grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}} AND {{revenue_type@financials}} = 'services')) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{consultant_id@consultant}}) FROM {{_table:consultant}} WHERE {{period_start@consultant}} >= {{_period_start}} AND {{period_start@consultant}} <= {{_period_end}}), 0)) AS revenue_per_consultant","staged":false,"placeholders":["consultant_id@consultant","period_start@consultant","period_start@financials","revenue@financials","revenue_type@financials"]},"projects_per_consultant":{"metric":"Projects per Consultant","fields":["consultant_id","project_completion_date","project_id","snapshot_date"],"datasets":["project"],"sourceTable":"project","grain":"Per event","frequency":"Per milestone","source":"PSA","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{project_id@project}}) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}} AND ({{project_completion_date@project}} >= {{_period_start}} AND {{project_completion_date@project}} <= {{_period_end}})) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{consultant_id@project}}) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}} AND ({{project_completion_date@project}} >= {{_period_start}} AND {{project_completion_date@project}} <= {{_period_end}})), 0)) AS projects_per_consultant","staged":false,"placeholders":["consultant_id@project","project_completion_date@project","project_id@project","snapshot_date@project"]},"average_project_duration":{"metric":"Average Project Duration","fields":["project_completion_date","project_start_date","snapshot_date"],"datasets":["project"],"sourceTable":"project","grain":"Per event","frequency":"Per milestone","source":"PSA","parameterizedQuery":"SELECT (SELECT AVG(({{project_completion_date@project}} - {{project_start_date@project}})) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}} AND ({{project_completion_date@project}} >= {{_period_start}} AND {{project_completion_date@project}} <= {{_period_end}})) AS average_project_duration","staged":false,"placeholders":["project_completion_date@project","project_start_date@project","snapshot_date@project"]},"services_pipeline":{"metric":"Services Pipeline","fields":["opportunity_amount","opportunity_stage","revenue_type","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Daily snapshot","frequency":"Daily sync","source":"CRM","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{revenue_type@opportunity}} = 'services' AND {{opportunity_stage@opportunity}} NOT IN ('closed_won', 'closed_lost'))) AS services_pipeline","staged":false,"placeholders":["opportunity_amount@opportunity","opportunity_stage@opportunity","revenue_type@opportunity","snapshot_date@opportunity"]},"services_win_rate":{"metric":"Services Win Rate","fields":["close_date","opportunity_id","opportunity_stage","revenue_type","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{revenue_type@opportunity}} = 'services' AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{revenue_type@opportunity}} = 'services' AND {{opportunity_stage@opportunity}} IN ('closed_won', 'closed_lost')) AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))), 0)) AS services_win_rate","staged":false,"placeholders":["close_date@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","revenue_type@opportunity","snapshot_date@opportunity"]},"time_to_start":{"metric":"Time to Start","fields":["close_date","project_start_date","snapshot_date"],"datasets":["project"],"sourceTable":"project","grain":"Per event","frequency":"Per milestone","source":"PSA","parameterizedQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ({{project_start_date@project}} - {{close_date@project}})) FROM {{_table:project}} WHERE {{snapshot_date@project}} = {{_period_end}} AND ({{project_start_date@project}} >= {{_period_start}} AND {{project_start_date@project}} <= {{_period_end}})) AS time_to_start","staged":false,"placeholders":["close_date@project","project_start_date@project","snapshot_date@project"]},"pipeline_hygiene_score":{"metric":"Pipeline Hygiene Score","fields":["close_date_valid","opportunity_id","required_fields_complete","snapshot_date","stage_accurate","updated_within_sla"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Weekly snapshot","frequency":"Weekly","source":"CRM","parameterizedQuery":"SELECT (CAST(((((CAST((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND {{required_fields_complete@opportunity}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}}), 0)) + (CAST((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND {{updated_within_sla@opportunity}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}}), 0))) + (CAST((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND {{close_date_valid@opportunity}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}}), 0))) + (CAST((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND {{stage_accurate@opportunity}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}}), 0))) AS DOUBLE PRECISION) / 4) AS pipeline_hygiene_score","staged":false,"placeholders":["close_date_valid@opportunity","opportunity_id@opportunity","required_fields_complete@opportunity","snapshot_date@opportunity","stage_accurate@opportunity","updated_within_sla@opportunity"]},"forecast_accuracy":{"metric":"Forecast Accuracy","fields":["actual_revenue","forecasted_revenue","period_start"],"datasets":["forecast"],"sourceTable":"forecast","grain":"Monthly aggregate","frequency":"Monthly","source":"CRM","parameterizedQuery":"SELECT (1 - (CAST(ABS(((SELECT COALESCE(SUM({{forecasted_revenue@forecast}}), 0) FROM {{_table:forecast}} WHERE {{period_start@forecast}} >= {{_period_start}} AND {{period_start@forecast}} <= {{_period_end}}) - (SELECT COALESCE(SUM({{actual_revenue@forecast}}), 0) FROM {{_table:forecast}} WHERE {{period_start@forecast}} >= {{_period_start}} AND {{period_start@forecast}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{actual_revenue@forecast}}), 0) FROM {{_table:forecast}} WHERE {{period_start@forecast}} >= {{_period_start}} AND {{period_start@forecast}} <= {{_period_end}}), 0))) AS forecast_accuracy","staged":false,"placeholders":["actual_revenue@forecast","forecasted_revenue@forecast","period_start@forecast"]},"commit_accuracy":{"metric":"Commit Accuracy","fields":["close_date","forecast_category","opportunity_id","opportunity_stage","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Monthly aggregate","frequency":"Monthly","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND (({{forecast_category@opportunity}} = 'commit' AND {{opportunity_stage@opportunity}} = 'closed_won') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND {{forecast_category@opportunity}} = 'commit'), 0)) AS commit_accuracy","staged":false,"placeholders":["close_date@opportunity","forecast_category@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},"stage_conversion_rates":{"metric":"Stage Conversion Rates","fields":["advanced_to_next_stage","opportunity_id","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Weekly snapshot","frequency":"Weekly","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND {{advanced_to_next_stage@opportunity}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}}), 0)) AS stage_conversion_rates","staged":false,"placeholders":["advanced_to_next_stage@opportunity","opportunity_id@opportunity","snapshot_date@opportunity"]},"quote_volume":{"metric":"Quote Volume","fields":["quote_id","quote_sent_at","snapshot_date"],"datasets":["quote"],"sourceTable":"quote","grain":"Per event","frequency":"Per transaction","source":"CRM","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{quote_id@quote}}) FROM {{_table:quote}} WHERE {{snapshot_date@quote}} = {{_period_end}} AND ({{quote_sent_at@quote}} >= {{_period_start}} AND {{quote_sent_at@quote}} < ({{_period_end}} + INTERVAL '1 day'))) AS quote_volume","staged":false,"placeholders":["quote_id@quote","quote_sent_at@quote","snapshot_date@quote"]},"quote_to_order_rate":{"metric":"Quote-to-Order Rate","fields":["order_completed_at","order_id","quote_id","quote_sent_at","snapshot_date"],"datasets":["order","quote"],"sourceTable":null,"grain":"Per event","frequency":"Per transaction","source":"Billing","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{order_id@order}}) FROM {{_table:order}} WHERE {{snapshot_date@order}} = {{_period_end}} AND ({{order_completed_at@order}} >= {{_period_start}} AND {{order_completed_at@order}} < ({{_period_end}} + INTERVAL '1 day'))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{quote_id@quote}}) FROM {{_table:quote}} WHERE {{snapshot_date@quote}} = {{_period_end}} AND ({{quote_sent_at@quote}} >= {{_period_start}} AND {{quote_sent_at@quote}} < ({{_period_end}} + INTERVAL '1 day'))), 0)) AS quote_to_order_rate","staged":false,"placeholders":["order_completed_at@order","order_id@order","quote_id@quote","quote_sent_at@quote","snapshot_date@order","snapshot_date@quote"]},"quote_cycle_time":{"metric":"Quote Cycle Time","fields":["quote_requested_at","quote_sent_at","snapshot_date"],"datasets":["quote"],"sourceTable":"quote","grain":"Per event","frequency":"Per transaction","source":"CRM","parameterizedQuery":"SELECT ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (EXTRACT(EPOCH FROM ({{quote_sent_at@quote}} - {{quote_requested_at@quote}})) / 86400.0)) FROM {{_table:quote}} WHERE {{snapshot_date@quote}} = {{_period_end}} AND ({{quote_sent_at@quote}} >= {{_period_start}} AND {{quote_sent_at@quote}} < ({{_period_end}} + INTERVAL '1 day'))) * 24) AS quote_cycle_time","staged":false,"placeholders":["quote_requested_at@quote","quote_sent_at@quote","snapshot_date@quote"]},"quote_accuracy":{"metric":"Quote Accuracy","fields":["quote_id","quote_sent_at","revision_count","snapshot_date"],"datasets":["quote"],"sourceTable":"quote","grain":"Per event","frequency":"Per transaction","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{quote_id@quote}}) FROM {{_table:quote}} WHERE {{snapshot_date@quote}} = {{_period_end}} AND (({{quote_sent_at@quote}} >= {{_period_start}} AND {{quote_sent_at@quote}} < ({{_period_end}} + INTERVAL '1 day')) AND {{revision_count@quote}} = 0)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{quote_id@quote}}) FROM {{_table:quote}} WHERE {{snapshot_date@quote}} = {{_period_end}} AND ({{quote_sent_at@quote}} >= {{_period_start}} AND {{quote_sent_at@quote}} < ({{_period_end}} + INTERVAL '1 day'))), 0)) AS quote_accuracy","staged":false,"placeholders":["quote_id@quote","quote_sent_at@quote","revision_count@quote","snapshot_date@quote"]},"discount_rate":{"metric":"Discount Rate","fields":["list_price","quote_sent_at","quoted_price","snapshot_date"],"datasets":["quote"],"sourceTable":"quote","grain":"Per event","frequency":"Per transaction","source":"CRM","parameterizedQuery":"SELECT (CAST(((SELECT COALESCE(SUM({{list_price@quote}}), 0) FROM {{_table:quote}} WHERE {{snapshot_date@quote}} = {{_period_end}} AND ({{quote_sent_at@quote}} >= {{_period_start}} AND {{quote_sent_at@quote}} < ({{_period_end}} + INTERVAL '1 day'))) - (SELECT COALESCE(SUM({{quoted_price@quote}}), 0) FROM {{_table:quote}} WHERE {{snapshot_date@quote}} = {{_period_end}} AND ({{quote_sent_at@quote}} >= {{_period_start}} AND {{quote_sent_at@quote}} < ({{_period_end}} + INTERVAL '1 day')))) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{list_price@quote}}), 0) FROM {{_table:quote}} WHERE {{snapshot_date@quote}} = {{_period_end}} AND ({{quote_sent_at@quote}} >= {{_period_start}} AND {{quote_sent_at@quote}} < ({{_period_end}} + INTERVAL '1 day'))), 0)) AS discount_rate","staged":false,"placeholders":["list_price@quote","quote_sent_at@quote","quoted_price@quote","snapshot_date@quote"]},"order_to_activation_time":{"metric":"Order-to-Activation Time","fields":["acquisition_date","activation_date","snapshot_date"],"datasets":["customer"],"sourceTable":"customer","grain":"Per event","frequency":"Per transaction","source":"Billing","parameterizedQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ({{activation_date@customer}} - {{acquisition_date@customer}})) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND ({{activation_date@customer}} >= {{_period_start}} AND {{activation_date@customer}} <= {{_period_end}})) AS order_to_activation_time","staged":false,"placeholders":["acquisition_date@customer","activation_date@customer","snapshot_date@customer"]},"order_processing_time":{"metric":"Order Processing Time","fields":["order_completed_at","order_received_at","snapshot_date"],"datasets":["order"],"sourceTable":"order","grain":"Per event","frequency":"Per transaction","source":"Billing","parameterizedQuery":"SELECT ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (EXTRACT(EPOCH FROM ({{order_completed_at@order}} - {{order_received_at@order}})) / 86400.0)) FROM {{_table:order}} WHERE {{snapshot_date@order}} = {{_period_end}} AND ({{order_completed_at@order}} >= {{_period_start}} AND {{order_completed_at@order}} < ({{_period_end}} + INTERVAL '1 day'))) * 24) AS order_processing_time","staged":false,"placeholders":["order_completed_at@order","order_received_at@order","snapshot_date@order"]},"order_error_rate":{"metric":"Order Error Rate","fields":["has_error","order_completed_at","order_id","snapshot_date"],"datasets":["order"],"sourceTable":"order","grain":"Per event","frequency":"Per transaction","source":"Billing","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{order_id@order}}) FROM {{_table:order}} WHERE {{snapshot_date@order}} = {{_period_end}} AND (({{order_completed_at@order}} >= {{_period_start}} AND {{order_completed_at@order}} < ({{_period_end}} + INTERVAL '1 day')) AND {{has_error@order}} = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{order_id@order}}) FROM {{_table:order}} WHERE {{snapshot_date@order}} = {{_period_end}} AND ({{order_completed_at@order}} >= {{_period_start}} AND {{order_completed_at@order}} < ({{_period_end}} + INTERVAL '1 day'))), 0)) AS order_error_rate","staged":false,"placeholders":["has_error@order","order_completed_at@order","order_id@order","snapshot_date@order"]},"billing_accuracy":{"metric":"Billing Accuracy","fields":["invoice_corrected","invoice_date","invoice_id","snapshot_date"],"datasets":["invoice"],"sourceTable":"invoice","grain":"Per event","frequency":"Per transaction","source":"Billing","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{invoice_id@invoice}}) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}} AND (({{invoice_date@invoice}} >= {{_period_start}} AND {{invoice_date@invoice}} <= {{_period_end}}) AND {{invoice_corrected@invoice}} = FALSE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{invoice_id@invoice}}) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}} AND ({{invoice_date@invoice}} >= {{_period_start}} AND {{invoice_date@invoice}} <= {{_period_end}})), 0)) AS billing_accuracy","staged":false,"placeholders":["invoice_corrected@invoice","invoice_date@invoice","invoice_id@invoice","snapshot_date@invoice"]},"invoice_cycle_time":{"metric":"Invoice Cycle Time","fields":["billing_trigger_date","invoice_date","snapshot_date"],"datasets":["invoice"],"sourceTable":"invoice","grain":"Per event","frequency":"Per transaction","source":"Billing","parameterizedQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ({{invoice_date@invoice}} - {{billing_trigger_date@invoice}})) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}} AND ({{invoice_date@invoice}} >= {{_period_start}} AND {{invoice_date@invoice}} <= {{_period_end}})) AS invoice_cycle_time","staged":false,"placeholders":["billing_trigger_date@invoice","invoice_date@invoice","snapshot_date@invoice"]},"billing_disputes":{"metric":"Billing Disputes","fields":["invoice_date","invoice_disputed","invoice_id","snapshot_date"],"datasets":["invoice"],"sourceTable":"invoice","grain":"Per event","frequency":"Per transaction","source":"Billing","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{invoice_id@invoice}}) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}} AND (({{invoice_date@invoice}} >= {{_period_start}} AND {{invoice_date@invoice}} <= {{_period_end}}) AND {{invoice_disputed@invoice}} = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{invoice_id@invoice}}) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}} AND ({{invoice_date@invoice}} >= {{_period_start}} AND {{invoice_date@invoice}} <= {{_period_end}})), 0)) AS billing_disputes","staged":false,"placeholders":["invoice_date@invoice","invoice_disputed@invoice","invoice_id@invoice","snapshot_date@invoice"]},"credit_memo_rate":{"metric":"Credit Memo Rate","fields":["credit_memo_count","invoice_date","invoice_id","snapshot_date"],"datasets":["invoice"],"sourceTable":"invoice","grain":"Per event","frequency":"Per transaction","source":"Billing","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{invoice_id@invoice}}) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}} AND (({{invoice_date@invoice}} >= {{_period_start}} AND {{invoice_date@invoice}} <= {{_period_end}}) AND {{credit_memo_count@invoice}} > 0)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{invoice_id@invoice}}) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}} AND ({{invoice_date@invoice}} >= {{_period_start}} AND {{invoice_date@invoice}} <= {{_period_end}})), 0)) AS credit_memo_rate","staged":false,"placeholders":["credit_memo_count@invoice","invoice_date@invoice","invoice_id@invoice","snapshot_date@invoice"]},"dso":{"metric":"Days Sales Outstanding (DSO)","fields":["accounts_receivable","period_start","revenue","snapshot_date"],"datasets":["balance_sheet","financials"],"sourceTable":null,"grain":"End-of-month receivables snapshot","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT ((CAST((SELECT COALESCE(SUM({{accounts_receivable@balance_sheet}}), 0) FROM {{_table:balance_sheet}} WHERE {{snapshot_date@balance_sheet}} = {{_period_end}}) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{revenue@financials}}), 0) FROM {{_table:financials}} WHERE {{period_start@financials}} >= {{_period_start}} AND {{period_start@financials}} <= {{_period_end}})), 0)) * ({{_period_end}} - {{_period_start}} + 1)) AS dso","staged":false,"placeholders":["accounts_receivable@balance_sheet","period_start@financials","revenue@financials","snapshot_date@balance_sheet"]},"collection_effectiveness_index_cei":{"metric":"Collection Effectiveness Index (CEI)","fields":["accounts_receivable","invoice_amount","invoice_date","outstanding_amount","snapshot_date"],"datasets":["balance_sheet","invoice"],"sourceTable":null,"grain":"End-of-month receivables snapshot","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (CAST((((SELECT COALESCE(SUM({{accounts_receivable@balance_sheet}}), 0) FROM {{_table:balance_sheet}} WHERE {{snapshot_date@balance_sheet}} = {{_period_start}}) + (SELECT COALESCE(SUM({{invoice_amount@invoice}}), 0) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}} AND ({{invoice_date@invoice}} >= {{_period_start}} AND {{invoice_date@invoice}} <= {{_period_end}}))) - (SELECT COALESCE(SUM({{accounts_receivable@balance_sheet}}), 0) FROM {{_table:balance_sheet}} WHERE {{snapshot_date@balance_sheet}} = {{_period_end}})) AS DOUBLE PRECISION) / NULLIF((((SELECT COALESCE(SUM({{accounts_receivable@balance_sheet}}), 0) FROM {{_table:balance_sheet}} WHERE {{snapshot_date@balance_sheet}} = {{_period_start}}) + (SELECT COALESCE(SUM({{invoice_amount@invoice}}), 0) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}} AND ({{invoice_date@invoice}} >= {{_period_start}} AND {{invoice_date@invoice}} <= {{_period_end}}))) - (SELECT COALESCE(SUM({{outstanding_amount@invoice}}), 0) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}} AND ({{snapshot_date@invoice}} - {{invoice_date@invoice}}) <= 30)), 0)) AS collection_effectiveness_index_cei","staged":false,"placeholders":["accounts_receivable@balance_sheet","invoice_amount@invoice","invoice_date@invoice","outstanding_amount@invoice","snapshot_date@balance_sheet","snapshot_date@invoice"]},"aging_buckets":{"metric":"Aging Buckets","fields":["invoice_date","outstanding_amount","snapshot_date"],"datasets":["invoice"],"sourceTable":"invoice","grain":"End-of-month receivables snapshot","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT _d.bucket AS bucket, (CAST((SELECT COALESCE(SUM({{outstanding_amount@invoice}}), 0) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}} AND CASE WHEN ({{snapshot_date@invoice}} - {{invoice_date@invoice}}) BETWEEN 0 AND 30 THEN 'current' WHEN ({{snapshot_date@invoice}} - {{invoice_date@invoice}}) BETWEEN 31 AND 60 THEN 'days_31_60' WHEN ({{snapshot_date@invoice}} - {{invoice_date@invoice}}) BETWEEN 61 AND 90 THEN 'days_61_90' WHEN ({{snapshot_date@invoice}} - {{invoice_date@invoice}}) >= 91 THEN 'days_90_plus' END = _d.bucket) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{outstanding_amount@invoice}}), 0) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}}), 0)) AS aging_buckets\nFROM (SELECT 'current' AS bucket UNION ALL SELECT 'days_31_60' AS bucket UNION ALL SELECT 'days_61_90' AS bucket UNION ALL SELECT 'days_90_plus' AS bucket) _d","staged":false,"placeholders":["invoice_date@invoice","outstanding_amount@invoice","snapshot_date@invoice"],"breakdown":{"field":"bucket","expression":"field.snapshot_date - field.invoice_date","buckets":{"current":[0,30],"days_31_60":[31,60],"days_61_90":[61,90],"days_90_plus":[91,null]}}},"accounts_receivable_balance":{"metric":"Accounts Receivable Balance","fields":["outstanding_amount","snapshot_date"],"datasets":["invoice"],"sourceTable":"invoice","grain":"End-of-month receivables snapshot","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (SELECT COALESCE(SUM({{outstanding_amount@invoice}}), 0) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}} AND {{outstanding_amount@invoice}} > 0) AS accounts_receivable_balance","staged":false,"placeholders":["outstanding_amount@invoice","snapshot_date@invoice"]},"payment_method_distribution":{"metric":"Payment Method Distribution","fields":["invoice_amount","invoice_date","payment_method","snapshot_date"],"datasets":["invoice"],"sourceTable":"invoice","grain":"Per event","frequency":"Per transaction","source":"Billing","parameterizedQuery":"SELECT _d.payment_method AS payment_method, (CAST((SELECT COALESCE(SUM({{invoice_amount@invoice}}), 0) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}} AND ({{invoice_date@invoice}} >= {{_period_start}} AND {{invoice_date@invoice}} <= {{_period_end}}) AND {{payment_method@invoice}} = _d.payment_method) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{invoice_amount@invoice}}), 0) FROM {{_table:invoice}} WHERE {{snapshot_date@invoice}} = {{_period_end}} AND (({{invoice_date@invoice}} >= {{_period_start}} AND {{invoice_date@invoice}} <= {{_period_end}}) AND {{payment_method@invoice}} IS NOT NULL)), 0)) AS payment_method_distribution\nFROM (SELECT 'credit_card' AS payment_method UNION ALL SELECT 'ach' AS payment_method UNION ALL SELECT 'wire' AS payment_method UNION ALL SELECT 'check' AS payment_method UNION ALL SELECT 'other' AS payment_method) _d","staged":false,"placeholders":["invoice_amount@invoice","invoice_date@invoice","payment_method@invoice","snapshot_date@invoice"],"breakdown":{"field":"payment_method"}},"recognized_vs_billed":{"metric":"Recognized vs Billed","fields":["billed_amount","period_start","recognized_revenue"],"datasets":["revenue_schedule"],"sourceTable":"revenue_schedule","grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{recognized_revenue@revenue_schedule}}), 0) FROM {{_table:revenue_schedule}} WHERE {{period_start@revenue_schedule}} >= {{_period_start}} AND {{period_start@revenue_schedule}} <= {{_period_end}}) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{billed_amount@revenue_schedule}}), 0) FROM {{_table:revenue_schedule}} WHERE {{period_start@revenue_schedule}} >= {{_period_start}} AND {{period_start@revenue_schedule}} <= {{_period_end}}), 0)) AS recognized_vs_billed","staged":false,"placeholders":["billed_amount@revenue_schedule","period_start@revenue_schedule","recognized_revenue@revenue_schedule"]},"deferred_revenue_balance":{"metric":"Deferred Revenue Balance","fields":["billed_amount","period_start","recognized_revenue"],"datasets":["revenue_schedule"],"sourceTable":"revenue_schedule","grain":"Cumulative balance at period end","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT ((SELECT COALESCE(SUM({{billed_amount@revenue_schedule}}), 0) FROM {{_table:revenue_schedule}} WHERE {{period_start@revenue_schedule}} <= {{_period_end}}) - (SELECT COALESCE(SUM({{recognized_revenue@revenue_schedule}}), 0) FROM {{_table:revenue_schedule}} WHERE {{period_start@revenue_schedule}} <= {{_period_end}})) AS deferred_revenue_balance","staged":false,"placeholders":["billed_amount@revenue_schedule","period_start@revenue_schedule","recognized_revenue@revenue_schedule"]},"unbilled_revenue":{"metric":"Unbilled Revenue","fields":["billed_amount","period_start","recognized_revenue"],"datasets":["revenue_schedule"],"sourceTable":"revenue_schedule","grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (SELECT COALESCE(SUM(GREATEST(({{recognized_revenue@revenue_schedule}} - {{billed_amount@revenue_schedule}}), 0)), 0) FROM {{_table:revenue_schedule}} WHERE {{period_start@revenue_schedule}} >= {{_period_start}} AND {{period_start@revenue_schedule}} <= {{_period_end}}) AS unbilled_revenue","staged":false,"placeholders":["billed_amount@revenue_schedule","period_start@revenue_schedule","recognized_revenue@revenue_schedule"]},"revenue_recognition_accuracy":{"metric":"Revenue Recognition Accuracy","fields":["period_start","recognition_correct","recognized_revenue"],"datasets":["revenue_schedule"],"sourceTable":"revenue_schedule","grain":"Monthly aggregate","frequency":"Monthly","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{recognized_revenue@revenue_schedule}}), 0) FROM {{_table:revenue_schedule}} WHERE {{period_start@revenue_schedule}} >= {{_period_start}} AND {{period_start@revenue_schedule}} <= {{_period_end}} AND {{recognition_correct@revenue_schedule}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{recognized_revenue@revenue_schedule}}), 0) FROM {{_table:revenue_schedule}} WHERE {{period_start@revenue_schedule}} >= {{_period_start}} AND {{period_start@revenue_schedule}} <= {{_period_end}}), 0)) AS revenue_recognition_accuracy","staged":false,"placeholders":["period_start@revenue_schedule","recognition_correct@revenue_schedule","recognized_revenue@revenue_schedule"]},"renewal_notification_rate":{"metric":"Renewal Notification Rate","fields":["contract_end","renewal_notified_on_time","snapshot_date","subscription_id"],"datasets":["subscription"],"sourceTable":"subscription","grain":"Monthly aggregate","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{subscription_id@subscription}}) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND (({{contract_end@subscription}} >= {{_period_start}} AND {{contract_end@subscription}} <= {{_period_end}}) AND {{renewal_notified_on_time@subscription}} = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{subscription_id@subscription}}) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND ({{contract_end@subscription}} >= {{_period_start}} AND {{contract_end@subscription}} <= {{_period_end}})), 0)) AS renewal_notification_rate","staged":false,"placeholders":["contract_end@subscription","renewal_notified_on_time@subscription","snapshot_date@subscription","subscription_id@subscription"]},"auto_renewal_rate":{"metric":"Auto-Renewal Rate","fields":["auto_renewed","contract_end","snapshot_date","subscription_id"],"datasets":["subscription"],"sourceTable":"subscription","grain":"Monthly aggregate","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{subscription_id@subscription}}) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND (({{contract_end@subscription}} >= {{_period_start}} AND {{contract_end@subscription}} <= {{_period_end}}) AND {{auto_renewed@subscription}} = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{subscription_id@subscription}}) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND ({{contract_end@subscription}} >= {{_period_start}} AND {{contract_end@subscription}} <= {{_period_end}})), 0)) AS auto_renewal_rate","staged":false,"placeholders":["auto_renewed@subscription","contract_end@subscription","snapshot_date@subscription","subscription_id@subscription"]},"renewal_processing_time":{"metric":"Renewal Processing Time","fields":["contract_end","renewal_complete_date","renewal_trigger_date","snapshot_date"],"datasets":["subscription"],"sourceTable":"subscription","grain":"Monthly aggregate","frequency":"Monthly","source":"Billing","parameterizedQuery":"SELECT (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ({{renewal_complete_date@subscription}} - {{renewal_trigger_date@subscription}})) FROM {{_table:subscription}} WHERE {{snapshot_date@subscription}} = {{_period_end}} AND ({{contract_end@subscription}} >= {{_period_start}} AND {{contract_end@subscription}} <= {{_period_end}})) AS renewal_processing_time","staged":false,"placeholders":["contract_end@subscription","renewal_complete_date@subscription","renewal_trigger_date@subscription","snapshot_date@subscription"]},"system_sync_accuracy":{"metric":"System Sync Accuracy","fields":["snapshot_date","sync_status"],"datasets":["crm_record"],"sourceTable":"crm_record","grain":"Daily snapshot","frequency":"Daily","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COUNT({{sync_status@crm_record}}) FROM {{_table:crm_record}} WHERE {{snapshot_date@crm_record}} = {{_period_end}} AND {{sync_status@crm_record}} = 'matched') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{sync_status@crm_record}}) FROM {{_table:crm_record}} WHERE {{snapshot_date@crm_record}} = {{_period_end}}), 0)) AS system_sync_accuracy","staged":false,"placeholders":["snapshot_date@crm_record","sync_status@crm_record"]},"data_completeness":{"metric":"Data Completeness","fields":["populated_field_count","required_field_count","snapshot_date"],"datasets":["crm_record"],"sourceTable":"crm_record","grain":"Daily snapshot","frequency":"Daily","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{populated_field_count@crm_record}}), 0) FROM {{_table:crm_record}} WHERE {{snapshot_date@crm_record}} = {{_period_end}}) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{required_field_count@crm_record}}), 0) FROM {{_table:crm_record}} WHERE {{snapshot_date@crm_record}} = {{_period_end}}), 0)) AS data_completeness","staged":false,"placeholders":["populated_field_count@crm_record","required_field_count@crm_record","snapshot_date@crm_record"]},"pipeline_value":{"metric":"Pipeline Value","fields":["opportunity_amount","opportunity_stage","snapshot_date","stage_probability"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Daily snapshot","frequency":"Daily sync","source":"CRM","parameterizedQuery":"SELECT (SELECT COALESCE(SUM(({{opportunity_amount@opportunity}} * {{stage_probability@opportunity}})), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND {{opportunity_stage@opportunity}} NOT IN ('closed_won', 'closed_lost')) AS pipeline_value","staged":false,"placeholders":["opportunity_amount@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity","stage_probability@opportunity"]},"pipeline_coverage":{"metric":"Pipeline Coverage Ratio","fields":["opportunity_amount","opportunity_stage","period_start","quota","snapshot_date"],"datasets":["opportunity","sales_rep"],"sourceTable":null,"grain":"Daily snapshot","frequency":"Daily sync","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND {{opportunity_stage@opportunity}} NOT IN ('closed_won', 'closed_lost')) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{quota@sales_rep}}), 0) FROM {{_table:sales_rep}} WHERE {{period_start@sales_rep}} >= {{_period_start}} AND {{period_start@sales_rep}} <= {{_period_end}}), 0)) AS pipeline_coverage","staged":false,"placeholders":["opportunity_amount@opportunity","opportunity_stage@opportunity","period_start@sales_rep","quota@sales_rep","snapshot_date@opportunity"]},"pipeline_velocity":{"metric":"Pipeline Velocity","fields":["close_date","opportunity_amount","opportunity_created_date","opportunity_id","opportunity_stage","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Daily snapshot","frequency":"Daily","source":"CRM","parameterizedQuery":"SELECT (CAST((((SELECT COUNT({{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND {{opportunity_stage@opportunity}} NOT IN ('closed_won', 'closed_lost')) * ((CAST((SELECT COUNT({{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{opportunity_stage@opportunity}} = 'closed_won' AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{opportunity_stage@opportunity}} IN ('closed_won', 'closed_lost') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))), 0)))) * ((CAST((SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{opportunity_stage@opportunity}} = 'closed_won' AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{opportunity_stage@opportunity}} = 'closed_won' AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))), 0)))) AS DOUBLE PRECISION) / NULLIF(((SELECT AVG(({{close_date@opportunity}} - {{opportunity_created_date@opportunity}})) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{opportunity_stage@opportunity}} = 'closed_won' AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}})))), 0)) AS pipeline_velocity","staged":false,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_created_date@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},"win_rate":{"metric":"Win Rate","fields":["close_date","opportunity_id","opportunity_stage","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COUNT({{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{opportunity_stage@opportunity}} = 'closed_won' AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{opportunity_stage@opportunity}} IN ('closed_won', 'closed_lost') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))), 0)) AS win_rate","staged":false,"placeholders":["close_date@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},"lead_to_opportunity_rate":{"metric":"Lead-to-Opportunity Rate","fields":["lead_created_date","lead_id","opportunity_created_date","opportunity_id","snapshot_date"],"datasets":["lead","opportunity"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{opportunity_created_date@opportunity}} >= {{_period_start}} AND {{opportunity_created_date@opportunity}} <= {{_period_end}})) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{lead_id@lead}}) FROM {{_table:lead}} WHERE {{snapshot_date@lead}} = {{_period_end}} AND ({{lead_created_date@lead}} >= {{_period_start}} AND {{lead_created_date@lead}} <= {{_period_end}})), 0)) AS lead_to_opportunity_rate","staged":false,"placeholders":["lead_created_date@lead","lead_id@lead","opportunity_created_date@opportunity","opportunity_id@opportunity","snapshot_date@lead","snapshot_date@opportunity"]},"opportunity_to_close_rate":{"metric":"Opportunity-to-Close Rate","fields":["close_date","opportunity_id","opportunity_stage","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"CRM","parameterizedQuery":"SELECT ((CAST((SELECT COUNT({{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{opportunity_stage@opportunity}} = 'closed_won' AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{opportunity_stage@opportunity}} IN ('closed_won', 'closed_lost') AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))), 0))) AS opportunity_to_close_rate","staged":false,"placeholders":["close_date@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},"acv":{"metric":"ACV (Annual Contract Value)","fields":["acv","contract_event_type","event_date"],"datasets":["contract_event"],"sourceTable":"contract_event","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"Billing","parameterizedQuery":"SELECT (SELECT AVG({{acv@contract_event}}) FROM {{_table:contract_event}} WHERE {{event_date@contract_event}} >= {{_period_start}} AND {{event_date@contract_event}} <= {{_period_end}} AND {{contract_event_type@contract_event}} = 'new_contract') AS acv","staged":false,"placeholders":["acv@contract_event","contract_event_type@contract_event","event_date@contract_event"]},"average_deal_size":{"metric":"Average Deal Size","fields":["close_date","opportunity_amount","opportunity_id","opportunity_stage","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Per event, aggregate monthly","frequency":"Daily sync","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{opportunity_amount@opportunity}}), 0) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{opportunity_stage@opportunity}} = 'closed_won' AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{opportunity_id@opportunity}}) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{opportunity_stage@opportunity}} = 'closed_won' AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))), 0)) AS average_deal_size","staged":false,"placeholders":["close_date@opportunity","opportunity_amount@opportunity","opportunity_id@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},"sales_cycle":{"metric":"Sales Cycle Length","fields":["close_date","opportunity_created_date","opportunity_stage","snapshot_date"],"datasets":["opportunity"],"sourceTable":"opportunity","grain":"Per event","frequency":"Per deal","source":"CRM","parameterizedQuery":"SELECT (SELECT AVG(({{close_date@opportunity}} - {{opportunity_created_date@opportunity}})) FROM {{_table:opportunity}} WHERE {{snapshot_date@opportunity}} = {{_period_end}} AND ({{opportunity_stage@opportunity}} = 'closed_won' AND ({{close_date@opportunity}} >= {{_period_start}} AND {{close_date@opportunity}} <= {{_period_end}}))) AS sales_cycle","staged":false,"placeholders":["close_date@opportunity","opportunity_created_date@opportunity","opportunity_stage@opportunity","snapshot_date@opportunity"]},"quota_attainment":{"metric":"Quota Attainment","fields":["closed_revenue","period_start","quota"],"datasets":["sales_rep"],"sourceTable":"sales_rep","grain":"Monthly aggregate","frequency":"Monthly","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{closed_revenue@sales_rep}}), 0) FROM {{_table:sales_rep}} WHERE {{period_start@sales_rep}} >= {{_period_start}} AND {{period_start@sales_rep}} <= {{_period_end}}) AS DOUBLE PRECISION) / NULLIF((SELECT COALESCE(SUM({{quota@sales_rep}}), 0) FROM {{_table:sales_rep}} WHERE {{period_start@sales_rep}} >= {{_period_start}} AND {{period_start@sales_rep}} <= {{_period_end}}), 0)) AS quota_attainment","staged":false,"placeholders":["closed_revenue@sales_rep","period_start@sales_rep","quota@sales_rep"]},"revenue_per_rep":{"metric":"Revenue per Rep","fields":["closed_revenue","period_start","quota","rep_id"],"datasets":["sales_rep"],"sourceTable":"sales_rep","grain":"Monthly aggregate","frequency":"Monthly","source":"CRM","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{closed_revenue@sales_rep}}), 0) FROM {{_table:sales_rep}} WHERE {{period_start@sales_rep}} >= {{_period_start}} AND {{period_start@sales_rep}} <= {{_period_end}}) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{rep_id@sales_rep}}) FROM {{_table:sales_rep}} WHERE {{period_start@sales_rep}} >= {{_period_start}} AND {{period_start@sales_rep}} <= {{_period_end}} AND {{quota@sales_rep}} > 0), 0)) AS revenue_per_rep","staged":false,"placeholders":["closed_revenue@sales_rep","period_start@sales_rep","quota@sales_rep","rep_id@sales_rep"]},"ramp_time":{"metric":"Ramp Time","fields":["hire_date","period_start","ramped_date"],"datasets":["sales_rep"],"sourceTable":"sales_rep","grain":"Monthly aggregate","frequency":"Monthly","source":"HRIS","parameterizedQuery":"SELECT (CAST((SELECT AVG(({{ramped_date@sales_rep}} - {{hire_date@sales_rep}})) FROM {{_table:sales_rep}} WHERE {{period_start@sales_rep}} >= {{_period_start}} AND {{period_start@sales_rep}} <= {{_period_end}}) AS DOUBLE PRECISION) / 30.4375) AS ramp_time","staged":false,"placeholders":["hire_date@sales_rep","period_start@sales_rep","ramped_date@sales_rep"]},"ticket_volume":{"metric":"Ticket Volume","fields":["created_at","ticket_id"],"datasets":["ticket"],"sourceTable":"ticket","grain":"Per event, aggregate monthly","frequency":"Daily","source":"Help Desk","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day')) AS ticket_volume","staged":false,"placeholders":["created_at@ticket","ticket_id@ticket"]},"tickets_per_customer":{"metric":"Tickets per Customer","fields":["created_at","customer_id","customer_status","snapshot_date","ticket_id"],"datasets":["customer","ticket"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Daily","source":"Help Desk","parameterizedQuery":"SELECT (CAST(((SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day'))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{customer_id@customer}}) FROM {{_table:customer}} WHERE {{snapshot_date@customer}} = {{_period_end}} AND {{customer_status@customer}} = 'active'), 0)) AS tickets_per_customer","staged":false,"placeholders":["created_at@ticket","customer_id@customer","customer_status@customer","snapshot_date@customer","ticket_id@ticket"]},"ticket_backlog":{"metric":"Ticket Backlog","fields":["created_at","ticket_id","ticket_status"],"datasets":["ticket"],"sourceTable":"ticket","grain":"Open work items at period end","frequency":"Daily","source":"Help Desk","parameterizedQuery":"SELECT (SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day') AND {{ticket_status@ticket}} IN ('open', 'pending')) AS ticket_backlog","staged":false,"placeholders":["created_at@ticket","ticket_id@ticket","ticket_status@ticket"]},"ticket_distribution_by_type":{"metric":"Ticket Distribution by Type","fields":["created_at","ticket_id","ticket_type"],"datasets":["ticket"],"sourceTable":"ticket","grain":"Per event, aggregate monthly","frequency":"Daily","source":"Help Desk","parameterizedQuery":"SELECT _d.ticket_type AS ticket_type, (CAST((SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day') AND {{ticket_type@ticket}} = _d.ticket_type) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day'))), 0)) AS ticket_distribution_by_type\nFROM (SELECT 'how_to' AS ticket_type UNION ALL SELECT 'bug' AS ticket_type UNION ALL SELECT 'billing' AS ticket_type UNION ALL SELECT 'account' AS ticket_type UNION ALL SELECT 'feature_request' AS ticket_type UNION ALL SELECT 'other' AS ticket_type) _d","staged":false,"placeholders":["created_at@ticket","ticket_id@ticket","ticket_type@ticket"],"breakdown":{"field":"ticket_type"}},"frt":{"metric":"First Response Time (FRT)","fields":["created_at","first_response_at"],"datasets":["ticket"],"sourceTable":"ticket","grain":"Per event","frequency":"Per ticket","source":"Help Desk","parameterizedQuery":"SELECT ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (EXTRACT(EPOCH FROM ({{first_response_at@ticket}} - {{created_at@ticket}})) / 86400.0)) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day')) * 1440) AS frt","staged":false,"placeholders":["created_at@ticket","first_response_at@ticket"]},"first_response_sla_adherence":{"metric":"First Response SLA Adherence","fields":["created_at","first_response_at","first_response_due_at","ticket_id"],"datasets":["ticket"],"sourceTable":"ticket","grain":"Per event","frequency":"Per ticket","source":"Help Desk","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day') AND {{first_response_at@ticket}} <= {{first_response_due_at@ticket}}) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day')), 0)) AS first_response_sla_adherence","staged":false,"placeholders":["created_at@ticket","first_response_at@ticket","first_response_due_at@ticket","ticket_id@ticket"]},"resolution_time_time_to_resolution":{"metric":"Resolution Time (Time to Resolution)","fields":["created_at","resolved_at"],"datasets":["ticket"],"sourceTable":"ticket","grain":"Per event","frequency":"Per ticket","source":"Help Desk","parameterizedQuery":"SELECT ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (EXTRACT(EPOCH FROM ({{resolved_at@ticket}} - {{created_at@ticket}})) / 86400.0)) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day')) * 24) AS resolution_time_time_to_resolution","staged":false,"placeholders":["created_at@ticket","resolved_at@ticket"]},"first_contact_resolution_fcr":{"metric":"First Contact Resolution (FCR)","fields":["created_at","resolved_first_contact","ticket_id"],"datasets":["ticket"],"sourceTable":"ticket","grain":"Per event","frequency":"Per ticket","source":"Help Desk","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day') AND {{resolved_first_contact@ticket}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day')), 0)) AS first_contact_resolution_fcr","staged":false,"placeholders":["created_at@ticket","resolved_first_contact@ticket","ticket_id@ticket"]},"resolution_sla_adherence":{"metric":"Resolution SLA Adherence","fields":["created_at","resolution_due_at","resolved_at","ticket_id"],"datasets":["ticket"],"sourceTable":"ticket","grain":"Per event","frequency":"Per ticket","source":"Help Desk","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day') AND {{resolved_at@ticket}} <= {{resolution_due_at@ticket}}) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day')), 0)) AS resolution_sla_adherence","staged":false,"placeholders":["created_at@ticket","resolution_due_at@ticket","resolved_at@ticket","ticket_id@ticket"]},"reopen_rate":{"metric":"Reopen Rate","fields":["created_at","reopened","ticket_id","ticket_status"],"datasets":["ticket"],"sourceTable":"ticket","grain":"Per event","frequency":"Per ticket","source":"Help Desk","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day') AND {{reopened@ticket}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day') AND {{ticket_status@ticket}} = 'resolved'), 0)) AS reopen_rate","staged":false,"placeholders":["created_at@ticket","reopened@ticket","ticket_id@ticket","ticket_status@ticket"]},"csat":{"metric":"Customer Satisfaction Score (CSAT)","fields":["satisfaction_score","survey_date","survey_type"],"datasets":["survey_response"],"sourceTable":"survey_response","grain":"Per survey response","frequency":"Per response","source":"Survey Tool","parameterizedQuery":"SELECT (CAST((SELECT COUNT({{satisfaction_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND ({{survey_type@survey_response}} = 'customer' AND {{satisfaction_score@survey_response}} >= 4)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT({{satisfaction_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}} AND {{survey_type@survey_response}} = 'customer'), 0)) AS csat","staged":false,"placeholders":["satisfaction_score@survey_response","survey_date@survey_response","survey_type@survey_response"]},"customer_effort_score_ces":{"metric":"Customer Effort Score (CES)","fields":["ces_score","survey_date"],"datasets":["survey_response"],"sourceTable":"survey_response","grain":"Per survey response","frequency":"Per response","source":"Survey Tool","parameterizedQuery":"SELECT (SELECT AVG({{ces_score@survey_response}}) FROM {{_table:survey_response}} WHERE {{survey_date@survey_response}} >= {{_period_start}} AND {{survey_date@survey_response}} <= {{_period_end}}) AS customer_effort_score_ces","staged":false,"placeholders":["ces_score@survey_response","survey_date@survey_response"]},"ticket_escalation_rate":{"metric":"Ticket Escalation Rate","fields":["created_at","escalated","ticket_id"],"datasets":["ticket"],"sourceTable":"ticket","grain":"Per event","frequency":"Per ticket","source":"Help Desk","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day') AND {{escalated@ticket}} = TRUE) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day')), 0)) AS ticket_escalation_rate","staged":false,"placeholders":["created_at@ticket","escalated@ticket","ticket_id@ticket"]},"tickets_per_agent":{"metric":"Tickets per Agent","fields":["agent_id","created_at","ticket_id"],"datasets":["ticket"],"sourceTable":"ticket","grain":"Per event, aggregate monthly","frequency":"Daily","source":"Help Desk","parameterizedQuery":"SELECT (CAST((SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day')) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{agent_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day')), 0)) AS tickets_per_agent","staged":false,"placeholders":["agent_id@ticket","created_at@ticket","ticket_id@ticket"]},"cost_per_ticket":{"metric":"Cost per Ticket","fields":["cost","cost_function","created_at","event_date","ticket_id","ticket_status"],"datasets":["cost_event","ticket"],"sourceTable":null,"grain":"Per event, aggregate monthly","frequency":"Daily","source":"Finance / ERP","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{cost@cost_event}}), 0) FROM {{_table:cost_event}} WHERE {{event_date@cost_event}} >= {{_period_start}} AND {{event_date@cost_event}} <= {{_period_end}} AND {{cost_function@cost_event}} = 'support') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day') AND {{ticket_status@ticket}} = 'resolved'), 0)) AS cost_per_ticket","staged":false,"placeholders":["cost@cost_event","cost_function@cost_event","created_at@ticket","event_date@cost_event","ticket_id@ticket","ticket_status@ticket"]},"self_service_rate":{"metric":"Self-Service Rate (Ticket Deflection)","fields":["created_at","deflections","period_start","ticket_id"],"datasets":["kb_article","ticket"],"sourceTable":null,"grain":"Daily aggregate","frequency":"Daily","source":"Help Desk","parameterizedQuery":"SELECT (CAST((SELECT COALESCE(SUM({{deflections@kb_article}}), 0) FROM {{_table:kb_article}} WHERE {{period_start@kb_article}} >= {{_period_start}} AND {{period_start@kb_article}} <= {{_period_end}}) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM({{deflections@kb_article}}), 0) FROM {{_table:kb_article}} WHERE {{period_start@kb_article}} >= {{_period_start}} AND {{period_start@kb_article}} <= {{_period_end}}) + ((SELECT COUNT(DISTINCT {{ticket_id@ticket}}) FROM {{_table:ticket}} WHERE {{created_at@ticket}} >= {{_period_start}} AND {{created_at@ticket}} < ({{_period_end}} + INTERVAL '1 day')))), 0)) AS self_service_rate","staged":false,"placeholders":["created_at@ticket","deflections@kb_article","period_start@kb_article","ticket_id@ticket"]}},"metricNodeIds":{"arr-annual-recurring-revenue":"arr","rule-of-40":"rule_of_40","mrr-monthly-recurring-revenue":"mrr","net-new-mrr":"net_new_mrr","net-revenue-retention-nrr":"nrr","gross-revenue-retention-grr":"grr","gross-margin":"gross_margin","arpa-average-revenue-per-account":"arpa","total-customers":"total_customers","new-customers":"new_customers","churned-customers":"churned_customers","mrr-growth-rate":"mrr_growth_rate","operating-margin-ebit-margin":"operating_margin","free-cash-flow-fcf":"fcf","new-mrr":"new_mrr","expansion-mrr":"expansion_mrr","churned-mrr":"churned_mrr","contraction-mrr":"contraction_mrr","reactivation-mrr":"reactivation_mrr","cac-customer-acquisition-cost":"cac","ltv-customer-lifetime-value":"ltv","ltvcac-ratio":"ltv_cac_ratio","cac-payback-period":"cac_payback","logo-churn-rate-customer-churn":"logo_churn_rate","revenue-churn-rate":"revenue_churn_rate","nps-net-promoter-score":"nps","pipeline-value":"pipeline_value","pipeline-coverage-ratio":"pipeline_coverage","win-rate":"win_rate","acv-annual-contract-value":"acv","quota-attainment":"quota_attainment","customer-health-score":"health_score","expansion-revenue-rate":"expansion_rate","renewal-rate":"renewal_rate","at-risk-customer-rate":"at_risk_rate","magic-number":"magic_number","cash-burn-rate":"burn_rate","revenue-per-employee":"revenue_per_employee","consumption-revenue":"consumption_revenue","usage-run-rate":"usage_run_rate","prepaid-credit-balance":"prepaid_credit_balance","arr-including-usage-run-rate":"arr_including_usage_run_rate","partner-sourced-revenue":"partner_sourced_revenue","sales-cycle-length":"sales_cycle","marketing-qualified-leads-mqls":"mqls","sales-qualified-leads-sqls":"sqls","lead-velocity-rate-lvr":"lvr","marketing-cac":"marketing_cac","cost-per-lead-cpl":"cpl","marketing-sourced-pipeline":"marketing_sourced_pipeline","quarterly-business-review-qbr-completion-rate":"qbr_completion","customer-satisfaction-score-csat":"csat","time-to-first-value-ttfv":"ttfv","onboarding-completion-rate":"onboarding_completion","onboarding-to-active-rate-activation-rate":"activation_rate","daumau-ratio-stickiness":"dau_mau","feature-adoption-rate":"feature_adoption","product-qualified-accounts-pqas":"pqas","trial-to-paid-conversion-rate":"trial_to_paid_conversion_rate","forecast-accuracy":"forecast_accuracy","days-sales-outstanding-dso":"dso","employee-turnover-rate":"employee_turnover","first-response-time-frt":"frt","ticket-volume":"ticket_volume","self-service-rate-ticket-deflection":"self_service_rate","uptime-availability":"uptime","deployment-frequency":"deployment_frequency","mean-time-to-resolve-mttr":"mttr","employee-net-promoter-score-enps":"enps","arr-mrr":"mrr","customer-acquisition-cost-cac":"cac"},"formulas":{"mrr":{"formula":"sum(field.mrr where field.subscription_status = 'active') at period_end","unit":"currency","breakdowns":{"by_plan":"field.plan_name","by_segment":"field.segment"},"notes":"Annual contracts contribute annual value / 12. Excludes one-time fees, trials and non-guaranteed usage. by_plan returns one row per plan the subscriptions are priced by, with the plan id and plan name: the name lives on the plan dataset and subscriptions reach it through plan_id. by_segment returns one row per customer segment, read from the subscription snapshot at period end."},"arr":{"formula":"metric.mrr * 12","unit":"currency","forms":{"O":"(metric.mrr - window(sum(field.mrr_change where field.expansion_classification in ('pricing_adjustment', 'recontracting')), 12 month)) * 12 over cohort(field.customer_id, period_end)","M":"metric.mrr * 12"},"breakdowns":{"by_segment":"field.segment"},"notes":"ARR-M equals this formula. ARR-O subtracts the MRR change tagged pricing_adjustment or recontracting in the trailing 12 months for customers active at period end, so ARR-M minus ARR-O is the Durability Gap (core.md), a growth decomposition measured over the trailing year. by_segment returns one row per customer segment through MRR."},"arpa":{"formula":"metric.mrr / metric.total_customers","unit":"currency","breakdowns":{"by_segment":"field.segment"},"notes":"by_segment returns one row per customer segment, since a blended ARPA across SMB and enterprise describes neither."},"total_customers":{"formula":"count_distinct(field.customer_id where field.customer_status = 'active') at period_end","unit":"count","breakdowns":{"by_segment":"field.segment"},"notes":"Active customers at period end, one per billing entity. ARPA divides by it and Logo Churn Rate reads it at period start. by_segment returns one row per customer segment."},"new_customers":{"formula":"count_distinct(field.customer_id where field.event_type = 'new')","unit":"count","breakdowns":{"by_segment":"field.segment"},"notes":"Customers whose first paid subscription started in the period (a new revenue event). Reactivated customers return through a reactivation event and are not new. CAC divides by it. by_segment returns one row per customer segment."},"churned_customers":{"formula":"count_distinct(field.customer_id where field.event_type = 'churn')","unit":"count","breakdowns":{"by_segment":"field.segment"},"notes":"Customers whose last active subscription ended in the period (a churn event). The numerator of Logo Churn Rate. by_segment returns one row per customer segment."},"mrr_growth_rate":{"formula":"(metric.mrr - lag(metric.mrr, 1 month)) / lag(metric.mrr, 1 month)","unit":"percent"},"new_mrr":{"formula":"sum(field.mrr_change where field.event_type = 'new')","unit":"currency","breakdowns":{"by_segment":"field.segment"},"notes":"by_segment returns one row per customer segment, which shows where new business lands."},"expansion_mrr":{"formula":"sum(field.mrr_change where field.event_type = 'expansion')","unit":"currency","breakdowns":{"by_segment":"field.segment"},"notes":"by_segment returns one row per customer segment, which shows where expansion comes from."},"churned_mrr":{"formula":"-sum(field.mrr_change where field.event_type = 'churn')","unit":"currency","breakdowns":{"by_segment":"field.segment"},"notes":"Churn events carry a negative mrr_change; the metric reports a positive amount. by_segment returns one row per customer segment, so churn concentrated in one segment is visible."},"contraction_mrr":{"formula":"-sum(field.mrr_change where field.event_type = 'contraction')","unit":"currency","breakdowns":{"by_segment":"field.segment"},"notes":"Contraction events carry a negative mrr_change; the metric reports a positive amount. by_segment returns one row per customer segment, so downgrades concentrated in one segment are visible."},"reactivation_mrr":{"formula":"sum(field.mrr_change where field.event_type = 'reactivation')","unit":"currency","breakdowns":{"by_segment":"field.segment"},"notes":"The reactivation event in the CEL: a churned customer's new subscription. Counted apart from New MRR (acquisition) and Expansion MRR (existing customers). by_segment returns one row per customer segment."},"carry_mrr":{"formula":"metric.mrr at period_start - metric.churned_mrr - metric.contraction_mrr","unit":"currency"},"net_new_mrr":{"formula":"metric.new_mrr + metric.expansion_mrr + metric.reactivation_mrr - metric.churned_mrr - metric.contraction_mrr","unit":"currency","notes":"Five movements: carry MRR plus new, expansion and reactivation MRR is ending MRR."},"bundle_pricing_and_mrr_allocation":{"notComputable":"An allocation method applied when recording item-level MRR (Item SSP / sum of SSPs x bundle price), not a reported metric."},"nrr":{"formula":"(metric.mrr at period_start + metric.expansion_mrr - metric.contraction_mrr - metric.churned_mrr) / metric.mrr at period_start over cohort(field.customer_id, period_start)","unit":"percent","forms":{"O":"(metric.mrr at period_start + sum(field.mrr_change where field.event_type = 'expansion' and field.expansion_classification in ('same_product', 'usage_realisation')) - metric.contraction_mrr - metric.churned_mrr) / metric.mrr at period_start over cohort(field.customer_id, period_start)","M":"(metric.mrr at period_start + sum(field.mrr_change where field.event_type in ('expansion', 'reactivation') and field.expansion_classification in ('same_product', 'new_module', 'new_buying_centre', 'pricing_adjustment', 'recontracting', 'usage_realisation')) - metric.contraction_mrr - metric.churned_mrr) / metric.mrr at period_start over cohort(field.customer_id, period_start)"},"variants":{"adjusted":"(sum(field.mrr_start) + sum(field.mrr_change where field.event_type in ('expansion', 'contraction', 'churn') and field.change_nature = 'permanent')) / sum(field.mrr_start) over cohort(field.customer_id, period_start)"},"breakdowns":{"by_segment":"field.segment"},"notes":"Period is trailing 12 months, over the customers active at period start (cohort method, the investor-comparable basis). NRR-O counts expansion tagged same_product or usage_realisation. NRR-M counts every expansion classification plus reactivation of cohort customers; customers who churned before the period and return are new business. The main formula is core.md's formula method. by_segment returns one row per customer segment, because retention differs most between SMB and enterprise; each snapshot and event counts in the segment it carries."},"grr":{"formula":"(metric.mrr at period_start - metric.contraction_mrr - metric.churned_mrr) / metric.mrr at period_start over cohort(field.customer_id, period_start)","unit":"percent","variants":{"per_customer":"sum(min(field.mrr_end, field.mrr_start)) / sum(field.mrr_start) over cohort(field.customer_id, period_start)","adjusted":"(sum(field.mrr_start) + sum(field.mrr_change where field.event_type in ('contraction', 'churn') and field.change_nature = 'permanent')) / sum(field.mrr_start) over cohort(field.customer_id, period_start)"},"breakdowns":{"by_segment":"field.segment"},"notes":"Period is trailing 12 months. The main formula is core.md's formula method, the canonical one; variants.per_customer is the cohort method, which nets each customer's movements within the period and so reads equal to or higher than the main formula. Capped at 100% by construction. by_segment returns one row per customer segment, because retention differs most between SMB and enterprise; each snapshot and event counts in the segment it carries."},"logo_churn_rate":{"formula":"metric.churned_customers / metric.total_customers at period_start","unit":"percent","breakdowns":{"by_segment":"field.segment"},"notes":"by_segment returns one row per customer segment, since SMB logos usually churn at several times the enterprise rate."},"revenue_churn_rate":{"formula":"(metric.churned_mrr + metric.contraction_mrr) / metric.mrr at period_start","unit":"percent","breakdowns":{"by_segment":"field.segment"},"notes":"by_segment returns one row per customer segment, so churn concentrated in one segment is visible."},"nps":{"formula":"(count(field.nps_score where field.survey_type = 'customer' and field.nps_score >= 9) - count(field.nps_score where field.survey_type = 'customer' and field.nps_score <= 6)) / count(field.nps_score where field.survey_type = 'customer') * 100","unit":"score","notes":"Reported as a score from -100 to 100, so the x 100 is part of the definition."},"cac":{"formula":"sum(field.cost where field.cost_function = 'gtm') / metric.new_customers","unit":"currency","forms":{"O":"(sum(field.cost where field.cost_function = 'gtm') + sum(field.cost where field.cost_function in ('implementation', 'onboarding'))) / metric.new_customers","M":"sum(field.cost where field.cost_function = 'gtm') / metric.new_customers"},"breakdowns":{"by_cost_centre":{"field":"field.cost_centre","total":true}},"notes":"GTM cost is ATL cost_function gtm (sales and marketing). CAC-O adds implementation and onboarding cost per the ATL bridge. by_cost_centre slices GTM cost by cost centre; the denominator stays the whole population of new customers, so the rows sum to CAC."},"ltv":{"formula":"metric.arpa * metric.gross_margin / metric.revenue_churn_rate","unit":"currency","forms":{"O":"metric.arpa * metric.gross_margin.O / metric.revenue_churn_rate","M":"metric.arpa * metric.gross_margin / metric.revenue_churn_rate"},"notes":"LTV-M equals this formula. LTV-O uses contribution margin (gross_margin.forms.O) in place of gross margin."},"ltv_cac_ratio":{"formula":"metric.ltv / metric.cac","unit":"ratio","forms":{"O":"metric.ltv.O / metric.cac.O","M":"metric.ltv.M / metric.cac.M"}},"cac_payback":{"formula":"metric.cac / (metric.arpa * metric.gross_margin)","unit":"months","forms":{"O":"metric.cac.O / (metric.arpa * metric.gross_margin.O)","M":"metric.cac.M / (metric.arpa * metric.gross_margin.M)"}},"gross_margin":{"formula":"(sum(field.revenue) - sum(field.cost where field.cost_function = 'infrastructure')) / sum(field.revenue)","unit":"percent","forms":{"O":"(sum(field.revenue) - sum(field.cost where field.cost_function = 'infrastructure') - sum(field.cost where field.cost_function in ('support', 'success_engineering', 'implementation', 'onboarding'))) / sum(field.revenue)","M":"(sum(field.revenue) - sum(field.cost where field.cost_function = 'infrastructure')) / sum(field.revenue)"},"notes":"COGS is cost_function infrastructure (hosting, compute, payment processing). Canonical Gross Margin equals GM-M; GM-O (contribution margin) also subtracts support, success engineering, implementation and onboarding cost. Revenue is GAAP recognised revenue."},"rule_of_40":{"formula":"(metric.arr - lag(metric.arr, 1 year)) / lag(metric.arr, 1 year) + metric.ebitda_margin","unit":"percent"},"total_active_partners":{"formula":"count_distinct(field.partner_id where field.partner_status = 'active')","unit":"count","notes":"Active means activity in the trailing 12 months: deals registered, deals closed, certification maintained or engagement threshold met. Encoded through the partner status flag."},"partner_tier_distribution":{"formula":"count_distinct(field.partner_id) / total(count_distinct(field.partner_id))","unit":"percent","breakdown":"field.partner_tier","notes":"Reported per tier: partners in the tier over all partners, on the period-end partner snapshot."},"partner_activation_rate":{"formula":"count_distinct(field.partner_id where in_period(field.partner_recruited_date) and field.partner_status = 'active') at period_end / count_distinct(field.partner_id where in_period(field.partner_recruited_date)) at period_end","unit":"percent","notes":"Partners recruited in the period who are active at period end over partners recruited in the period, as partnerships.md defines it. A partner moves from recruited to active status once productive (first deal registered or closed, or the engagement threshold met)."},"partner_churn_rate":{"formula":"count_distinct(field.partner_id where in_period(field.partner_churn_date)) / count_distinct(field.partner_id where field.partner_status = 'active') at period_start","unit":"percent","breakdowns":{"by_partner_tier":"field.partner_tier"},"notes":"Partners with a churn date in the period over partners active at period start. by_partner_tier returns one row per partner tier, which tests whether tier benefits retain partners."},"partner_sourced_revenue":{"formula":"sum(field.opportunity_amount where field.partner_sourced = true and field.opportunity_stage = 'closed_won' and in_period(field.close_date))","unit":"currency"},"partner_influenced_revenue":{"formula":"sum(field.opportunity_amount where field.partner_id is not null and field.opportunity_stage = 'closed_won' and in_period(field.close_date))","unit":"currency","notes":"Includes partner-sourced deals."},"channel_revenue_percentage":{"formula":"metric.partner_sourced_revenue / metric.revenue_gaap","unit":"percent","notes":"Total revenue is GAAP recognised revenue."},"partner_revenue_growth":{"formula":"(metric.partner_sourced_revenue - lag(metric.partner_sourced_revenue, 1 year)) / lag(metric.partner_sourced_revenue, 1 year)","unit":"percent"},"average_partner_revenue":{"formula":"metric.partner_influenced_revenue / metric.total_active_partners","unit":"currency","notes":"Total partner revenue is partner_influenced_revenue: closed-won revenue on every deal with a partner attached, partner-sourced deals included."},"partner_deal_registration_volume":{"formula":"count_distinct(field.registration_id where in_period(field.registration_date))","unit":"count"},"deal_registration_to_close_rate":{"formula":"count_distinct(field.registration_id where field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / count_distinct(field.registration_id where in_period(field.registration_date))","unit":"percent","notes":"Registrations closed won in the period over registrations submitted in the period."},"partner_win_rate":{"formula":"count(field.opportunity_id where field.partner_id is not null and field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / count(field.opportunity_id where field.partner_id is not null and field.opportunity_stage in ('closed_won', 'closed_lost') and in_period(field.close_date))","unit":"percent"},"partner_deal_size":{"formula":"metric.partner_sourced_revenue / count(field.opportunity_id where field.partner_sourced = true and field.opportunity_stage = 'closed_won' and in_period(field.close_date))","unit":"currency"},"partner_sales_cycle":{"formula":"median(field.close_date - field.registration_date where field.opportunity_stage = 'closed_won' and in_period(field.close_date))","unit":"days","notes":"Registered deals only; measured from registration to close on the deal registration record."},"partner_portal_engagement":{"notComputable":"A family of portal activity measures (logins, downloads, modules accessed, registrations) with no single formula."},"certification_rate":{"formula":"count_distinct(field.partner_id where field.certification_status = 'certified') / metric.total_active_partners","unit":"percent"},"training_completion":{"formula":"count_distinct(field.partner_id where field.training_completed = true) / count_distinct(field.partner_id)","unit":"percent","notes":"Denominator is partners enrolled in required training."},"joint_marketing_activities":{"formula":"count(field.activity_id where field.partner_activity_type in ('webinar', 'event', 'content', 'campaign'))","unit":"count"},"partner_nps":{"formula":"(count(field.nps_score where field.survey_type = 'partner' and field.nps_score >= 9) - count(field.nps_score where field.survey_type = 'partner' and field.nps_score <= 6)) / count(field.nps_score where field.survey_type = 'partner') * 100","unit":"score","notes":"Same as NPS, computed on partner satisfaction surveys."},"partner_margin_commission":{"formula":"sum(field.cost where field.cost_function = 'partner_commission') / metric.partner_sourced_revenue","unit":"percent"},"cost_of_partner_acquisition":{"formula":"sum(field.cost where field.cost_function = 'partner_program') / count_distinct(field.partner_id where in_period(field.partner_recruited_date))","unit":"currency"},"partner_lifetime_value":{"formula":"metric.average_partner_revenue / metric.partner_churn_rate","unit":"currency","notes":"Average annual partner revenue assumes a 12-month period."},"partner_roi":{"formula":"(metric.partner_sourced_revenue - sum(field.cost where field.cost_function = 'partner_program')) / sum(field.cost where field.cost_function = 'partner_program')","unit":"percent"},"resellers":{"notComputable":"A partner-type grouping that applies existing metrics per type (key metric revenue per reseller), not a single formula."},"referral_partners":{"notComputable":"A partner-type grouping that applies existing metrics per type (key metric referrals per partner), not a single formula."},"technology_partners_integrations":{"notComputable":"A partner-type grouping that applies existing metrics per type (key metric customers using integration), not a single formula."},"system_integrators_sis":{"notComputable":"A partner-type grouping that applies existing metrics per type (key metric implementations delivered), not a single formula."},"managed_service_providers_msps":{"notComputable":"A partner-type grouping that applies existing metrics per type (key metric seats under management), not a single formula."},"marketplace_revenue":{"formula":"sum(field.opportunity_amount where field.channel = 'marketplace' and field.opportunity_stage = 'closed_won' and in_period(field.close_date))","unit":"currency","notes":"Closed-won opportunities transacted through a cloud marketplace listing (AWS, Azure and similar), identified by channel marketplace."},"marketplace_as_of_revenue":{"formula":"metric.marketplace_revenue / metric.revenue_gaap","unit":"percent"},"marketplace_listings_performance":{"notComputable":"A set of listing measures (views, trial starts, conversions, ratings) with no single formula."},"pipeline_value":{"formula":"sum(field.opportunity_amount * field.stage_probability where field.opportunity_stage not in ('closed_won', 'closed_lost'))","unit":"currency","variants":{"unweighted":"sum(field.opportunity_amount where field.opportunity_stage not in ('closed_won', 'closed_lost'))"},"notes":"Weighted form is the main formula. Always state weighted or unweighted."},"pipeline_coverage":{"formula":"sum(field.opportunity_amount where field.opportunity_stage not in ('closed_won', 'closed_lost')) / sum(field.quota)","unit":"ratio","notes":"Unweighted open pipeline (the unweighted variant of pipeline_value) over quota. The 3x to 4x benchmarks assume unweighted pipeline, since 1 / win rate already applies the conversion."},"pipeline_velocity":{"formula":"count(field.opportunity_id where field.opportunity_stage not in ('closed_won', 'closed_lost')) * metric.win_rate * metric.average_deal_size / metric.sales_cycle","unit":"currency","notes":"Revenue per day. Markdown describes deal size as ACV in the levers list and average deal value in the formula."},"win_rate":{"formula":"count(field.opportunity_id where field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / count(field.opportunity_id where field.opportunity_stage in ('closed_won', 'closed_lost') and in_period(field.close_date))","unit":"percent","breakdowns":{"by_channel":"field.channel"},"notes":"Excludes open deals and deals disqualified before the qualified stage. by_channel returns one row per acquisition channel the opportunities came through, the comparison behind channel budget decisions."},"lead_to_opportunity_rate":{"formula":"count_distinct(field.opportunity_id where in_period(field.opportunity_created_date)) / count_distinct(field.lead_id where in_period(field.lead_created_date))","unit":"percent"},"opportunity_to_close_rate":{"formula":"metric.win_rate","unit":"percent","notes":"Markdown states this is Win Rate measured from the opportunity stage."},"acv":{"formula":"avg(field.acv where field.contract_event_type = 'new_contract')","unit":"currency","notes":"ACV is recorded on the contract event (CEL). One-time fees are excluded by definition."},"average_deal_size":{"formula":"sum(field.opportunity_amount where field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / count(field.opportunity_id where field.opportunity_stage = 'closed_won' and in_period(field.close_date))","unit":"currency","notes":"Uses total contract value, not annualised."},"sales_cycle":{"formula":"avg(field.close_date - field.opportunity_created_date where field.opportunity_stage = 'closed_won' and in_period(field.close_date))","unit":"days","variants":{"median":"median(field.close_date - field.opportunity_created_date where field.opportunity_stage = 'closed_won' and in_period(field.close_date))"},"notes":"Mean days from opportunity creation to close for deals won in the period, as sales.md defines it. Report the median variant beside it to show outlier skew."},"quota_attainment":{"formula":"sum(field.closed_revenue) / sum(field.quota)","unit":"percent","variants":{"mean_of_reps":"avg(field.closed_revenue / field.quota)"},"notes":"Individual form groups by rep_id; team form uses totals."},"revenue_per_rep":{"formula":"sum(field.closed_revenue) / count_distinct(field.rep_id where field.quota > 0)","unit":"currency","notes":"Total new revenue per quota-carrying rep."},"ramp_time":{"formula":"(avg(field.ramped_date - field.hire_date)) / 30.4375","unit":"months","notes":"Per rep, from start date to consistently achieving quota. Convert days to months."},"activity_metrics_diagnostic":{"notComputable":"A diagnostic family of activity counts (calls, emails, meetings, demos) with no single formula."},"services_revenue":{"formula":"sum(field.revenue where field.revenue_type = 'services')","unit":"currency","notes":"Recognised services revenue (implementation, consulting, training)."},"services_as_of_total_revenue":{"formula":"metric.services_revenue / sum(field.revenue)","unit":"percent"},"services_attach_rate":{"formula":"count_distinct(field.opportunity_id where field.includes_services = true and field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / count_distinct(field.opportunity_id where field.opportunity_stage = 'closed_won' and in_period(field.close_date))","unit":"percent","notes":"Denominator is closed-won product deals."},"average_services_deal_size":{"formula":"sum(field.opportunity_amount where field.revenue_type = 'services') / count_distinct(field.opportunity_id where field.revenue_type = 'services')","unit":"currency","notes":"Services bookings divided by services engagements, one engagement per booked deal."},"services_backlog":{"formula":"sum(field.opportunity_amount where field.revenue_type = 'services' and field.opportunity_stage = 'closed_won') to_date - metric.services_revenue to_date","unit":"currency","notes":"Cumulative services booked minus cumulative services revenue recognised, to the end of the period."},"services_gross_margin":{"formula":"(metric.services_revenue - sum(field.cost where field.cost_function = 'services_delivery')) / metric.services_revenue","unit":"percent","notes":"Direct delivery cost covers consultant salaries, travel and contractor costs."},"project_margin":{"formula":"(sum(field.project_revenue where in_period(field.project_completion_date)) - sum(field.project_cost where in_period(field.project_completion_date))) / sum(field.project_revenue where in_period(field.project_completion_date))","unit":"percent","notes":"Margin on projects completed in the period."},"realization_rate":{"formula":"sum(field.billed_revenue) / sum(field.billed_hours * field.standard_rate)","unit":"percent","notes":"Hours worked at standard rate is taken from billable hours."},"write_off_rate":{"formula":"sum(field.written_off_hours) / sum(field.billed_hours)","unit":"percent"},"billable_utilization":{"formula":"sum(field.hours where field.time_entry_type = 'billable') / sum(field.available_hours)","unit":"percent","notes":"Available hours are total work hours minus PTO, holidays and company meetings."},"total_utilization":{"formula":"sum(field.hours where field.time_entry_type in ('billable', 'training', 'pre_sales', 'internal')) / sum(field.available_hours)","unit":"percent","notes":"Non-billable productive time is training, pre-sales and internal projects."},"bench_rate":{"formula":"count_distinct(field.consultant_id where field.project_id is null) / count_distinct(field.consultant_id)","unit":"percent","notes":"Rows are consultant assignment records; a consultant with no project assignment is on the bench."},"capacity":{"formula":"sum(field.available_hours)","unit":"hours","notes":"Sum over consultants of available hours."},"capacity_utilization":{"formula":"sum(field.hours_budgeted) / metric.capacity","unit":"percent","notes":"Hours booked is taken as budgeted hours on sold projects."},"on_time_delivery":{"formula":"count_distinct(field.project_id where in_period(field.project_completion_date) and field.project_completion_date <= field.target_date) / count_distinct(field.project_id where in_period(field.project_completion_date))","unit":"percent"},"on_budget_delivery":{"formula":"count_distinct(field.project_id where in_period(field.project_completion_date) and field.hours_actual <= field.hours_budgeted) / count_distinct(field.project_id where in_period(field.project_completion_date))","unit":"percent","notes":"Budget is measured in hours."},"scope_change_rate":{"formula":"count_distinct(field.project_id where field.scope_changed = true) / count_distinct(field.project_id)","unit":"percent"},"project_duration_accuracy":{"formula":"avg((field.target_date - field.project_start_date) / (field.project_completion_date - field.project_start_date) where in_period(field.project_completion_date))","unit":"percent","notes":"Per-project estimated duration over actual duration, averaged over projects completed in the period, so each project weighs the same. Target is 90 to 110 percent."},"project_csat":{"formula":"count(field.satisfaction_score where field.survey_type = 'project' and field.satisfaction_score >= 4) / count(field.satisfaction_score where field.survey_type = 'project')","unit":"percent","notes":"Positive is the top two ratings on a 5-point scale. Surveyed at project completion."},"project_nps":{"formula":"(count(field.nps_score where field.survey_type = 'project' and field.nps_score >= 9) - count(field.nps_score where field.survey_type = 'project' and field.nps_score <= 6)) / count(field.nps_score where field.survey_type = 'project') * 100","unit":"score","notes":"Reported as a score from -100 to 100, so the x 100 is part of the definition."},"rework_rate":{"formula":"count_distinct(field.deliverable_id where field.reworked = true) / count_distinct(field.deliverable_id)","unit":"percent"},"reference_ability":{"formula":"count_distinct(field.project_id where in_period(field.project_completion_date) and field.referenceable = true) / count_distinct(field.project_id where in_period(field.project_completion_date))","unit":"percent"},"revenue_per_consultant":{"formula":"metric.services_revenue / count_distinct(field.consultant_id)","unit":"currency","notes":"Benchmarks are annual, so use an annual period."},"projects_per_consultant":{"formula":"count_distinct(field.project_id where in_period(field.project_completion_date)) / count_distinct(field.consultant_id where in_period(field.project_completion_date))","unit":"ratio"},"average_project_duration":{"formula":"avg(field.project_completion_date - field.project_start_date where in_period(field.project_completion_date))","unit":"days"},"services_pipeline":{"formula":"sum(field.opportunity_amount where field.revenue_type = 'services' and field.opportunity_stage not in ('closed_won', 'closed_lost')) at period_end","unit":"currency"},"services_win_rate":{"formula":"count_distinct(field.opportunity_id where field.revenue_type = 'services' and field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / count_distinct(field.opportunity_id where field.revenue_type = 'services' and field.opportunity_stage in ('closed_won', 'closed_lost') and in_period(field.close_date))","unit":"percent"},"time_to_start":{"formula":"median(field.project_start_date - field.close_date where in_period(field.project_start_date))","unit":"days","notes":"close_date on the project is the close date of the won opportunity."},"ticket_volume":{"formula":"count_distinct(field.ticket_id)","unit":"count","breakdowns":{"by_ticket_type":"field.ticket_type"},"notes":"Tickets created in period. by_ticket_type returns the count of each type for staffing; Ticket Distribution by Type (ticket_distribution_by_type) is the share."},"tickets_per_customer":{"formula":"metric.ticket_volume / count_distinct(field.customer_id where field.customer_status = 'active') at period_end","unit":"ratio"},"ticket_backlog":{"formula":"count_distinct(field.ticket_id where field.ticket_status in ('open', 'pending')) at period_end","unit":"count"},"ticket_distribution_by_type":{"formula":"count_distinct(field.ticket_id) / total(metric.ticket_volume)","unit":"percent","breakdown":"field.ticket_type","notes":"Reported per ticket type: tickets of the type created in the period over Ticket Volume (all tickets created in the period). The numerator counts tickets as Ticket Volume does."},"frt":{"formula":"(median(field.first_response_at - field.created_at)) * 1440","unit":"minutes","notes":"Median, not average, to resist outlier skew."},"first_response_sla_adherence":{"formula":"count_distinct(field.ticket_id where field.first_response_at <= field.first_response_due_at) / count_distinct(field.ticket_id)","unit":"percent"},"resolution_time_time_to_resolution":{"formula":"(median(field.resolved_at - field.created_at)) * 24","unit":"hours","breakdowns":{"by_ticket_type":"field.ticket_type"},"notes":"Computed over resolved tickets. by_ticket_type returns one row per ticket type, since a bug waits on engineering and a how-to question does not."},"first_contact_resolution_fcr":{"formula":"count_distinct(field.ticket_id where field.resolved_first_contact = true) / count_distinct(field.ticket_id)","unit":"percent"},"resolution_sla_adherence":{"formula":"count_distinct(field.ticket_id where field.resolved_at <= field.resolution_due_at) / count_distinct(field.ticket_id)","unit":"percent"},"reopen_rate":{"formula":"count_distinct(field.ticket_id where field.reopened = true) / count_distinct(field.ticket_id where field.ticket_status = 'resolved')","unit":"percent","notes":"Resolved tickets include those since reopened."},"csat":{"formula":"count(field.satisfaction_score where field.survey_type = 'customer' and field.satisfaction_score >= 4) / count(field.satisfaction_score where field.survey_type = 'customer')","unit":"percent","notes":"Positive is the top two ratings on a 5-point scale."},"customer_effort_score_ces":{"formula":"avg(field.ces_score)","unit":"score","variants":{"percent":"count(field.ces_score where field.ces_score >= 5) / count(field.ces_score)"},"notes":"1 to 7 scale."},"tickets_per_agent":{"formula":"count_distinct(field.ticket_id) / count_distinct(field.agent_id)","unit":"ratio","notes":"Agents are employees in the support department."},"cost_per_ticket":{"formula":"sum(field.cost where field.cost_function = 'support') / count_distinct(field.ticket_id where field.ticket_status = 'resolved')","unit":"currency"},"self_service_rate":{"formula":"sum(field.deflections) / (sum(field.deflections) + metric.ticket_volume)","unit":"percent"},"logo_retention_rate":{"formula":"1 - metric.logo_churn_rate","unit":"percent","variants":{"customer_counts":"(count_distinct(field.customer_id where field.customer_status = 'active') at period_end - count_distinct(field.customer_id where field.event_type = 'new')) / count_distinct(field.customer_id where field.customer_status = 'active') at period_start"},"breakdowns":{"by_segment":"field.segment"},"notes":"by_segment returns one row per customer segment through Logo Churn Rate."},"health_score":{"formula":"avg(field.composite_score where field.customer_status = 'active') at period_end","unit":"score","breakdowns":{"by_segment":"field.segment"},"notes":"The portfolio average of the composite score (0 to 100) across customers active at period end. The composite is built upstream from usage, engagement, support and commercial signals with weights calibrated to the company's own churn data; customer-success.md gives a reference weighting as a starting point. by_segment returns one row per customer segment, since a healthy average can hide a weak enterprise segment."},"health_score_coverage":{"formula":"count_distinct(field.customer_id where field.composite_score is not null) / count_distinct(field.customer_id where field.customer_status = 'active')","unit":"percent","breakdowns":{"by_segment":"field.segment"},"notes":"Denominator is active accounts. Restrict to managed accounts or a revenue threshold by filtering the population. by_segment returns one row per customer segment, since coverage is usually required for enterprise accounts first."},"at_risk_rate":{"formula":"count_distinct(field.customer_id where field.composite_score < 40) / count_distinct(field.customer_id where field.composite_score is not null)","unit":"percent","variants":{"entered_at_risk":"count_distinct(field.customer_id where field.state_category = 'at_risk') / count_distinct(field.customer_id where field.customer_status = 'active') at period_start"},"breakdowns":{"by_segment":"field.segment"},"notes":"Health scores run 0 to 100; below 40 is at risk. Variant entered_at_risk is the flow: the share of customers active at period start who moved into the at_risk lifecycle state during the period (cel.md Lifecycle_State_Change). by_segment returns one row per customer segment, so risk in the segment that carries the most revenue is visible on its own."},"qbr_completion":{"formula":"count_distinct(field.customer_id where field.qbr_completed = true) / count_distinct(field.customer_id where field.qbr_due = true)","unit":"percent","notes":"Counted per account: customers with a QBR held in the period (qbr_completed) over customers with a QBR due (qbr_due), both on the customer snapshot. customer-success.md defines it over eligible accounts."},"executive_sponsor_coverage":{"formula":"count_distinct(field.customer_id where field.contact_role = 'executive_sponsor' and field.contact_engaged = true) / count_distinct(field.customer_id where field.customer_status = 'active')","unit":"percent","notes":"Numerator counts accounts with at least one engaged contact whose role is executive_sponsor on the contact snapshot at period end. Denominator is active accounts; restrict to managed accounts by filtering the population."},"contact_coverage":{"formula":"count_distinct(field.contact_id where field.contact_engaged = true) / count_distinct(field.customer_id where field.customer_status = 'active')","unit":"ratio","notes":"Engaged contacts on the contact snapshot at period end over active accounts on the customer snapshot. An account with no contacts counts in the denominator."},"expansion_rate":{"formula":"metric.expansion_mrr / metric.mrr at period_start","unit":"percent","breakdowns":{"by_segment":"field.segment"},"notes":"by_segment returns one row per customer segment, since expansion headroom differs by segment."},"license_utilization":{"formula":"sum(field.seats_assigned where field.license_status = 'active') / sum(field.seats_purchased where field.license_status = 'active')","unit":"percent","breakdowns":{"by_product":"field.product_name"},"notes":"Active licenses on the license snapshot at period end. Seats purchased is the entitlement the subscription grants; seats assigned is the number held by a named user. by_product returns one row per product the licenses cover, with the product id and product name: the name lives on the product dataset and licenses reach it through product_id."},"upsell_rate":{"formula":"count_distinct(field.customer_id where field.amendment_type = 'upgrade') / count_distinct(field.customer_id where field.upgrade_eligible = true) at period_start","unit":"percent"},"cross_sell_rate":{"formula":"count_distinct(field.customer_id where field.amendment_type = 'cross_sell') / count_distinct(field.customer_id where field.customer_status = 'active') at period_start","unit":"percent"},"renewal_rate":{"formula":"count_distinct(field.subscription_id where field.renewed = true and in_period(field.contract_end)) / count_distinct(field.subscription_id where in_period(field.contract_end))","unit":"percent","variants":{"by_value":"sum(field.renewal_amount where field.renewed = true and in_period(field.contract_end)) / sum(field.renewal_amount where in_period(field.contract_end))"},"notes":"Denominator is subscriptions whose term ended in the period."},"renewal_forecast_accuracy":{"formula":"1 - abs(sum(field.forecast_renewal_amount where in_period(field.contract_end)) - sum(field.renewal_amount where in_period(field.contract_end) and field.renewed = true)) / sum(field.renewal_amount where in_period(field.contract_end) and field.renewed = true)","unit":"percent"},"days_to_renewal":{"formula":"avg(field.contract_end - field.snapshot_date)","unit":"days","notes":"Averaged over upcoming renewals at the snapshot date."},"accounts_per_csm":{"formula":"count_distinct(field.customer_id) / count_distinct(field.csm_id)","unit":"ratio","notes":"Population is managed accounts."},"arr_per_csm":{"formula":"metric.arr / count_distinct(field.csm_id)","unit":"currency","notes":"ARR of managed accounts only."},"pipeline_hygiene_score":{"formula":"(count_distinct(field.opportunity_id where field.required_fields_complete = true) / count_distinct(field.opportunity_id) + count_distinct(field.opportunity_id where field.updated_within_sla = true) / count_distinct(field.opportunity_id) + count_distinct(field.opportunity_id where field.close_date_valid = true) / count_distinct(field.opportunity_id) + count_distinct(field.opportunity_id where field.stage_accurate = true) / count_distinct(field.opportunity_id)) / 4","unit":"percent","notes":"Population is open opportunities."},"forecast_accuracy":{"formula":"1 - abs(sum(field.forecasted_revenue) - sum(field.actual_revenue)) / sum(field.actual_revenue)","unit":"percent"},"commit_accuracy":{"formula":"count_distinct(field.opportunity_id where field.forecast_category = 'commit' and field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / count_distinct(field.opportunity_id where field.forecast_category = 'commit')","unit":"percent"},"stage_conversion_rates":{"formula":"count_distinct(field.opportunity_id where field.advanced_to_next_stage = true) / count_distinct(field.opportunity_id)","unit":"percent","notes":"Evaluate per stage by filtering field.stage to the stage of interest."},"quote_volume":{"formula":"count_distinct(field.quote_id where in_period(field.quote_sent_at))","unit":"count"},"quote_to_order_rate":{"formula":"count_distinct(field.order_id where in_period(field.order_completed_at)) / count_distinct(field.quote_id where in_period(field.quote_sent_at))","unit":"percent","notes":"Orders are those created from a quote in the period."},"quote_cycle_time":{"formula":"(median(field.quote_sent_at - field.quote_requested_at where in_period(field.quote_sent_at))) * 24","unit":"hours"},"quote_accuracy":{"formula":"count_distinct(field.quote_id where in_period(field.quote_sent_at) and field.revision_count = 0) / count_distinct(field.quote_id where in_period(field.quote_sent_at))","unit":"percent"},"discount_rate":{"formula":"(sum(field.list_price where in_period(field.quote_sent_at)) - sum(field.quoted_price where in_period(field.quote_sent_at))) / sum(field.list_price where in_period(field.quote_sent_at))","unit":"percent"},"order_to_activation_time":{"formula":"median(field.activation_date - field.acquisition_date where in_period(field.activation_date))","unit":"days"},"order_processing_time":{"formula":"(median(field.order_completed_at - field.order_received_at where in_period(field.order_completed_at))) * 24","unit":"hours"},"order_error_rate":{"formula":"count_distinct(field.order_id where in_period(field.order_completed_at) and field.has_error = true) / count_distinct(field.order_id where in_period(field.order_completed_at))","unit":"percent"},"billing_accuracy":{"formula":"count_distinct(field.invoice_id where in_period(field.invoice_date) and field.invoice_corrected = false) / count_distinct(field.invoice_id where in_period(field.invoice_date))","unit":"percent"},"invoice_cycle_time":{"formula":"median(field.invoice_date - field.billing_trigger_date where in_period(field.invoice_date))","unit":"days","notes":"Calendar days, as revops.md states. A business-day count differs when the interval spans weekends or holidays."},"billing_disputes":{"formula":"count_distinct(field.invoice_id where in_period(field.invoice_date) and field.invoice_disputed = true) / count_distinct(field.invoice_id where in_period(field.invoice_date))","unit":"percent","breakdowns":{"by_payment_status":"field.payment_status"},"notes":"by_payment_status returns one row per payment status as of period end, since a dispute rate concentrated in unpaid invoices points at collections."},"credit_memo_rate":{"formula":"count_distinct(field.invoice_id where in_period(field.invoice_date) and field.credit_memo_count > 0) / count_distinct(field.invoice_id where in_period(field.invoice_date))","unit":"percent"},"dso":{"formula":"sum(field.accounts_receivable) at period_end / metric.revenue_gaap * period_days","unit":"days","notes":"Defined in both Finance and RevOps; one formula."},"collection_effectiveness_index_cei":{"formula":"(sum(field.accounts_receivable) at period_start + sum(field.invoice_amount where in_period(field.invoice_date)) - sum(field.accounts_receivable) at period_end) / (sum(field.accounts_receivable) at period_start + sum(field.invoice_amount where in_period(field.invoice_date)) - sum(field.outstanding_amount where (field.snapshot_date - field.invoice_date) <= 30) at period_end)","unit":"percent","notes":"Billings stand in for credit sales. Current AR is receivables aged 30 days or less."},"aging_buckets":{"formula":"sum(field.outstanding_amount) / total(sum(field.outstanding_amount))","unit":"percent","breakdown":{"expression":"field.snapshot_date - field.invoice_date","buckets":{"current":[0,30],"days_31_60":[31,60],"days_61_90":[61,90],"days_90_plus":[91,null]}},"notes":"Reported per age bucket: outstanding amount on invoices whose age (days from invoice date to the period-end snapshot) falls in the bucket over the whole outstanding balance. Evaluate at period end."},"accounts_receivable_balance":{"formula":"sum(field.outstanding_amount where field.outstanding_amount > 0) at period_end","unit":"currency","breakdowns":{"by_payment_status":"field.payment_status"},"notes":"Open invoices on the period-end invoice snapshot. Should reconcile to balance_sheet.accounts_receivable, which DSO reads; differences are unapplied cash or write-offs. by_payment_status returns one row per payment status as of period end, the split finance reviews when chasing collections."},"bad_debt_rate":{"formula":"sum(field.bad_debt_expense) / metric.revenue_gaap","unit":"percent","notes":"Canonical definition is in finance.md; revops.md links to it. Denominator is GAAP recognised revenue (metric.revenue_gaap), not billings."},"payment_method_distribution":{"formula":"sum(field.invoice_amount where in_period(field.invoice_date)) / total(sum(field.invoice_amount where in_period(field.invoice_date) and field.payment_method is not null))","unit":"percent","breakdown":"field.payment_method","notes":"Reported per payment method: invoiced amount in the period paid by the method over invoiced amount with a known method."},"recognized_vs_billed":{"formula":"sum(field.recognized_revenue) / sum(field.billed_amount)","unit":"ratio"},"deferred_revenue_balance":{"formula":"sum(field.billed_amount) to_date - sum(field.recognized_revenue) to_date","unit":"currency","notes":"Balance at period end: cumulative billed minus cumulative recognised. Finance's Deferred Revenue entry points here."},"unbilled_revenue":{"formula":"sum(max(field.recognized_revenue - field.billed_amount, 0))","unit":"currency","notes":"Evaluated per subscription row, so only subscriptions where recognition exceeds billing contribute."},"revenue_recognition_accuracy":{"formula":"sum(field.recognized_revenue where field.recognition_correct = true) / sum(field.recognized_revenue)","unit":"percent"},"renewal_notification_rate":{"formula":"count_distinct(field.subscription_id where in_period(field.contract_end) and field.renewal_notified_on_time = true) / count_distinct(field.subscription_id where in_period(field.contract_end))","unit":"percent","notes":"Population is renewals in the period."},"auto_renewal_rate":{"formula":"count_distinct(field.subscription_id where in_period(field.contract_end) and field.auto_renewed = true) / count_distinct(field.subscription_id where in_period(field.contract_end))","unit":"percent","notes":"Population is renewals in the period."},"renewal_processing_time":{"formula":"median(field.renewal_complete_date - field.renewal_trigger_date where in_period(field.contract_end))","unit":"days"},"system_sync_accuracy":{"formula":"count(field.sync_status where field.sync_status = 'matched') / count(field.sync_status)","unit":"percent"},"data_completeness":{"formula":"sum(field.populated_field_count) / sum(field.required_field_count)","unit":"percent"},"daily_active_users_dau":{"formula":"window(count_distinct(field.user_id where field.product_event_type = 'qualifying'), 1 day)","unit":"count","notes":"The calendar day ending at period_end. Qualifying activity is a core action defined per product, not a login."},"weekly_active_users_wau":{"formula":"window(count_distinct(field.user_id where field.product_event_type = 'qualifying'), 7 day)","unit":"count","notes":"The 7 days ending at period_end."},"monthly_active_users_mau":{"formula":"window(count_distinct(field.user_id where field.product_event_type = 'qualifying'), 30 day)","unit":"count","notes":"The 30 days ending at period_end."},"dau_mau":{"formula":"metric.daily_active_users_dau / metric.monthly_active_users_mau","unit":"percent","notes":"Source formula multiplies by 100; stored unscaled."},"waumau_ratio":{"formula":"metric.weekly_active_users_wau / metric.monthly_active_users_mau","unit":"percent"},"active_accounts":{"formula":"count_distinct(field.customer_id where field.product_event_type = 'qualifying')","unit":"count","notes":"Accounts with at least one active user in the period."},"activation_rate":{"formula":"count_distinct(field.customer_id where in_period(field.onboarding_completion_date) and field.activation_date is not null) / count_distinct(field.customer_id where in_period(field.onboarding_completion_date))","unit":"percent","notes":"Onboarding-to-Active Rate: customers who completed onboarding in the period and reached activation."},"feature_adoption":{"formula":"count_distinct(field.user_id where field.feature_id is not null) / count_distinct(field.user_id where field.product_event_type = 'qualifying')","unit":"percent","notes":"Evaluated per feature_id. Numerator counts users who used the feature in the period."},"core_feature_adoption":{"formula":"count_distinct(field.user_id where field.core_features_adopted = true) / count_distinct(field.user_id where field.product_event_type = 'qualifying')","unit":"percent","notes":"Core set is 3 to 5 features defined per product. core_features_used is true when a user used all of them."},"feature_depth":{"formula":"sum(field.usage_count) / count_distinct(field.user_id where field.usage_count > 0)","unit":"ratio","notes":"Average feature actions per user per period."},"time_to_feature_adoption":{"formula":"median(field.first_use_date - field.signup_date where in_period(field.first_use_date))","unit":"days","notes":"Median days from a user's signup to their first use of the tracked feature, for users whose first use falls in the period. Both dates are on the user dataset (first_use_date is the first use of the feature)."},"breadth_of_adoption":{"formula":"count_distinct(field.customer_id, field.feature_id) / metric.active_accounts","unit":"ratio","notes":"Distinct (account, feature) pairs used in the period over active accounts: the average number of features each active account uses. Both fields are on product_event."},"session_frequency":{"formula":"count_distinct(field.session_id) / count_distinct(field.user_id where field.product_event_type = 'qualifying')","unit":"ratio"},"session_duration":{"formula":"avg(field.session_duration)","unit":"minutes","notes":"Equivalent to total session time divided by total sessions. Unit of the session_duration field assumed minutes."},"time_in_product":{"formula":"sum(field.session_duration) / count_distinct(field.user_id)","unit":"minutes","notes":"Total session time per user per period."},"actions_per_session":{"formula":"sum(field.usage_count) / count_distinct(field.session_id)","unit":"ratio"},"pqas":{"formula":"count_distinct(field.customer_id where field.criteria_met = true) at period_end","unit":"count","notes":"Threshold criteria are product-specific (usage count, features activated, users added, limits reached); criteria_met is true when an account meets them."},"user_retention_day_n":{"formula":"all_time(count_distinct(field.user_id where field.product_event_type = 'qualifying' and in_period(field.signup_date) and (field.event_date - field.signup_date) = 30)) / count_distinct(field.user_id where in_period(field.signup_date))","unit":"percent","notes":"Day 30 retention: users who signed up in the period and were active exactly 30 days after signup, over users who signed up in the period. The numerator reads all time because day 30 can fall after period_end. Change 30 for other N."},"cohort_retention":{"formula":"all_time(count_distinct(field.user_id where field.product_event_type = 'qualifying' and in_period(field.signup_date) and (field.event_date - field.signup_date) >= 49 and (field.event_date - field.signup_date) < 56)) / count_distinct(field.user_id where in_period(field.signup_date))","unit":"percent","notes":"Week 8 retention for the signup cohort of the period: users who signed up in the period and had qualifying activity 49 to 55 days after signup, over users who signed up in the period. The numerator reads all time because week 8 falls after period_end."},"resurrection_rate":{"formula":"count_distinct(field.user_id where field.product_event_type = 'reactivation') / count_distinct(field.user_id where field.user_status = 'dormant') at period_start","unit":"percent"},"release_frequency":{"formula":"count_distinct(field.release_id)","unit":"count","notes":"Releases per period, at feature or product level (distinct from code deployments)."},"feature_delivery_rate":{"formula":"count_distinct(field.feature_id where in_period(field.planned_date) and field.actual_date <= field.planned_date) / count_distinct(field.feature_id where in_period(field.planned_date))","unit":"percent"},"roadmap_completion":{"formula":"count_distinct(field.roadmap_item_id where field.roadmap_item_completed = true) / count_distinct(field.roadmap_item_id)","unit":"percent"},"time_to_market":{"formula":"median(field.release_date - field.feature_created_date where in_period(field.release_date))","unit":"days","notes":"Median days from concept approval to production release."},"error_rate_user_facing":{"formula":"count(field.event_id where field.product_event_type = 'error') / count(field.event_id where field.product_event_type in ('action', 'error'))","unit":"percent","notes":"Error events divided by total user actions (errors included in the denominator)."},"bug_escape_rate":{"formula":"count_distinct(field.issue_id where field.issue_type = 'bug' and field.issue_environment = 'production') / count_distinct(field.issue_id where field.issue_type = 'bug')","unit":"percent","notes":"Production bugs divided by production bugs plus bugs caught in QA. stage is 'production' or 'qa'."},"user_reported_issues":{"formula":"count_distinct(field.issue_id where field.issue_type = 'bug' and field.issue_source = 'user_report')","unit":"count"},"feature_request_volume":{"formula":"count_distinct(field.issue_id where field.issue_type = 'feature_request')","unit":"count","notes":"Tracked by theme or category."},"uptime":{"formula":"1 - sum(field.downtime_minutes) / (period_days * 1440)","unit":"percent","notes":"Total time is period_days * 1440 minutes. Scheduled maintenance counts as downtime (engineering.md)."},"sla_adherence":{"formula":"count(field.service_id where field.sla_met = true) / count(field.service_id)","unit":"percent","notes":"Periods meeting SLA divided by total periods."},"error_rate":{"formula":"sum(field.error_count) / sum(field.request_count)","unit":"percent","notes":"Server errors (5xx) divided by total requests."},"latency_response_time":{"formula":"percentile(field.response_time_ms, 0.95)","unit":"milliseconds","notes":"Canonical value is P95. Variants p50 and p99 give the other percentiles engineering.md lists. Report percentiles rather than averages, which hide tail latency.","variants":{"p50":"percentile(field.response_time_ms, 0.5)","p99":"percentile(field.response_time_ms, 0.99)"}},"incident_count":{"formula":"count_distinct(field.incident_id)","unit":"count","breakdowns":{"by_severity":"field.severity","by_incident_type":"field.incident_type"},"notes":"by_severity returns one row per severity (sev1 to sev4), because a month of sev4 noise and a month with one sev1 outage call for different responses. by_incident_type splits availability, performance, security and data incidents, which have different owners."},"mean_time_to_detect_mttd":{"formula":"(avg(field.detected_at - field.started_at)) * 1440","unit":"minutes","notes":"Detection time minus incident start time."},"mean_time_to_acknowledge_mtta":{"formula":"(avg(field.acknowledged_at - field.detected_at)) * 1440","unit":"minutes","notes":"Acknowledgment time minus alert time."},"mttr":{"formula":"(avg(field.resolved_at - field.started_at)) * 1440","unit":"minutes","breakdowns":{"by_severity":"field.severity","by_incident_type":"field.incident_type"},"notes":"Resolution time minus incident start time, in minutes. by_severity returns one row per severity because resolution targets are set per severity and a blended mean hides a slow sev1. by_incident_type separates incidents whose resolution paths differ, such as a security incident and a performance regression."},"change_failure_rate":{"formula":"count_distinct(field.deployment_id where field.incident_id is not null) / count_distinct(field.deployment_id)","unit":"percent"},"deployment_frequency":{"formula":"count_distinct(field.deployment_id)","unit":"count","notes":"Deployments per period."},"lead_time_for_changes":{"formula":"(median(field.deploy_date - field.committed_at)) * 24","unit":"hours","notes":"Median of deploy time minus commit time."},"mean_time_to_recovery_mttr":{"formula":"avg(field.recovery_time)","unit":"minutes","notes":"recovery_time is minutes from failure to service restored per incident (ontology field), so the formula averages it directly. Mean Time to Resolve (mttr) is a separate metric that reads started_at and resolved_at."},"infrastructure_utilization":{"formula":"avg(field.utilization)","unit":"percent","notes":"Measured per resource (CPU, memory, storage, network). Actual usage divided by provisioned capacity."},"infrastructure_cost_per_customer":{"formula":"sum(field.cost where field.cost_function = 'infrastructure') / count_distinct(field.customer_id where field.customer_status = 'active') at period_end","unit":"currency"},"headroom":{"formula":"1 - metric.infrastructure_utilization","unit":"percent","notes":"(Max capacity minus current usage) divided by max capacity."},"vulnerability_count":{"formula":"count_distinct(field.vulnerability_id where field.vulnerability_status = 'open')","unit":"count","notes":"Categorised by severity (critical, high, medium, low)."},"time_to_patch":{"formula":"(avg(field.patched_at - field.discovered_at where in_period(field.patched_at))) * 24","unit":"hours","notes":"Patch deploy time minus disclosure time."},"security_incident_count":{"formula":"count_distinct(field.incident_id where field.incident_type = 'security')","unit":"count"},"revenue_gaap":{"formula":"sum(field.revenue)","unit":"currency","notes":"Recognised revenue per ASC 606, not bookings or billings."},"bookings":{"formula":"sum(field.tcv where field.contract_event_type in ('new_contract', 'renewal', 'amendment'))","unit":"currency","variants":{"new":"sum(field.tcv where field.contract_event_type = 'new_contract')","renewal":"sum(field.tcv where field.contract_event_type = 'renewal')","expansion":"sum(field.tcv where field.contract_event_type = 'amendment')"},"notes":"Contracted value signed in the period, from contract events. Amendments count as expansion bookings when positive."},"billings":{"formula":"sum(field.invoice_amount where in_period(field.invoice_date))","unit":"currency","breakdowns":{"by_payment_status":"field.payment_status"},"notes":"by_payment_status returns one row per payment status as of period end, so finance sees how much of the period's billing is paid, unpaid, partly paid or written off."},"revenue_per_employee":{"formula":"metric.arr / metric.total_headcount","unit":"currency"},"operating_margin":{"formula":"metric.gross_margin - metric.opex_ratio","unit":"percent","notes":"Equals (Revenue - COGS - Operating expenses) / Revenue."},"ebitda_margin":{"formula":"sum(field.ebitda) / metric.revenue_gaap","unit":"percent"},"net_income_margin":{"formula":"sum(field.net_income) / metric.revenue_gaap","unit":"percent"},"burn_rate":{"formula":"(sum(field.cash_balance) at period_start - sum(field.cash_balance) at period_end) / (period_days / 30.4375)","unit":"currency","notes":"Net cash burn per month: cash delta over the period divided by months in the period."},"cash_runway":{"formula":"sum(field.cash_balance) at period_end / metric.burn_rate","unit":"months"},"fcf":{"formula":"sum(field.operating_cash_flow) - sum(field.capital_expenditures)","unit":"currency"},"free_cash_flow_margin":{"formula":"metric.fcf / metric.revenue_gaap","unit":"percent"},"magic_number":{"formula":"(metric.arr - lag(metric.arr, 1 quarter)) / lag(window(sum(field.cost where field.cost_function = 'gtm'), 1 quarter), 1 quarter)","unit":"ratio","notes":"ARR growth over the quarter ending at period_end, divided by sales and marketing spend in the quarter before that. The window makes the denominator one quarter of spend whatever the reporting period."},"burn_multiple":{"formula":"metric.burn_rate / (metric.net_new_mrr * 12)","unit":"ratio","notes":"Net burn over net new ARR for the same one-month period. Net new ARR is net new MRR x 12."},"opex_ratio":{"formula":"sum(field.cost where field.cost_function != 'infrastructure') / metric.revenue_gaap","unit":"percent","breakdowns":{"by_cost_centre":{"field":"field.cost_centre","total":true}},"notes":"Operating expenses are all costs outside COGS (cost_function infrastructure). by_cost_centre slices operating expenses by cost centre; the denominator stays the whole population of revenue, so the rows sum to the ratio."},"sm_as_of_revenue":{"formula":"sum(field.cost where field.cost_function = 'gtm') / metric.revenue_gaap","unit":"percent"},"rd_as_of_revenue":{"formula":"sum(field.cost where field.cost_function = 'research_development') / metric.revenue_gaap","unit":"percent"},"ga_as_of_revenue":{"formula":"sum(field.cost where field.cost_function = 'general_administrative') / metric.revenue_gaap","unit":"percent"},"collection_rate":{"formula":"sum(field.invoice_amount where in_period(field.invoice_date) and field.payment_date is not null) / metric.billings","unit":"percent","notes":"Invoice-level cash: an invoice issued in the period counts at its full amount once it has a payment date. The ontology has no payment amount field, so partial payments are not measured separately."},"ttfv":{"formula":"median(field.milestone_date - field.contract_start where field.onboarding_milestone = 'first_value')","unit":"days","notes":"Days from contract start to the first value milestone."},"time_to_go_live":{"formula":"median(field.milestone_date - field.contract_start where field.onboarding_milestone = 'go_live')","unit":"days"},"time_to_full_adoption":{"formula":"median(field.milestone_date - field.contract_start where field.onboarding_milestone = 'full_adoption')","unit":"days"},"onboarding_duration":{"formula":"median(field.onboarding_completion_date - field.onboarding_start_date where in_period(field.onboarding_completion_date))","unit":"days","notes":"Days from onboarding start to onboarding complete."},"onboarding_completion":{"formula":"count_distinct(field.onboarding_id where in_period(field.onboarding_completion_date)) / count_distinct(field.onboarding_id where in_period(field.onboarding_start_date))","unit":"percent","notes":"Onboardings completed in the period over onboardings started in the period."},"on_time_completion_rate":{"formula":"count_distinct(field.onboarding_id where in_period(field.onboarding_completion_date) and field.onboarding_completion_date <= field.target_date) / count_distinct(field.onboarding_id where in_period(field.onboarding_completion_date))","unit":"percent"},"onboarding_engagement_score":{"notComputable":"Weighted average of engagement indicators (attendance, responsiveness, task completion, logins) whose weights the markdown does not define."},"session_attendance_rate":{"formula":"count(field.onboarding_session_date where field.attendees > 0) / count(field.onboarding_session_date)","unit":"percent","notes":"A session counts as attended when at least one attendee is recorded."},"task_completion_rate":{"formula":"sum(field.steps_completed) / sum(field.steps_total)","unit":"percent"},"onboarding_csat":{"formula":"count(field.satisfaction_score where field.survey_type = 'onboarding' and field.satisfaction_score >= 4) / count(field.satisfaction_score where field.survey_type = 'onboarding')","unit":"percent","notes":"Surveyed at onboarding completion. Positive means 4 or 5 on a 5 point scale."},"onboarding_nps":{"formula":"(count(field.nps_score where field.survey_type = 'onboarding' and field.nps_score >= 9) - count(field.nps_score where field.survey_type = 'onboarding' and field.nps_score <= 6)) / count(field.nps_score where field.survey_type = 'onboarding') * 100","unit":"score","notes":"Reported as a score from -100 to 100, so the x 100 is part of the definition."},"implementation_quality_score":{"notComputable":"Assessment built from qualitative components (configuration accuracy, data quality, integration health, user setup) with no stated formula or weights."},"onboardings_per_resource":{"formula":"count_distinct(field.onboarding_id where in_period(field.onboarding_completion_date)) / count_distinct(field.resource_id where in_period(field.onboarding_completion_date))","unit":"ratio"},"cost_per_onboarding":{"formula":"sum(field.cost where field.cost_function = 'onboarding') / count_distinct(field.onboarding_id where in_period(field.onboarding_completion_date))","unit":"currency"},"time_spent_per_onboarding":{"formula":"sum(field.hours where in_period(field.onboarding_completion_date)) / count_distinct(field.onboarding_id where in_period(field.onboarding_completion_date))","unit":"hours"},"day_30_retention_post_onboarding":{"formula":"count_distinct(field.customer_id where field.onboarding_completion_date is not null and field.customer_status = 'active' and (field.last_active_date - field.onboarding_completion_date) >= 30) / count_distinct(field.customer_id where field.onboarding_completion_date is not null)","unit":"percent"},"onboarding_cohort_churn":{"notComputable":"A segmentation analysis of churn by onboarding duration, completeness and engagement, not a single formula."},"feature_adoption_at_go_live":{"formula":"count_distinct(field.feature_id where field.usage_count > 0) / count_distinct(field.feature_id)","unit":"percent","notes":"Evaluated as a snapshot at the go-live milestone."},"total_headcount":{"formula":"count_distinct(field.employee_id where field.employee_status = 'active') at period_end","unit":"count","breakdowns":{"by_department":"field.department"},"notes":"Includes full-time and part-time employees. Contractors are tracked separately. by_department returns the active headcount of each department at period end."},"headcount_growth_rate":{"formula":"(metric.total_headcount at period_end - metric.total_headcount at period_start) / metric.total_headcount at period_start","unit":"percent"},"employee_turnover":{"formula":"count_distinct(field.employee_id where field.termination_date >= period_start and field.termination_date <= period_end) / ((metric.total_headcount at period_start + metric.total_headcount at period_end) / 2)","unit":"percent","breakdowns":{"by_department":"field.department"},"notes":"Calculate monthly or annually. Annualize for comparability. Average headcount is the mean of start and end headcount. by_department returns one row per department: leavers and both headcounts are counted within the department, so attrition concentrated in one team shows."},"voluntary_turnover_rate":{"formula":"count_distinct(field.employee_id where field.termination_type = 'voluntary' and in_period(field.termination_date)) / ((metric.total_headcount at period_start + metric.total_headcount at period_end) / 2)","unit":"percent","breakdowns":{"by_department":"field.department"},"notes":"by_department returns one row per department, the slice that points at a team or a manager when resignations cluster."},"involuntary_turnover_rate":{"formula":"count_distinct(field.employee_id where field.termination_type = 'involuntary' and in_period(field.termination_date)) / ((metric.total_headcount at period_start + metric.total_headcount at period_end) / 2)","unit":"percent"},"regrettable_turnover":{"formula":"count_distinct(field.employee_id where field.termination_type = 'voluntary' and field.is_high_performer = true and in_period(field.termination_date)) / count_distinct(field.employee_id where field.is_high_performer = true and field.employee_status = 'active') at period_start","unit":"percent","notes":"Denominator is high performers at period start."},"average_tenure":{"formula":"(avg(field.snapshot_date - field.hire_date where field.employee_status = 'active') at period_end) / 30.4375","unit":"months","notes":"Markdown allows months or years. Months is canonical."},"day_90_turnover":{"formula":"count_distinct(field.employee_id where field.termination_date is not null and field.termination_date - field.hire_date <= 90) / count_distinct(field.employee_id where field.hire_date >= period_start and field.hire_date <= period_end)","unit":"percent","breakdowns":{"by_hire_source":"field.hire_source"},"notes":"Cohort is new hires in the period. 90 days approximated as 3 months of tenure. by_hire_source returns one row per hiring source, which shows the channels that bring hires who leave inside 90 days."},"enps":{"formula":"(count(field.nps_score where field.survey_type = 'employee' and field.nps_score >= 9) - count(field.nps_score where field.survey_type = 'employee' and field.nps_score <= 6)) / count(field.nps_score where field.survey_type = 'employee') * 100","unit":"score","notes":"Reported as a score from -100 to 100. Survey question: how likely are you to recommend the company as a place to work (0-10)."},"engagement_score":{"formula":"avg(field.engagement_score where field.survey_type = 'employee')","unit":"percent","notes":"Composite engagement survey score. The markdown names no formula beyond the composite, so the average of survey scores is encoded."},"survey_participation_rate":{"formula":"count(field.response_id where field.survey_type = 'employee' and field.survey_completed = true) / count(field.response_id where field.survey_type = 'employee')","unit":"percent","notes":"One row per survey sent."},"open_positions":{"formula":"count_distinct(field.requisition_id where field.requisition_status = 'open') at period_end","unit":"count"},"time_to_fill":{"formula":"avg(field.filled_date - field.requisition_opened_date where in_period(field.filled_date))","unit":"days","notes":"Days from job posted to offer accepted, per filled requisition."},"time_to_hire":{"formula":"avg(field.hire_date - field.application_date where in_period(field.hire_date))","unit":"days","notes":"Days from the hired employee's application to their start date, per employee hired in the period. Time to Fill covers requisition opened to offer accepted."},"offer_acceptance_rate":{"formula":"count(field.requisition_id where field.offer_status = 'accepted') / count(field.requisition_id where field.offer_status in ('accepted', 'declined'))","unit":"percent","notes":"One row per offer extended."},"quality_of_hire":{"formula":"avg(field.performance_rating where field.hire_date is not null and field.snapshot_date - field.hire_date >= 182 and field.snapshot_date - field.hire_date <= 365)","unit":"score","notes":"Average performance rating of hires at 6-12 months. The markdown also allows the share of hires meeting or exceeding expectations, which needs a rating threshold it does not define."},"cost_per_hire":{"formula":"sum(field.cost where field.cost_function = 'recruiting') / count_distinct(field.employee_id where field.hire_date >= period_start and field.hire_date <= period_end)","unit":"currency"},"source_of_hire":{"formula":"count_distinct(field.employee_id where in_period(field.hire_date)) / total(count_distinct(field.employee_id where in_period(field.hire_date)))","unit":"percent","breakdown":"field.hire_source","notes":"Reported per hire source: hires in the period through the source over all hires in the period, read on the period-end employee snapshot."},"compa_ratio":{"formula":"avg(field.salary / field.market_midpoint)","unit":"percent"},"pay_equity_ratio":{"formula":"avg(field.salary where field.underrepresented_group = true) / avg(field.salary where field.underrepresented_group = false)","unit":"ratio","notes":"Compare within the same role. Group A and group B are encoded as underrepresented and other groups. Target 0.98-1.02."},"diversity_representation":{"formula":"count_distinct(field.employee_id where field.underrepresented_group = true and field.employee_status = 'active') / count_distinct(field.employee_id where field.employee_status = 'active') at period_end","unit":"percent","notes":"Track overall and by department or level."},"diversity_in_leadership":{"formula":"count_distinct(field.employee_id where field.underrepresented_group = true and field.job_level in ('manager', 'director', 'vp', 'c_level') and field.employee_status = 'active') / count_distinct(field.employee_id where field.job_level in ('manager', 'director', 'vp', 'c_level') and field.employee_status = 'active') at period_end","unit":"percent"},"diversity_hiring_rate":{"formula":"count_distinct(field.employee_id where field.underrepresented_group = true and field.hire_date >= period_start and field.hire_date <= period_end) / count_distinct(field.employee_id where field.hire_date >= period_start and field.hire_date <= period_end)","unit":"percent"},"visitors":{"formula":"sum(field.unique_visitors)","unit":"count","notes":"Sum of per-source unique visitors: web_traffic is keyed by traffic_source, so a visitor arriving through two sources counts once in each. Load one row per source per reporting period so a returning visitor is not counted again within a source."},"visitor_to_lead_rate":{"formula":"metric.leads / metric.visitors","unit":"percent"},"leads":{"formula":"count_distinct(field.lead_id where in_period(field.lead_created_date))","unit":"count","breakdowns":{"by_lead_source":"field.lead_source","by_lead_stage":"field.lead_stage"},"notes":"New leads captured in the period. by_lead_source returns one row per lead source. by_lead_stage returns one row per stage at period end of the period's new leads, which shows how far the intake has progressed."},"mqls":{"formula":"count_distinct(field.lead_id where in_period(field.mql_date))","unit":"count","breakdowns":{"by_lead_source":"field.lead_source"},"notes":"by_lead_source returns one row per lead source, the slice marketing budgets are set against."},"lead_to_mql_rate":{"formula":"metric.mqls / metric.leads","unit":"percent","breakdowns":{"by_lead_source":"field.lead_source"},"notes":"by_lead_source returns one row per lead source with both counts taken within the source, so a source that brings volume but little qualified interest shows."},"sqls":{"formula":"count_distinct(field.lead_id where in_period(field.sql_date))","unit":"count","notes":"MQLs accepted by sales."},"mql_to_sql_rate":{"formula":"metric.sqls / metric.mqls","unit":"percent","breakdowns":{"by_lead_source":"field.lead_source"},"notes":"by_lead_source returns one row per lead source, which shows where sales rejects marketing's leads."},"sql_to_opportunity_rate":{"formula":"count_distinct(field.opportunity_id where in_period(field.opportunity_created_date)) / metric.sqls","unit":"percent"},"lvr":{"formula":"(metric.mqls - lag(metric.mqls, 1 month)) / lag(metric.mqls, 1 month)","unit":"percent","notes":"Uses qualified leads (MQLs), not raw leads."},"marketing_cac":{"formula":"sum(field.cost where field.cost_function = 'gtm' and field.cost_centre = 'marketing') / count_distinct(field.customer_id where field.event_type = 'new')","unit":"currency"},"cac_by_channel":{"formula":"sum(field.ad_spend) / count_distinct(field.opportunity_id where field.opportunity_stage = 'closed_won' and in_period(field.close_date))","unit":"currency","breakdown":"field.channel","notes":"Reported per marketing channel. Spend is campaign ad spend, which carries its channel, rather than the cost ledger: cost_event rows have a cost function but no channel, so ledger cost cannot be split by channel. New customers are opportunities won in the period, attributed to their first-touch channel."},"cpl":{"formula":"sum(field.cost where field.cost_function = 'gtm' and field.cost_centre = 'marketing') / metric.leads","unit":"currency"},"cost_per_mql":{"formula":"sum(field.cost where field.cost_function = 'gtm' and field.cost_centre = 'marketing') / metric.mqls","unit":"currency"},"marketing_sourced_pipeline":{"formula":"sum(field.opportunity_amount where field.marketing_source = 'marketing' and field.opportunity_stage not in ('closed_won', 'closed_lost'))","unit":"currency","notes":"First-touch attribution."},"marketing_sourced_revenue":{"formula":"sum(field.opportunity_amount where field.marketing_source = 'marketing' and field.opportunity_stage = 'closed_won' and in_period(field.close_date))","unit":"currency","notes":"First-touch attribution on closed won revenue."},"marketing_influenced_pipelinerevenue":{"formula":"sum(field.opportunity_amount where field.marketing_influenced = true and field.opportunity_stage not in ('closed_won', 'closed_lost'))","unit":"currency","variants":{"revenue":"sum(field.opportunity_amount where field.marketing_influenced = true and field.opportunity_stage = 'closed_won' and in_period(field.close_date))"},"notes":"Multi-touch attribution: any marketing touch. Main formula is pipeline, the revenue variant covers closed won."},"organic_traffic":{"formula":"sum(field.unique_visitors where field.traffic_source = 'organic_search')","unit":"count"},"paid_media_efficiency_roas":{"formula":"sum(field.opportunity_amount where field.channel = 'paid_ads' and field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / sum(field.ad_spend where field.channel = 'paid_ads')","unit":"ratio","notes":"Expressed as a ratio such as 3x."},"email_metrics":{"notComputable":"A family of six email rates (open, click, click-to-open, unsubscribe, bounce, spam complaint) with no single headline metric. The ontology has no email send dataset or fields for sends, deliveries, opens, clicks, unsubscribes, bounces or complaints, so none of the six is encoded."},"content_performance":{"notComputable":"A family of content measures (downloads, engagement rate, content-to-MQL) with no single metric."},"brand_awareness":{"notComputable":"Survey-based or search volume proxy with no defined formula."},"share_of_voice":{"formula":"sum(field.mention_count where field.is_competitor = false) / sum(field.mention_count)","unit":"percent","notes":"Brand mentions / (brand + competitor mentions)."},"nps_marketing_context":{"formula":"(count(field.nps_score where field.survey_type = 'prospect' and field.nps_score >= 9) - count(field.nps_score where field.survey_type = 'prospect' and field.nps_score <= 6)) / count(field.nps_score where field.survey_type = 'prospect') * 100","unit":"score","notes":"Same NPS arithmetic applied to prospect and market respondents rather than customers."},"onboarding_milestone_completion_rate":{"formula":"all_time(count(field.onboarding_id where in_period(field.milestone_due_date) and field.milestone_date is not null and field.milestone_date <= period_end)) / all_time(count(field.onboarding_id where in_period(field.milestone_due_date)))","unit":"percent","notes":"Milestones reached over milestones due: onboarding milestones due in the period that were reached by period end, over all milestones due in the period. Each row of onboarding_milestone is one planned milestone, so planned rows carry milestone_due_date before milestone_date is set; all_time keeps unreached rows that the milestone_date period filter would drop. Add field.onboarding_milestone = '<milestone>' to both sides for a single milestone."},"project_milestone_completion_rate":{"formula":"count_distinct(field.project_milestone_id where in_period(field.actual_date) and field.actual_date <= field.planned_date) / count_distinct(field.project_milestone_id where in_period(field.actual_date))","unit":"percent","notes":"Milestones delivered in the period that met their planned date."},"ticket_escalation_rate":{"formula":"count_distinct(field.ticket_id where field.escalated = true) / count_distinct(field.ticket_id)","unit":"percent"},"project_escalation_rate":{"formula":"count_distinct(field.project_id where field.escalated = true) / count_distinct(field.project_id)","unit":"percent"},"product_activation_rate":{"formula":"count_distinct(field.user_id where in_period(field.signup_date) and field.activation_date is not null) / count_distinct(field.user_id where in_period(field.signup_date))","unit":"percent","notes":"Users who signed up in the period and reached the activation milestone. The milestone is product-specific and must be defined explicitly."},"trial_to_paid_conversion_rate":{"formula":"count_distinct(field.trial_id where field.trial_status = 'converted' and in_period(field.trial_end_date)) / count_distinct(field.trial_id where field.trial_status in ('converted', 'expired', 'cancelled') and in_period(field.trial_end_date))","unit":"percent","variants":{"by_start_date":"all_time(count_distinct(field.trial_id where field.trial_status = 'converted' and in_period(field.trial_start_date))) / all_time(count_distinct(field.trial_id where in_period(field.trial_start_date)))"},"notes":"Trials are counted by the date they ended (the trial dataset's date), so every trial in the denominator has an outcome; a trial that converts ends on the day it converts. The by_start_date variant counts trials started in the period, lifting the end-date period filter with all_time(); it understates recent periods while trials are still running."},"consumption_revenue":{"formula":"-sum(field.credit_amount where field.credit_event_type = 'consumption')","unit":"currency","breakdowns":{"by_basis":"field.consumption_basis","by_segment":"field.segment"},"notes":"Consumption events carry a negative credit_amount; the metric reports a positive amount. Revenue recognised as usage occurs: drawn from a prepaid balance (committed), above a commitment (overage) or with no commitment (on_demand). Usage within a ratable commitment is no event; that revenue is the commitment, in MRR. by_basis returns one row per consumption basis."},"usage_run_rate":{"formula":"-window(sum(field.credit_amount where field.credit_event_type = 'consumption' and field.consumption_basis = 'on_demand'), 3 month) * 4","unit":"currency","notes":"Also called Usage ARR. The trailing three months of on-demand consumption, annualised. Committed consumption is already in ARR through the commitment and overage through the usage_realisation pair, so only on-demand consumption enters, and ARR + Usage Run-Rate counts nothing twice. GASP fixes the window at three months (MongoDB's 90 days, Confluent's three months) so two companies' figures compare."},"prepaid_credit_balance":{"formula":"sum(field.credit_amount where field.credit_event_type in ('purchase', 'expiry', 'adjustment') or field.consumption_basis = 'committed') to_date","unit":"currency","notes":"Also called Remaining Commitment. Purchases and granting adjustments less committed consumption, expiries and reducing adjustments, cumulative to period end. On-demand and overage consumption draw no balance and are left out. The part of the deferred revenue balance that is prepaid consumption."},"arr_including_usage_run_rate":{"formula":"metric.arr + metric.usage_run_rate","unit":"currency","notes":"What consumption companies print as ARR: committed ARR plus annualised uncommitted usage. GASP keeps ARR committed and names the combined figure, so the two cannot be confused."},"credit_breakage":{"formula":"-sum(field.credit_amount where field.credit_event_type = 'expiry')","unit":"currency","notes":"Expiry events carry a negative credit_amount; the metric reports a positive amount. The prepaid balance forfeited at expiry in the period: the commercial fact behind breakage revenue (ASC 606-10-55-48, IFRS 15.B46). A company that expects breakage recognises it in proportion to consumption; the expiry event is the forfeiture, not the recognition."},"consumption_revenue_growth_rate":{"formula":"(metric.consumption_revenue - lag(metric.consumption_revenue, 1 month)) / lag(metric.consumption_revenue, 1 month)","unit":"percent"},"consumption_net_revenue_retention":{"formula":"metric.consumption_revenue / lag(metric.consumption_revenue, 12 month) over cohort(field.customer_id, period_start)","unit":"percent","notes":"The cohort's consumption revenue over the period divided by the same cohort's consumption revenue in the twelve months before, on a twelve-month period: year two over year one, Snowflake's basis. A customer in the cohort that consumed nothing in the period counts at zero. A second basis beside NRR, which reads MRR movements; a company reporting this figure names it as such rather than as NRR."}},"adapterSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://gaspwiki.com/schemas/gasp-adapter-v1.json","title":"GASP Adapter","description":"Maps a business's data warehouse to the canonical GASP vocabulary. Each GASP field belongs to one or more datasets (logical tables). Map a table to each dataset you have and a column to each field, then validate to see which GASP metrics you can compute.","type":"object","required":["version","mappings"],"properties":{"$schema":{"type":"string","description":"URL of this schema"},"version":{"enum":["1.0","1.1"],"description":"Adapter schema version. 1.1 adds datasets and per-field metadata."},"organization":{"type":"string","description":"Your organization name (for reference only)"},"warehouse":{"type":"string","description":"Warehouse platform (e.g. snowflake, bigquery, postgres, redshift, databricks)","examples":["snowflake","bigquery","postgres"]},"_instructions":{"type":"string","description":"Free text for template guidance; ignored by tools"},"metricOwners":{"type":"array","description":"Who in your organization owns each metric definition. Recommended for every metric you report; the validator lists metrics without an owner.","items":{"$ref":"#/$defs/metricOwner"}},"datasets":{"type":"object","description":"Warehouse table behind each GASP dataset, as schema.table. Optional: when absent, the validator infers the table from the warehouseRef prefix shared by the dataset's mapped fields, and reports datasets whose fields point at different tables.","additionalProperties":{"type":"string","examples":["billing.subscriptions","analytics.dim_customer"]}},"mappings":{"type":"array","description":"One entry per GASP field you can map. Unmapped fields may be omitted or left with an empty warehouseRef; the validator reports which metrics are covered.","items":{"$ref":"#/$defs/fieldMapping"}}},"additionalProperties":false,"$defs":{"metricOwner":{"type":"object","required":["metric","team"],"description":"Declares who owns the definition of a metric: the person or team that resolves disputes about how it is calculated.","properties":{"metric":{"type":"string","description":"Metric name or formula id (e.g. 'NRR', 'nrr', 'Pipeline Value'), or 'All Core Metrics'","examples":["MRR","NRR","Pipeline Value","All Core Metrics"]},"team":{"type":"string","description":"The team that owns this metric definition","examples":["Finance","RevOps","Data Engineering","Customer Success"]},"contact":{"type":"string","description":"Optional contact person: email, Slack handle or name","examples":["jane@acme.com","#finance-metrics","Jane Smith"]}},"additionalProperties":false},"fieldMapping":{"type":"object","required":["gaspField","warehouseRef"],"properties":{"gaspField":{"type":"string","description":"Canonical GASP field id (e.g. 'customer_id', 'mrr', 'event_type'). Must match a field in the GASP ontology."},"dataset":{"type":"string","description":"GASP dataset this mapping applies to. Fields that live on several datasets (customer_id, snapshot_date, event_date) need one mapping per dataset you use; a mapping without dataset applies to every dataset of the field."},"warehouseRef":{"type":"string","description":"Your warehouse column, as schema.table.column or as a bare column name when the dataset's table is declared under datasets. Leave empty for fields you have not mapped yet.","examples":["billing.subscriptions.mrr","analytics.dim_customer.customer_id"]},"transform":{"type":"string","description":"Optional SQL expression applied to the column so the value matches GASP semantics, including mapping your enum values onto GASP's. Use {{value}} for the column.","examples":["{{value}} / 100","CASE WHEN {{value}} = 'Won' THEN 'closed_won' WHEN {{value}} = 'Lost' THEN 'closed_lost' ELSE 'open' END"]},"owner":{"type":"string","description":"Optional owner of this field's data quality"},"notes":{"type":"string","description":"Free text"},"type":{"type":"string","description":"GASP type of the field (informational, copied from the ontology)"},"datasets":{"type":"array","items":{"type":"string"},"description":"GASP datasets the field belongs to (informational, copied from the ontology)"},"values":{"type":"array","items":{"type":"string"},"description":"Declared enum values the mapped column must produce after transform (informational, copied from the ontology)"},"source":{"type":"string","description":"Typical source system category (informational)"},"usedBy":{"type":"array","items":{"type":"string"},"description":"Metrics whose formulas reference this field (informational)"}},"additionalProperties":false}}},"extensionSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://gaspwiki.com/schemas/gasp-ossie-extension-v1.json","title":"GASP Ossie Extension","description":"Describes the GASP payloads in Apache Ossie documents. Every Ossie document GASP writes carries custom_extensions entries with vendor_name GASP whose data is a JSON string; this schema describes that string parsed as JSON, one definition per placement: the semantic model, a dataset, a metric and the mapping. GASP writes no extension on fields or relationships. Each key here is a gap in the Ossie specification today, so a key retired by an upstream merge leaves this schema. Versioned independently of the Ossie specification.","anyOf":[{"$ref":"#/$defs/ModelExtension"},{"$ref":"#/$defs/DatasetExtension"},{"$ref":"#/$defs/MetricExtension"},{"$ref":"#/$defs/MappingExtension"}],"$defs":{"ModelExtension":{"type":"object","description":"On the semantic model document: how the model was made. profile_schema writes profiled; compile_model writes compiled and drops the profiled record it replaces.","properties":{"profiled":{"type":"object","description":"The model was written by the schema profiler (profile_schema).","required":["input","statistics","questions"],"properties":{"input":{"enum":["columns-json","tables-json","columns-csv","ddl"],"description":"The schema format the profiler read: information_schema rows as JSON or CSV, a tables list or CREATE TABLE statements"},"statistics":{"type":"boolean","description":"Whether per-column statistics were given"},"questions":{"type":"integer","minimum":0,"description":"How many questions the profiler could not settle"}},"additionalProperties":false},"compiled":{"type":"object","description":"The GASP metrics were compiled into the model (compile_model).","required":["gasp_version","dialect","period_spine","metrics","staged"],"properties":{"gasp_version":{"const":"1","description":"The GASP extension version"},"dialect":{"$ref":"#/$defs/OssieDialect","description":"The dialect the compiled metrics and staged sources are written in"},"period_spine":{"type":"string","description":"The table of reporting periods the staged datasets read"},"metrics":{"type":"integer","minimum":0,"description":"How many GASP metrics were compiled in"},"staged":{"type":"integer","minimum":0,"description":"How many staged datasets were written"}},"additionalProperties":false}},"additionalProperties":false},"DatasetExtension":{"type":"object","description":"On a dataset. A reference dataset carries kind with cel and activeWhen where the ontology declares them; a staged dataset carries staged, for, reason and source_dialect; the period spine carries period_spine; a profiled dataset carries profile. record_decision adds profile to whatever a dataset already carries.","properties":{"kind":{"enum":["event","snapshot","fact"],"description":"The GASP dataset kind (ontology.json datasets)"},"cel":{"enum":["Revenue_Event","Cost_Event","Contract_Event","Amendment_Event","Lifecycle_State_Change","Credit_Event"],"description":"The CEL event class the dataset holds"},"activeWhen":{"type":"string","description":"Grammar condition selecting live rows, used for cohort membership"},"staged":{"const":true,"description":"The dataset is a staged per-period dataset holding one metric's value"},"for":{"type":"string","description":"The metric the staged dataset holds"},"reason":{"$ref":"#/$defs/StagedReason"},"source_dialect":{"$ref":"#/$defs/OssieDialect","description":"The dialect the dataset's source query is written in (Ossie's source has no dialect property)"},"sources":{"type":"object","description":"The source query in each other dialect","propertyNames":{"$ref":"#/$defs/OssieDialect"},"additionalProperties":{"type":"string"}},"period_spine":{"const":true,"description":"The dataset is the table of reporting periods the staged datasets read"},"profile":{"$ref":"#/$defs/DatasetProfile"}},"dependentRequired":{"staged":["for","reason","source_dialect"],"for":["staged"],"reason":["staged"],"source_dialect":["staged"],"sources":["staged"],"cel":["kind"],"activeWhen":["kind"]},"additionalProperties":false},"MetricExtension":{"type":"object","description":"On a metric GASP compiled: the canonical metric it implements.","required":["gasp_id","gasp_version","unit","formula"],"properties":{"gasp_id":{"type":"string","description":"The GASP formula id (formulas.json)"},"gasp_version":{"const":"1","description":"The GASP extension version"},"form":{"enum":["O","M"],"description":"The dual-lens form: Operating or Market"},"variant":{"type":"string","description":"The named variant of the formula"},"unit":{"enum":["currency","percent","ratio","count","days","months","hours","minutes","milliseconds","score"],"description":"The unit of the value; ratios are unscaled"},"formula":{"type":"string","description":"The canonical formula in the GASP grammar"},"gasp_breakdown":{"type":"string","description":"The breakdown dimension, as a field or dataset.field"},"staged":{"const":true,"description":"The metric reads a staged dataset"}},"additionalProperties":false},"MappingExtension":{"type":"object","description":"On the mapping document. A mapping converted from a v1 adapter carries the adapter's metadata; propose_mapping writes organization and proposed; record_decision keeps what is there and adds metricOwners and decisions.","properties":{"adapter_version":{"type":"string","description":"The version of the v1 adapter the mapping was converted from"},"organization":{"type":"string","description":"The organization the mapping describes"},"warehouse":{"type":"string","description":"The warehouse platform"},"metricOwners":{"type":"array","description":"Who owns each metric definition, as in the adapter schema","items":{"$ref":"#/$defs/MetricOwner"}},"proposed":{"type":"object","description":"What the mapping proposer paired and what it left to review","required":["datasets","fields","transforms","candidates","unmatched"],"properties":{"datasets":{"type":"integer","minimum":0,"description":"Tables proposed to a GASP dataset"},"fields":{"type":"integer","minimum":0,"description":"Field pairs in the mapping"},"transforms":{"type":"integer","minimum":0,"description":"Field pairs read through a transform"},"candidates":{"type":"array","items":{"$ref":"#/$defs/Candidate"}},"unmatched":{"type":"array","items":{"$ref":"#/$defs/UnmatchedTable"}}},"additionalProperties":false},"decisions":{"type":"array","description":"Every decision on file, one per subject","items":{"$ref":"#/$defs/DecisionRecord"}}},"additionalProperties":false},"OssieDialect":{"enum":["POSTGRES","SNOWFLAKE","BIGQUERY","DATABRICKS"],"description":"A registered Ossie dialect GASP compiles to"},"StagedReason":{"enum":["cohort","lag","window","all_time","distinct pair","bucket","total","to_date","at period_start","period bound in filter","period bound","period_days"],"description":"The construct the Ossie expression language cannot state, so the metric is staged"},"Confidence":{"enum":["declared","high","medium","low"]},"DatasetProfile":{"type":"object","description":"What the profiler inferred about the table, with confidence and evidence; record_decision marks a decided key, time field or kind declared","properties":{"kind":{"enum":["snapshot","event","fact","reference"],"description":"The inferred or decided table kind"},"confidence":{"type":"object","properties":{"kind":{"$ref":"#/$defs/Confidence"},"key":{"$ref":"#/$defs/Confidence"},"time":{"$ref":"#/$defs/Confidence"}},"additionalProperties":false},"evidence":{"type":"object","properties":{"kind":{"type":"string"},"key":{"type":"string"},"time":{"type":"string"}},"additionalProperties":false},"questions":{"type":"array","items":{"$ref":"#/$defs/Question"}},"values":{"type":"object","description":"Column → the enum values listed for it","additionalProperties":{"type":"array","items":{"type":"string"}}}},"additionalProperties":false},"Question":{"type":"object","description":"What the profiler could not settle from the names and statistics","required":["dataset","about","question","why"],"properties":{"dataset":{"type":"string"},"about":{"enum":["key","time","type"]},"question":{"type":"string"},"options":{"type":"array","items":{"type":"string"}},"why":{"type":"string"}},"additionalProperties":false},"MetricOwner":{"type":"object","required":["metric","team"],"properties":{"metric":{"type":"string"},"team":{"type":"string"},"contact":{"type":"string"}},"additionalProperties":false},"Candidate":{"type":"object","description":"A table or column pair the evidence supports without settling","required":["table","source","dataset","evidence","settle"],"properties":{"table":{"type":"string"},"source":{"type":"string"},"column":{"type":"string"},"dataset":{"type":"string"},"field":{"type":"string"},"evidence":{"type":"string"},"settle":{"type":"string"}},"additionalProperties":false},"UnmatchedTable":{"type":"object","description":"A table no GASP dataset matches, with the nearest one","required":["table","source"],"properties":{"table":{"type":"string"},"source":{"type":"string"},"best":{"type":"object","required":["dataset","score"],"properties":{"dataset":{"type":"string"},"score":{"type":"number"}},"additionalProperties":false}},"additionalProperties":false},"DecisionRecord":{"type":"object","description":"A decision as recorded: who decided what, when, and what applying it did","required":["about","owner","date","effect"],"properties":{"about":{"enum":["key","time","kind","type","table","field","owner","topic"]},"dataset":{"type":"string"},"column":{"type":"string"},"to":{"type":"string"},"answer":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"accept":{"type":"boolean"},"transform":{"type":"string"},"metric":{"type":"string"},"contact":{"type":"string"},"topic":{"type":"string"},"owner":{"type":"string"},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"note":{"type":"string"},"effect":{"type":"string"}},"additionalProperties":false}}},"ossieSchemas":{"mapping":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://github.com/apache/ossie/ontology/mapping.json","title":"Apache Ossie Mapping Specification","description":"JSON Schema for validating a standalone Apache Ossie mapping document: the constructs of one semantic model mapped onto one ontology, as its own document rather than embedded inside the ontology's ontology_mappings.","type":"object","properties":{"version":{"type":"string","const":"0.2.0.dev0","description":"Mapping specification version"},"name":{"type":"string","minLength":1,"description":"Unique identifier for this mapping"},"description":{"type":"string","description":"Human-readable description of this mapping"},"ontology_ref":{"$ref":"#/$defs/DocumentReference","description":"Reference to the ontology document this mapping targets"},"semantic_model_ref":{"$ref":"#/$defs/DocumentReference","description":"Reference to the semantic model document this mapping draws from"},"concept_mappings":{"type":"array","items":{"$ref":"https://raw.githubusercontent.com/apache/ossie/main/ontology/ontology.json#/$defs/ConceptMapping"},"description":"Maps logical model constructs to some concept and its relationships in the referenced ontology"},"custom_extensions":{"$ref":"https://raw.githubusercontent.com/apache/ossie/main/core-spec/ossie-schema.json#/$defs/SemanticModel/properties/custom_extensions"}},"required":["version","name","ontology_ref","semantic_model_ref","concept_mappings"],"additionalProperties":false,"$defs":{"DocumentReference":{"type":"object","description":"Reference to another Ossie document by its logical name, with an iri saying where to resolve it from","properties":{"name":{"type":"string","minLength":1,"description":"Must equal the referenced document's own 'name'; carries this reference's checkable identity regardless of location"},"iri":{"type":"string","minLength":1,"description":"Where to resolve the referenced document from: a relative reference resolved against the mapping document's own location or base IRI, or an absolute IRI"}},"required":["name"],"additionalProperties":false}}},"ontology":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://github.com/apache/ossie/ontology/ontology.json","title":"Apache Ossie Ontology Metadata Specification","description":"JSON Schema for validating Apache Ossie ontology definitions","type":"object","properties":{"version":{"type":"string","const":"0.2.0.dev0","description":"Ontology specification version"},"name":{"type":"string","minLength":1,"description":"Unique identifier for the ontology"},"description":{"type":"string","description":"Human-readable description"},"ai_context":{"$ref":"https://raw.githubusercontent.com/apache/ossie/main/core-spec/ossie-schema.json#/$defs/AIContext"},"requires":{"type":"array","items":{"$ref":"#/$defs/Expression"},"description":"Expressions that constrain the population of this ontology"},"ontology":{"type":"array","items":{"$ref":"#/$defs/OntologyComponent"},"minItems":1,"description":"Components that define the concepts and relationships in this ontology"},"ontology_mappings":{"type":"array","description":"Deprecated. Embedded ontology maps, accepted only so existing documents continue to validate; write mappings as standalone documents validated against ontology/mapping.json instead.","deprecated":true,"items":{"$ref":"#/$defs/OntologyMap"}},"prefixes":{"type":"object","description":"Maps namespace prefixes to the IRIs they abbreviate, enabling QName expansion (e.g., 'foaf' -> 'http://xmlns.com/foaf/0.1/').","additionalProperties":{"type":"string","minLength":1,"format":"iri"}}},"required":["version","name","ontology"],"additionalProperties":false,"$defs":{"OntologyComponent":{"type":"object","description":"Ontology component that defines a single concept and any relationships that are keyed primarily by that concept","properties":{"concept":{"type":"string","minLength":1,"description":"Unique name of the concept defined by this component"},"type":{"$ref":"#/$defs/ConceptType"},"description":{"type":"string","description":"Human-readable description of the concept"},"extends":{"type":"array","items":{"type":"string","minLength":1},"description":"Indicates that this concept extends one or more other concepts"},"derived_by":{"type":"array","items":{"$ref":"#/$defs/Expression"},"description":"Expressions that define how this concept is derived"},"identify_by":{"type":"array","items":{"type":"string","minLength":1},"description":"Names of relationships to use as the preferred identifier of this concept"},"requires":{"type":"array","items":{"$ref":"#/$defs/Expression"},"description":"Expressions that constrain the population of this concept"},"relationships":{"type":"array","items":{"$ref":"#/$defs/Relationship"},"description":"Defines relationships that pertain primarily to the concept defined in this component"},"iri":{"type":"string","minLength":1,"description":"Optional global identifier for this concept, expressed as a full IRI or as a QName (prefix:local) resolved against the ontology-level 'prefixes' map."}},"required":["concept","type"],"additionalProperties":false},"Expression":{"type":"string","minLength":1,"description":"ANSI SQL expression"},"Relationship":{"type":"object","description":"Relationship between concepts in the ontology","properties":{"name":{"type":"string","minLength":1,"description":"Name of the relationship"},"description":{"type":"string","description":"Human-readable description of the relationship"},"roles":{"type":"array","items":{"$ref":"#/$defs/Role"},"description":"Additional roles in this relationship"},"multiplicity":{"$ref":"#/$defs/Multiplicity"},"derived_by":{"type":"array","items":{"$ref":"#/$defs/Expression"},"description":"Expressions that define how this concept is derived"},"requires":{"type":"array","items":{"$ref":"#/$defs/Expression"},"description":"Expressions that constrain the population of this relationship"},"verbalizes":{"type":"array","items":{"type":"string","minLength":1},"description":"Natural language expressions that verbalize this relationship"},"iri":{"type":"string","minLength":1,"description":"Optional global identifier for this relationship, expressed as a full IRI or as a QName (prefix:local) resolved against the ontology-level 'prefixes' map."}},"required":["name","verbalizes"],"additionalProperties":false},"ConceptMapping":{"type":"object","description":"Mappings from logical model constructs to some ontology component","properties":{"concept":{"type":"string","minLength":1,"description":"Name of the concept whose part of the ontology we are mapping to"},"object_mappings":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/ObjectMapping"},"description":"Mappings from logical constructs that populate the concept in this component. Valid only when the concept is an entity type"},"link_mappings":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/LinkMapping"},"description":"Mappings from logical model relationships to ontology relationships pertaining to the mapped concept"}},"required":["concept"],"anyOf":[{"required":["object_mappings"]},{"required":["link_mappings"]}],"additionalProperties":false},"ConceptType":{"type":"string","enum":["EntityType","ValueType"],"description":"A concept is either an entity type or a value type"},"ReferentMapping":{"type":"object","description":"Mapping from logical model constructs to a relationship used to references some entity type in the ontology","properties":{"relationship":{"type":"string","minLength":1,"description":"Name of referent relationship"},"expression":{"$ref":"#/$defs/Expression"},"referent_mappings":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/ReferentMapping"}}},"required":["relationship"],"anyOf":[{"required":["expression"]},{"required":["referent_mappings"]}],"additionalProperties":false},"Role":{"type":"object","description":"Role in some relationship (the container)","properties":{"concept":{"type":"string","minLength":1,"description":"Name of the concept playing this role"},"name":{"type":"string","minLength":1,"description":"Optional name of this role, used when the same concept plays multiple roles in the same relationship"}},"required":["concept"],"additionalProperties":false},"ObjectMapping":{"type":"object","description":"Pattern of logical-level expressions for identifying objects of some concept using the values in one or more fields","properties":{"concept":{"type":"string","minLength":1,"description":"Name of the concept whose objects we are mapping to"},"referent_mappings":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/ReferentMapping"},"description":"Maps logical-model constructs to referent relationships of this entity type"},"expression":{"$ref":"#/$defs/Expression"}},"anyOf":[{"required":["expression"]},{"required":["referent_mappings"]}],"additionalProperties":false},"LinkMapping":{"type":"object","description":"Mapping from logical schema to the links of relationships in the ontology","properties":{"relationship":{"type":"string","minLength":1,"description":"Name of relationship being populated by this mapping node"},"object_mapping":{"$ref":"#/$defs/ObjectMapping"},"children":{"type":"array","items":{"$ref":"#/$defs/LinkMapping"},"description":"Relationship maps at the next level in this hierarchy"}},"required":["object_mapping"],"additionalProperties":false},"Multiplicity":{"type":"string","enum":["ManyToOne","OneToOne"],"description":"Relationship multiplicity"},"OntologyMap":{"type":"object","description":"Map from the constructs of some logical model to some ontology","properties":{"name":{"type":"string","minLength":1,"description":"Name of this ontology map"},"description":{"type":"string","description":"Human-readable description of this ontology map"},"semantic_model":{"$ref":"https://raw.githubusercontent.com/apache/ossie/main/core-spec/ossie-schema.json"},"concept_mappings":{"type":"array","items":{"$ref":"#/$defs/ConceptMapping"},"description":"Maps logical model constructs to some concept and its relationships in the ontology"}},"required":["semantic_model","concept_mappings"],"additionalProperties":false}}},"model":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://github.com/apache/ossie/core-spec/ossie-schema.json","title":"Apache Ossie Core Metadata Specification","description":"JSON Schema for validating a single Apache Ossie semantic model document","type":"object","properties":{"version":{"type":"string","const":"0.2.0.dev0","description":"Apache Ossie specification version"},"name":{"$ref":"#/$defs/SemanticModel/properties/name"},"description":{"$ref":"#/$defs/SemanticModel/properties/description"},"ai_context":{"$ref":"#/$defs/SemanticModel/properties/ai_context"},"datasets":{"$ref":"#/$defs/SemanticModel/properties/datasets"},"relationships":{"$ref":"#/$defs/SemanticModel/properties/relationships"},"metrics":{"$ref":"#/$defs/SemanticModel/properties/metrics"},"custom_extensions":{"$ref":"#/$defs/SemanticModel/properties/custom_extensions"}},"required":["version","name","datasets"],"additionalProperties":false,"$defs":{"Dialect":{"type":"string","minLength":1,"examples":["OSSIE_SQL_2026","ANSI_SQL","DB_DIALECT","BI_EXPRESSION","SEMANTIC_MODEL_EXPRESSION","PROGRAMMING_LANGUAGE"],"description":"Expression language a metric or field expression is declared in. Any non-empty string is accepted. OSSIE_SQL_2026 is the only dialect this specification defines; others are opaque to Ossie. See extensions/dialects.md."},"Vendor":{"type":"string","minLength":1,"examples":["COMMON","BI_TOOL","DB_VENDOR","SEMANTIC_LAYER"],"description":"Vendor name for custom extensions. Any non-empty string is accepted. See extensions/vendors.md."},"AIContext":{"description":"Additional context for AI tools","oneOf":[{"type":"string"},{"type":"object","properties":{"instructions":{"type":"string","description":"Instructions for AI on how to use this entity"},"synonyms":{"type":"array","items":{"type":"string"},"description":"Alternative names and terms"},"examples":{"type":"array","items":{"type":"string"},"description":"Sample questions or use cases"}},"additionalProperties":true}]},"CustomExtension":{"type":"object","description":"Vendor-specific attributes for extensibility","properties":{"vendor_name":{"$ref":"#/$defs/Vendor"},"data":{"type":"string","description":"Opaque string of vendor-specific data that Ossie carries but does not interpret"}},"required":["vendor_name","data"],"additionalProperties":false},"DialectExpression":{"type":"object","description":"Expression in a specific dialect","properties":{"dialect":{"$ref":"#/$defs/Dialect"},"expression":{"type":"string","minLength":1,"description":"SQL or dialect-specific expression"}},"required":["dialect","expression"],"additionalProperties":false},"Expression":{"type":"object","description":"Expression definition with multi-dialect support","properties":{"sql":{"type":"string","minLength":1,"description":"Primary, portable expression written in OSSIE_SQL_2026. When both this field and an OSSIE_SQL_2026 entry in `dialects` are present, this field is authoritative."},"dialects":{"type":"array","items":{"$ref":"#/$defs/DialectExpression"},"minItems":1}},"anyOf":[{"required":["sql"]},{"required":["dialects"]}],"additionalProperties":false},"DataType":{"type":"string","enum":["String","Integer","Decimal","Float","Boolean","Date","Time","DateTime","DateTimeTz","Opaque"],"description":"Logical data type for fields and metrics, independent of role (e.g. dimension vs fact) and physical representation. `Decimal` is exact base-10 with unspecified precision and scale; `Float` is approximate. `DateTime` has no timezone or offset, while `DateTimeTz` identifies an instant using offset or timezone context but does not guarantee preservation of a named timezone. Omit `datatype` when unknown; use `Opaque` plus `custom_extensions` for a known type outside the portable vocabulary."},"Dimension":{"type":"object","description":"Dimension metadata","properties":{"is_time":{"type":"boolean","description":"Temporal-role marker. When true, consumers that distinguish time dimensions (e.g. for time-series analysis or temporal filtering) should treat this field as a time dimension. This is a *role* flag, independent of the field's data type: a field with `is_time: true` may carry any `datatype` (e.g. `Integer` for a year grain, `String` for a month name, as well as temporal data types). When `is_time` is unset, it defaults to `true` if `datatype` is one of `Date`, `Time`, `DateTime`, or `DateTimeTz`, and `false` otherwise. Set `is_time: false` explicitly to opt a temporal-typed column (such as an audit timestamp) out of time-dimension treatment."}},"additionalProperties":false},"Field":{"type":"object","description":"Row-level attribute for grouping, filtering, and metric expressions","properties":{"name":{"type":"string","minLength":1,"description":"Unique identifier for the field within the dataset"},"expression":{"$ref":"#/$defs/Expression"},"dimension":{"$ref":"#/$defs/Dimension"},"label":{"type":"string","description":"Label for categorization"},"description":{"type":"string","description":"Human-readable description"},"datatype":{"$ref":"#/$defs/DataType"},"ai_context":{"$ref":"#/$defs/AIContext"},"custom_extensions":{"type":"array","items":{"$ref":"#/$defs/CustomExtension"}}},"required":["name","expression"],"additionalProperties":false},"Dataset":{"type":"object","description":"Logical dataset representing a business entity (fact or dimension table)","properties":{"name":{"type":"string","minLength":1,"description":"Unique identifier for the dataset"},"source":{"type":"string","minLength":1,"description":"Reference to underlying physical table/view (database.schema.table) or query"},"primary_key":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Dataset fields that uniquely identify rows"},"unique_keys":{"type":"array","items":{"type":"array","items":{"type":"string"},"minItems":1},"minItems":1,"description":"Array of unique key definitions, each a list of dataset fields"},"description":{"type":"string","description":"Human-readable description"},"ai_context":{"$ref":"#/$defs/AIContext"},"fields":{"type":"array","items":{"$ref":"#/$defs/Field"},"description":"The dataset's declared fields. Within the dataset, field names and metric names share one namespace and must all be unique across the two."},"metrics":{"type":"array","items":{"$ref":"#/$defs/Metric"},"description":"Dataset-scoped metrics: aggregations evaluated at this dataset's row level, for measures that semantically belong to the dataset. The expression references this dataset's declared fields by single-part (unqualified) name and must resolve entirely within this dataset; an expression that must reference another dataset belongs in the model-scoped metrics instead. Referencing a column of the source that is not a declared field is a future extension. Within the dataset, field names and metric names share one namespace and must all be unique across the two."},"custom_extensions":{"type":"array","items":{"$ref":"#/$defs/CustomExtension"}}},"required":["name","source"],"additionalProperties":false},"Relationship":{"type":"object","description":"Foreign key relationship between datasets","properties":{"name":{"type":"string","minLength":1,"description":"Unique identifier for the relationship"},"from":{"type":"string","minLength":1,"description":"Dataset on the many side of the relationship"},"to":{"type":"string","minLength":1,"description":"Dataset on the one side of the relationship"},"from_columns":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Array of field names in the 'from' dataset (foreign key fields)"},"to_columns":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Array of field names in the 'to' dataset (primary or unique key fields)"},"ai_context":{"$ref":"#/$defs/AIContext"},"custom_extensions":{"type":"array","items":{"$ref":"#/$defs/CustomExtension"}}},"required":["name","from","to","from_columns","to_columns"],"additionalProperties":false},"Metric":{"type":"object","description":"Quantitative measure defined on business data","properties":{"name":{"type":"string","minLength":1,"description":"Unique identifier for the metric"},"expression":{"$ref":"#/$defs/Expression"},"description":{"type":"string","description":"Human-readable description of what the metric measures"},"datatype":{"$ref":"#/$defs/DataType"},"ai_context":{"$ref":"#/$defs/AIContext"},"custom_extensions":{"type":"array","items":{"$ref":"#/$defs/CustomExtension"}}},"required":["name","expression"],"additionalProperties":false},"SemanticModel":{"type":"object","description":"Top-level container representing a complete semantic model","properties":{"name":{"type":"string","minLength":1,"description":"Unique identifier for the semantic model"},"description":{"type":"string","description":"Human-readable description"},"ai_context":{"$ref":"#/$defs/AIContext"},"datasets":{"type":"array","items":{"$ref":"#/$defs/Dataset"},"minItems":1,"description":"Collection of logical datasets"},"relationships":{"type":"array","items":{"$ref":"#/$defs/Relationship"},"description":"Defines how datasets are connected"},"metrics":{"type":"array","items":{"$ref":"#/$defs/Metric"},"description":"Model-scoped metrics: aggregations that span datasets or need to be aware of cross-dataset concepts. Expressions reference fields by multi-part name (dataset.field) and may combine fields from more than one dataset. Names must be unique across the model. See core-spec/spec.md#metric-scoping."},"custom_extensions":{"type":"array","items":{"$ref":"#/$defs/CustomExtension"}}},"required":["name","datasets"],"additionalProperties":false}}}}}