**Calculated metrics content library **- what are you looking for? đź“š

An introduction

(helpful if you're looking to understand the broader data structure of Planhat, and its implications for calculated metrics)

Use cases and examples (and some more Examples)

How to work with calculated metrics inside calculated metrics

Specific "Group Components":

The `IF`

function unlocks a plethora of use cases for calculated metrics, allowing you to make time-series calculations conditional on rules of two types: 1) "has (no) value" and 2) "(less than, more than, equal to) value".

**What is it?**

The `IF`

function is a group operator, just like `SUM`

, `MAX`

, `MIN`

, and so on. Put simply, it evaluates some condition based on other metrics, hard-coded values, or fields. The resulting value depends on whether the condition is true or false.

**What arguments does it have?**

The function has two distinct configurations: first, "has value" vs. "has no value"; and second, "more than", "less than" and "equal to".

**In the first case ("has (no) value"), the IF function takes 4 inputs, as follows:**

["IF", value, "has (no) value", value if true, value if false]

**In the second case ("less than", "more than", "equal to"), the IF function takes 5:**

["IF", value 1, "less than"/"more than"/"equal to", value 2, value if true, value if false]

*Where...*

values '1' and '2' are input values to compare (with the below rules applying)

'operator' is one of: "has value", "has no value", "more than", "less than", "equal to", and is used to compare the two values in the function

'value if true' & 'value if false' are Part Components to output from the function depending on whether the criteria is met (true) or not (false)

**What can you use it for?**

By embedding `IF`

functions within one another, you can ultimately build a dynamic metric which calculates itself differently depending on which criterion is met. This means the `IF`

function's use cases are truly limitless.

Here's a few examples to get your creative juices flowing...

### 1. Basic use cases: use `IF`

to handle `NULL`

values intelligently

There's one particularly salient application for the "has (no) value" operator. For example, you can **eliminate the impact of missing data** on your calculated metric, seamlessly replacing any missing (`NULL`

) values ("has no value") with the metrics' 7-day average.

`["IF", `

#every day I take the day's count of user logins

{"type": "metricOverTime", "days": 1, "op": "LAST", "prop": "activities.loggedin"},

#the "has value" operator

{"type": "condition", "value": "has value"},

#if there is a value, the calculated metric uses it

{"type": "metricOverTime", "days": 1, "op": "LAST", "prop": "activities.loggedin"},

#if there is no value, I take the average number of logins over the last 7 days

["DIVISION",

{"type": "metricOverTime", "days": 7, "op": "SUM", "prop": "activities.loggedin"},

{"type": "rawNumber", "value": 7}

]]

### 2. Moderate use cases: use `IF`

to simplify your most complex queries

Metric power-users are likely to have convoluted expressions involving operator chains like: `SIGN`

, `SUM`

, `SIGN`

, `SUBTRACTION`

, Value 1, Value 2, Value 3. Now the same can be achieved with `IF`

alone, halving the number of operators involved. Let's take a look.

Say you sell X number of seats, and so you want an "opportunity" **notification whenever a user goes above that seat value.** You could previously create a flag of this kind with multiple operators (as below), but with the `IF`

operator, the syntax becomes a whole lot easier...

*Before*

`["SIGN", `

["SUM",

["SIGN",

["SUBTRACTION",

{"type": "propertyValue",

"prop": "company.custom.Max Seats feature X"},

{"type": "metricOverTime", "days": 750, "op": "SUM", "prop": "activities.Used feature X"}]],

{"type": "rawNumber", "value": 1}]]

*After*

`["IF",`

{"type": "propertyValue", "prop": "company.custom.Max Seats feature X"},

{"type": "condition", "value": "more than"},

{"type": "metricOverTime", "days": 750, "op": "SUM", "prop": "activities.Used feature X"},

{"type": "rawNumber", "value": 1},

{"type": "rawNumber", "value": 0}]

### 3. Advanced use cases: use `IF`

to transform complex metrics

In the realm of `IF`

, it's "more than", "less than" and "equal to" that have the real horsepower. But as ever, with great power comes great responsibility. To unlock more complex applications, we recommend you assess your use case carefully, *then *reach out to our colleagues at Planhat to help set everything up correctly.

Nonetheless, here's a taste of where `IF`

can take you, to spark your imagination...

**3.1 Handling FX Rates - Company Calculated Metric**

Imagine you want to track the **revenue of your newly released product**. Previously you were only able to track revenue in a local currency value, meaning you couldn't build the metric you wanted if your product was being sold in both USD and EUR. With `IF`

, you can do just that (although in this case the FX rate is fixed, you could even have a custom metric pulling daily rates!).

`[â€śIFâ€ť,`

{â€śtypeâ€ť: â€śpropertyValueâ€ť, â€śpropâ€ť: â€ścompany.custom.Currencyâ€ť},

{â€śtypeâ€ť: â€śconditionâ€ť, â€śvalueâ€ť: â€śequal toâ€ť},

{â€śtypeâ€ť: â€śrawValueâ€ť, â€śvalueâ€ť: â€śUSDâ€ť},

{â€śtypeâ€ť: â€śpropertyValueâ€ť, â€śpropâ€ť: â€ścompany.custom.New feature ARRâ€ť},

[â€śDIVISIONâ€ť,{"type": "propertyValue", "prop": "company.custom.New feature ARR"}

{"type": "rawNumber", "value": 1.07}]]

**3.2 Counting Active Users - End-User Calculated Metric**

Perhaps you'd like to track the **number of unique active users you have**, from total user activities. This simple metric unlocks a breadth of possibility including the ability to track daily, weekly and monthly active users, as well as period-on-period changes. Or maybe you'd like to break down total user activity *growth* down into "growth in unique users", and "growth in average activity per user".

`["IF", `

{"type": "metricOverTime", "days": 30, "op": "SUM", "prop": "activities.Logged in"},

{"type": "condition", "value": "more than"},

{"type": "rawNumber", "value": 0},

{"type": "rawNumber", "value": 1},

{"type": "rawNumber", "value": 0}]

**The Specifics: Input Values**

As with all calculated metrics, since the introduction of calculated metrics inside calculated metrics, you can input other metrics in addition to fields, and simple numeric (rawNumber) values.

That said, there are some logical constraints to what field components can be used with the `IF`

function:

For â€śhas valueâ€ť and â€śhas no valueâ€ť operators, you can input

**custom fields**and**system fields**(of all types)For â€śmore thanâ€ť, â€śless thanâ€ť and â€śequal toâ€ť operators, you can input

**custom and system number**fieldsfor "more than", "less than" - use "rawNumber" and numeric-type inputs

for "equal to" - use "rawValue" and text-type inputs

In addition, for the â€śequal toâ€ť operator, you can input

**custom and system text**type fields. For text fields â€śtypeâ€ť will be â€śrawValueâ€ť.

*đź“Ś *

**Note:**since you can use text fields with the "equal to" operator, fields of type "list" also work (but "multipicklist" type fields don't, yet!)