Skip to main content

The Definitive Guide to LX

Using Lumonic's query language to build dashboards, custom calculations and excel reports

Updated over 4 months ago

Word count: 2,186 Reading time: 11 minutes

Quick Start

@reporter.net_income                         // Get a metric
@reporter.net_income[scenario=budget] // Compare to budget
@reporter.net_income[period=M::LTM] // Last twelve months

Finding Your Configuration (1 minute)

Your Global Object

1. Visit deliverable tracker and look for name above companies

- "Reporters" → use `@reporter`

- "Companies" → use `@company`

- "Entities" → use `@entity`

Your Metric Names and Scenarios

1. Left sidebar → REPORTERS → "Metrics"

2. Open METRIC GROUPS

3. Browse categories (BALANCE SHEET, etc.), browse scenarios (actuals, budget, etc)

4. Use these exact names in your queries

[Your specific scenarios and metrics will be configured during setup]

Core Concepts (2 minutes)

Basic Structure

@reporter.metric_name[modifiers]

Modifiers

Modifiers add specificity to pointers using key-value pairs enclosed in square brackets []. They help you target specific dimensions of your data.

  • Period Modifiers: Represent the periodicity of a metric (e.g., q, y, ltm, ntm, ytd, fq, fy, qtd, fqtd).

    • Syntax: period={source_period}::{target_period}

    • Example: @entity.example-1[period=m::ltm] resamples monthly data to Last Twelve Months (LTM).

    • Note: Resampled periods can be any valid period type. Prefer fiscal periods over calendar ones if ambiguous.

  • Scenario Modifiers: Represent different versions of a metric, such as estimates or origination cases.

    • Example: @entity.example-1[period=m, scenario=actual]

Smart Defaults

@reporter.net_income
// Same as
@reporter.net_income[scenario=actuals, period=M]

Real-World Examples (3 minutes)

Accessing LX

Go to any Dashboard, Formula, Mapping, or excel calculation to see the LX

Scenario Comparisons

// Compare actual to budget
@reporter.net_income - @reporter.net_income[scenario=budget]

// Variance with scaling (shows in thousands)
scale(
@reporter.net_income[period=M::fytd] -
@reporter.net_income[scenario=budget, period=M::fytd],
1000
)

Growth Calculations

// Year over year growth
(@reporter.net_income[period=M::LTM] /
@reporter.net_income-close) - 1

Asset Coverage

(@reporter.accounts_receivable[scenario=actuals, period=M] * .85 + 
coalesce(@reporter.inventory[scenario=actuals, period=M], 0) * .5) /
coalesce(@reporter.total_syndicated_outstanding[],
@reporter.total_debt_outstanding[scenario=actuals, period=M])

Making Numbers Look Right (1 minute)

Scaling

scale(@reporter.net_income, 1000)  // Display in thousands

Available Formats

- Currency ($)

- Percent (%)

- Decimal places (0-2 typical)

- Thousands separator

Handling Missing Data (1 minute)

Use coalesce ONLY when you need fallback behavior:

// If adjusted EBITDA missing, use regular EBITDA
coalesce(
@reporter.adjusted_ebitda,
@reporter.ebitda
)

Complete Syntax Reference

Basic Period Types

@reporter.revenue[period=M]                    // Monthly (base period)
@reporter.revenue[period=M::LTM] // Last Twelve Months
@reporter.revenue[period=M::YTD] // Year to Date
@reporter.revenue[period=M::FYTD] // Fiscal Year to Date
@reporter.revenue[period=M::CQ] // Current Quarter
@reporter.revenue[period=M::CY] // Current Year
@reporter.revenue[period=M::FQ] // Fiscal Quarter
@reporter.revenue[period=M::FY] // Fiscal Year
@reporter.revenue[period=M::FH] // Fiscal Half
@reporter.revenue[period=M::CW] // Current Week

Time Shifting

 0CM                                          // Current month
-1CM // Prior month
-1CY // Prior year

*Note this is used in the "effective date" field in dashboards, not directly in LX formulas

Rolling Calculations

rolling_sum(@reporter.revenue, 3)             // Sum of last 3 periods
rolling_average(@reporter.revenue, 12) // Average of last 12 periods
rolling_min(@reporter.revenue, 6) // Minimum over last 6 periods
rolling_max(@reporter.revenue, 6) // Maximum over last 6 periods

Period Comparisons

prior_period(@reporter.revenue)               // Previous period value
prior_period_delta(@reporter.revenue) // Change from previous period
prior_period_percent_change(@reporter.revenue) // % change from previous period

Aggregations

sum(@reporter.revenue)                        // Total sum
average(@reporter.revenue) // Average
min(@reporter.revenue) // Minimum value
max(@reporter.revenue) // Maximum value

Special Aggregations

aggregate_mode(@reporter.revenue)             // Most frequent value
aggregate_median(@reporter.revenue) // Median value
aggregate_weighted_average(@reporter.revenue) // Weighted average

Time-Based Sums

year_to_date_sum(@reporter.revenue)           // YTD sum
quarter_to_date_sum(@reporter.revenue) // QTD sum

Conditionals

when(@reporter.revenue > 0, true, false)      // Conditional value
if(@reporter.revenue > 0, 'Positive', 'Negative')

Data Handling

coalesce(@reporter.revenue, @reporter.sales, 0) // Use first non-null value
scale(@reporter.revenue, 1000) // Scale values
absolute(@reporter.revenue) // Absolute value

Logical Operations

@reporter.revenue > 100                       // Greater than
@reporter.revenue >= 100 // Greater than or equal
@reporter.revenue < 100 // Less than
@reporter.revenue <= 100 // Less than or equal
@reporter.revenue = 100 // Equal to
@reporter.revenue != 100 // Not equal to

Multiple Conditions

and(@reporter.revenue > 0, @reporter.profit > 0)   // Both true
or(@reporter.revenue > 0, @reporter.profit > 0) // Either true
not(@reporter.revenue < 0) // Inverse condition

Complex Example

scale(                                              // Display in 1000s
when( // If/then logic
@reporter.revenue[period=M::LTM] > // Is LTM revenue
rolling_average( // greater than
@reporter.revenue[scenario=budget], // the rolling average
12 // of last 12 months
), // of budget
prior_period_percent_change( // If YES: show % change
@reporter.revenue // from prior period
),
coalesce(@reporter.revenue, 0) // If NO: show revenue or 0
),
1000 // Scale to thousands
)

This complex example reads as: "If LTM revenue is beating our 12-month budgeted average, show the growth rate. Otherwise, show current revenue. Display everything in thousands."

Common Mistakes to Avoid

1. Wrong Time Period Syntax

   // WRONG
@reporter.revenue::LTM

// RIGHT
@reporter.revenue[period=M::LTM]

2. Unnecessary coalesce

   // WRONG (scenarios don't need fallbacks)
coalesce(@reporter.revenue[scenario=budget])

// RIGHT
@reporter.revenue[scenario=budget]

3. Missing Base Period

   // WRONG
@reporter.revenue[period=LTM]

// RIGHT
@reporter.revenue[period=M::LTM]

Need Help?

1. Check Your Configuration

- Homepage → Recently visited (for global object)

- Left sidebar → METRIC GROUPS (for metric names)

- Check your configured scenarios

2. Build Step by Step

- Start with basic metrics

- Add time periods

- Add scenarios

- Add calculations

- Metric configuration questions

- Scenario setup help

- Custom calculation support

- Additional training needs

Did this answer your question?