# Description Main changes: - Creation of `int_monthly_churn_metrics` model. This follows a similar approach as for mtd models, with jinja loops to aggregate the metrics at different dimensions. This reads from the previous monthly model, thus creating a dependency on Global KPIs with By Deal KPIs. - Adds the 6 metrics in the main aggregated model of Global KPIs `int_mtd_vs_previous_year_metrics`. It doesn't necessarily mean that the 6 metrics will be made available in the report. This does NOT display these metrics in the report, and won't be done until deal lifecycle is enriched to consider hubspot offboarding in the state "05-Churning". # Checklist - [X] The edited models and dependants run properly with production data. - [X] The edited models are sufficiently documented. - [X] The edited models contain PK tests, and I've ran and passed them. - [X] I have checked for DRY opportunities with other models and docs. - [X] I've picked the right materialization for the affected models. # Other - [ ] Check if a full-refresh is required after this PR is merged. Related work items: #22691
1344 lines
48 KiB
YAML
1344 lines
48 KiB
YAML
models:
|
|
- name: int_daily_currency_exchange_rates
|
|
description: >-
|
|
This model holds a lot of data on currency exchange rates. The time
|
|
granularity is daily. Each record holds a currency pair for a specific
|
|
day, source and version.
|
|
|
|
Actual rates are sourced from xe.com data. The `guessed` and `forecast`
|
|
versions are built by simply 'pushing' the first/last exchange rate on
|
|
record. Basically, wherever we dont' have data for a date, we pick the
|
|
closest actual data point that comes from xe.com. Bear in mind this means
|
|
that `forecast` version records will change on a daily basis as actual
|
|
data moves forwards, meaning you shouldn't assume your money amounts
|
|
converted in the future should always stay put.
|
|
|
|
Note that, given the dimensionality, getting a simple time series for a
|
|
currency pair will require a bit of filtering.
|
|
|
|
Reverse rates are explicit. This means that, for any given day and any
|
|
given currency pair, you will find two records with opposite from/to
|
|
positions. So, for 2024-01-01, you will find both a EUR->USD record and a
|
|
USD->EUR record with the opposite rate (1/rate).
|
|
columns:
|
|
- name: id_exchange_rate
|
|
data_type: text
|
|
description: A unique ID for the record, derived from concatenating the
|
|
currencies, date, source and version. Currency order is relevant
|
|
(EURUSD != USDEUR).
|
|
tests:
|
|
- not_null
|
|
- unique
|
|
- name: from_currency
|
|
data_type: character
|
|
description: The source currency, represented as an ISO 4217 code.
|
|
tests:
|
|
- not_null
|
|
- name: to_currency
|
|
data_type: character
|
|
description: The target currency, represented as an ISO 4217 code.
|
|
tests:
|
|
- not_null
|
|
- name: rate
|
|
data_type: numeric
|
|
description: >-
|
|
The exchange rate, represented as the units of the target currency
|
|
that one unit of source currency gets you. So, from_currency=USD to
|
|
to_currency=PLN with rate=4.2 should be read as '1 US Dollar buys me
|
|
4.2 Polish Zlotys'.
|
|
|
|
For same currency pairs (EUR to EUR, USD to USD, etc). The rate will
|
|
always be one.
|
|
|
|
The rate can be smaller than one, but can't be negative.
|
|
tests:
|
|
- not_negative_or_zero
|
|
- not_null
|
|
- name: rate_date_utc
|
|
data_type: date
|
|
description: The date in which the rate record is relevant.
|
|
tests:
|
|
- not_null
|
|
- name: source
|
|
data_type: text
|
|
description:
|
|
Where is the data coming from. Records that are composed from
|
|
making assumptions on real data will contain `_inferred`.
|
|
- name: rate_version
|
|
data_type: text
|
|
description:
|
|
The version of the rate. This can be one of `actual` (the rate is a
|
|
reality fact), `forecast` (the rate sits in the future and is a guess
|
|
in nature) or `guess` (the rate sits in the past and is a guess in
|
|
nature). Note that one currency pair can have multiple rate versions
|
|
on the same date.
|
|
tests:
|
|
- accepted_values:
|
|
values:
|
|
- guess
|
|
- actual
|
|
- forecast
|
|
- not_null
|
|
- name: updated_at_utc
|
|
data_type: timestamp with time zone
|
|
description:
|
|
For external sources, this will be the point in time when the
|
|
information was obtained from them. For stuff we make up here in the
|
|
DWH, this will be the point in time when we made the assumption.
|
|
tests:
|
|
- not_null
|
|
- name: int_simple_exchange_rates
|
|
description: >-
|
|
A simplified vision of exchange rates, derived from
|
|
`int_daily_currency_exchange_rates`. Come here if you don't want to
|
|
understand nuances and complexities and just want to convert rates.
|
|
|
|
The time granularity is daily. Each record holds a currency pair for a
|
|
specific day. You will only find one conversion rate per currency pair and
|
|
date.
|
|
tests:
|
|
- dbt_utils.unique_combination_of_columns:
|
|
combination_of_columns:
|
|
- from_currency
|
|
- to_currency
|
|
- rate_date_utc
|
|
columns:
|
|
- name: from_currency
|
|
data_type: character
|
|
description: The source currency, represented as an ISO 4217 code.
|
|
tests:
|
|
- not_null
|
|
- name: to_currency
|
|
data_type: character
|
|
description: The source currency, represented as an ISO 4217 code.
|
|
tests:
|
|
- not_null
|
|
- name: rate
|
|
data_type: numeric
|
|
description: The target currency, represented as an ISO 4217 code.
|
|
tests:
|
|
- not_null
|
|
- name: rate_date_utc
|
|
data_type: date
|
|
description: The date in which the rate record is relevant.
|
|
tests:
|
|
- not_null
|
|
- name: updated_at_utc
|
|
data_type: timestamp with time zone
|
|
description:
|
|
For external sources, this will be the point in time when the
|
|
information was obtained from them. For stuff we make up here in the
|
|
DWH, this will be the point in time when we made the assumption.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: int_mtd_vs_previous_year_metrics
|
|
description: |
|
|
This model is used for global KPIs.
|
|
|
|
It aggregates all the mtd models with the different metrics per source
|
|
and computes any necessary weighted metric across different sources.
|
|
Each metric has a date, dimension and dimension value that defines
|
|
the primary key of this model.
|
|
|
|
Finally, it displays any metric on the current date, the previous year
|
|
date and it computes the relative increment by using the macro:
|
|
- calculate_safe_relative_increment
|
|
|
|
tests:
|
|
- dbt_utils.unique_combination_of_columns:
|
|
combination_of_columns:
|
|
- date
|
|
- dimension
|
|
- dimension_value
|
|
|
|
columns:
|
|
- name: date
|
|
data_type: date
|
|
description: The date for the month-to-date metrics.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: dimension
|
|
data_type: string
|
|
description: The dimension or granularity of the metrics.
|
|
tests:
|
|
- accepted_values:
|
|
values:
|
|
- global
|
|
- by_number_of_listings
|
|
- by_billing_country
|
|
|
|
- name: dimension_value
|
|
data_type: string
|
|
description: The value or segment available for the selected dimension.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: int_dates_mtd
|
|
description: |
|
|
This model provides Month-To-Date (MTD) necessary dates for MTD-based models to work.
|
|
- For month-to-month complete information, it retrieves all end month dates that have elapsed since 2020.
|
|
- For month-to-date information, it retrieves the days of the current month of this year up to yesterday.
|
|
Additionally, it also gets the days of its equivalent month from last year previous the current day of month of today.
|
|
|
|
Example:
|
|
Imagine we have are at 4th June 2024.
|
|
- We will get the dates for 1st, 2nd, 3rd of June 2024.
|
|
- We will also get the dates for 1st, 2nd, 3rd of June 2023.
|
|
- We will get all end of months from 2020 to yesterday,
|
|
i.e., 31st January 2020, 29th February 2020, ..., 30th April 2024, 31st May 2024.
|
|
|
|
columns:
|
|
- name: year
|
|
data_type: int
|
|
description: Year number of the given date.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: month
|
|
data_type: int
|
|
description: Month number of the given date.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: day
|
|
data_type: int
|
|
description: Day monthly number of the given date.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: is_end_of_month
|
|
data_type: boolean
|
|
description: Is end of month, 1 for yes, 0 for no.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: is_current_month
|
|
data_type: boolean
|
|
description: |
|
|
Checks if the date is within the current executed month,
|
|
1 for yes, 0 for no.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: first_day_month
|
|
data_type: date
|
|
description: |
|
|
First day of the month correspoding to the date field.
|
|
It comes from int_dates_mtd logic.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: date
|
|
data_type: date
|
|
description: |
|
|
Main date for the computation, that is used for filters.
|
|
It's the primary key for this model.
|
|
tests:
|
|
- not_null
|
|
- unique
|
|
|
|
- name: int_dates_by_deal
|
|
description: |
|
|
This model provides the necessary dates for each deal for deal-based KPIs models to work.
|
|
It only considers those dates starting from when the host user of the deal was first available.
|
|
|
|
tests:
|
|
- dbt_utils.unique_combination_of_columns:
|
|
combination_of_columns:
|
|
- date
|
|
- id_deal
|
|
|
|
columns:
|
|
- name: year
|
|
data_type: int
|
|
description: Year number of the given date.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: month
|
|
data_type: int
|
|
description: Month number of the given date.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: day
|
|
data_type: int
|
|
description: Day monthly number of the given date.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: last_day_month
|
|
data_type: date
|
|
description: |
|
|
Last day of the month correspoding to the date field.
|
|
It comes from int_dates_mtd logic.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: first_day_month
|
|
data_type: date
|
|
description: |
|
|
First day of the month correspoding to the date field.
|
|
It comes from int_dates_mtd logic.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: date
|
|
data_type: date
|
|
description: |
|
|
Main date for the computation, that is used for filters.
|
|
It's the primary key for this model.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: id_deal
|
|
data_type: string
|
|
description: |
|
|
Main identifier of the B2B clients. A deal can have multiple hosts.
|
|
A host should usually have a deal, but it does not happen on all cases.
|
|
In this KPI reporting we force that Deal is not null to avoid potential
|
|
data quality issues.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: main_deal_name
|
|
data_type: string
|
|
description: |
|
|
Main name for this ID deal.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: main_billing_country_iso_3_per_deal
|
|
data_type: string
|
|
description: |
|
|
ISO 3166-1 alpha-3 main country code in which the Deal is billed.
|
|
In some cases it's null.
|
|
|
|
- name: int_mtd_aggregated_metrics
|
|
description: |
|
|
The `int_mtd_aggregated_metrics` model aggregates multiple metrics on a year, month, and day basis.
|
|
The primary source of data is the `int_mtd_vs_previous_year_metrics` model, which contain the combination
|
|
of metrics data per source. This model just changes the display format to unpivot the information into
|
|
a set of metric, value, previous_year_value and relative_increment at a given date. It uses Jinja
|
|
code to avoid code replication.
|
|
|
|
tests:
|
|
- dbt_utils.unique_combination_of_columns:
|
|
combination_of_columns:
|
|
- date
|
|
- metric
|
|
- dimension
|
|
- dimension_value
|
|
|
|
columns:
|
|
- name: year
|
|
data_type: int
|
|
description: year number of the given date.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: month
|
|
data_type: int
|
|
description: month number of the given date.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: day
|
|
data_type: int
|
|
description: day monthly number of the given date.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: is_end_of_month
|
|
data_type: boolean
|
|
description: is end of month, 1 for yes, 0 for no.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: is_current_month
|
|
data_type: boolean
|
|
description: |
|
|
checks if the date is within the current executed month,
|
|
1 for yes, 0 for no.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: first_day_month
|
|
data_type: date
|
|
description: |
|
|
first day of the month correspoding to the date field.
|
|
It comes from int_dates_mtd logic.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: date
|
|
data_type: date
|
|
description: |
|
|
main date for the computation, that is used for filters.
|
|
It comes from int_dates_mtd logic.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: dimension
|
|
data_type: string
|
|
description: The dimension or granularity of the metrics.
|
|
tests:
|
|
- accepted_values:
|
|
values:
|
|
- global
|
|
- by_number_of_listings
|
|
- by_billing_country
|
|
|
|
- name: dimension_value
|
|
data_type: string
|
|
description: The value or segment available for the selected dimension.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: previous_year_date
|
|
data_type: date
|
|
description: |
|
|
corresponds to the date of the previous year, with respect to the field date.
|
|
It comes from int_dates_mtd logic. It's only displayed for information purposes,
|
|
should not be needed for reporting.
|
|
|
|
- name: metric
|
|
data_type: text
|
|
description: name of the business metric.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: order_by
|
|
data_type: integer
|
|
description: |
|
|
order for displaying purposes. Null values are accepted, but keep
|
|
in mind that then there's no default controlled display order.
|
|
|
|
- name: number_format
|
|
data_type: text
|
|
description: allows for grouping and formatting for displaying purposes.
|
|
tests:
|
|
- accepted_values:
|
|
values:
|
|
[
|
|
"integer",
|
|
"percentage",
|
|
"currency_gbp",
|
|
"converted_metric_currency_gbp",
|
|
]
|
|
|
|
- name: value
|
|
data_type: numeric
|
|
description: |
|
|
numeric value (integer or decimal) that corresponds to the MTD computation of the metric
|
|
at a given date.
|
|
|
|
- name: previous_year_value
|
|
data_type: numeric
|
|
description: |
|
|
numeric value (integer or decimal) that corresponds to the MTD computation of the metric
|
|
on the previous year at a given date.
|
|
|
|
- name: relative_increment
|
|
data_type: numeric
|
|
description: |
|
|
numeric value that corresponds to the relative increment between value and previous year value,
|
|
following the computation: value / previous_year_value - 1.
|
|
|
|
- name: relative_increment_with_sign_format
|
|
data_type: numeric
|
|
description: |
|
|
relative_increment value multiplied by -1 in case this metric's growth doesn't have a
|
|
positive impact for Superhog, otherwise is equal to relative_increment.
|
|
This value is specially created for formatting in PBI
|
|
|
|
- name: int_monthly_aggregated_metrics_history_by_deal
|
|
description: |
|
|
This model aggregates the monthly historic information regarding the different metrics computed
|
|
at deal level. The primary sources of data are the `int_yyy__monthly_XXXXX_history_by_deal`
|
|
models which contain the raw metrics data per source.
|
|
|
|
Unlike the int_mtd_aggregated_metrics, this model does not abstract each metric, since
|
|
no comparison versus last year is performed. In short, it just gathers the information stored
|
|
in the abovementioned models.
|
|
|
|
To keep in mind: aggregating the information of this model will not necessarily result into
|
|
the int_mtd_aggregated metrics because 1) the mtd version contains more computing dates
|
|
than the by deal version, the latest being a subset of the first, and 2) the deal based model
|
|
enforces that a booking/guest journey/listing/etc has a host with a deal assigned, which is
|
|
not necessarily the case.
|
|
|
|
tests:
|
|
- dbt_utils.unique_combination_of_columns:
|
|
combination_of_columns:
|
|
- date
|
|
- id_deal
|
|
|
|
columns:
|
|
- name: date
|
|
data_type: date
|
|
description: The last day of the month or yesterday for historic metrics.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: id_deal
|
|
data_type: character varying
|
|
description: Id of the deal associated to the host.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: main_deal_name
|
|
data_type: string
|
|
description: |
|
|
Main name for this ID deal.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: main_billing_country_iso_3_per_deal
|
|
data_type: string
|
|
description: |
|
|
ISO 3166-1 alpha-3 main country code in which the Deal is billed.
|
|
In some cases it's null.
|
|
|
|
- name: int_dates_mtd_by_dimension
|
|
description: |
|
|
This model provides Month-To-Date (MTD) necessary dates, dimension and dimension_values
|
|
for MTD-based models to work.
|
|
It provides the basic "empty" structure from which metrics will be built upon. This is, on
|
|
top of the Date that characterises int_dates_mtd, including the dimensions and their
|
|
respective values that should appear in any mtd metric model.
|
|
|
|
Example:
|
|
- For the "global" dimension, we will only have the "global" dimension value.
|
|
- For the "by_number_of_listing" dimension, we will have different values
|
|
according to the segments defined, ex: 0, 1-5, 6-20, etc.
|
|
|
|
... and so on and forth for any available dimension. These combinations should appear
|
|
for each date of the MTD models.
|
|
|
|
tests:
|
|
- dbt_utils.unique_combination_of_columns:
|
|
combination_of_columns:
|
|
- date
|
|
- dimension
|
|
- dimension_value
|
|
|
|
columns:
|
|
- name: year
|
|
data_type: int
|
|
description: Year number of the given date.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: month
|
|
data_type: int
|
|
description: Month number of the given date.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: day
|
|
data_type: int
|
|
description: Day monthly number of the given date.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: is_end_of_month
|
|
data_type: boolean
|
|
description: Is end of month, 1 for yes, 0 for no.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: is_current_month
|
|
data_type: boolean
|
|
description: |
|
|
Checks if the date is within the current executed month,
|
|
1 for yes, 0 for no.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: first_day_month
|
|
data_type: date
|
|
description: |
|
|
First day of the month correspoding to the date field.
|
|
It comes from int_dates_mtd logic.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: date
|
|
data_type: date
|
|
description: |
|
|
Main date for the computation, metrics include monthly information
|
|
until this date.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: dimension
|
|
data_type: string
|
|
description: The dimension or granularity of the metrics.
|
|
tests:
|
|
- accepted_values:
|
|
values:
|
|
- global
|
|
- by_number_of_listings
|
|
- by_billing_country
|
|
|
|
- name: dimension_value
|
|
data_type: string
|
|
description: The value or segment available for the selected dimension.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: int_monthly_growth_score_by_deal
|
|
description: |
|
|
The main goal of this model is to provide a growth score by deal and month.
|
|
The idea behind it is that each deal will have some business performance
|
|
associated to it over the months, and that comparing how it is currently
|
|
performing vs. historical data we can determine whether the tendency is to
|
|
grow or to decay. This is specially useful for AMs to focus their effort
|
|
towards the clients that have a negative tendency.
|
|
|
|
The computation of the growth score is based on 3 main indicators:
|
|
- Created bookings
|
|
- Listings booked in month
|
|
- Total revenue (in gbp)
|
|
|
|
The main idea is, for each deal, to compare each of these metrics by
|
|
checking the latest monthly value vs. 1) the monthly value of the equivalent
|
|
month on the previous year and 2) the monthly value of the previous month
|
|
- in other words, a year-on-year (YoY) and month-on-month (MoM) comparison.
|
|
We do this comparison by doing a relative incremental.
|
|
|
|
The growth score is computed then by averaging the outcome of the 6 scores.
|
|
Lastly, in order to provide a prioritisation sense, we have a weighted growth
|
|
score that results from the multiplication of the growth score per the revenue
|
|
weight a specific deal has provided in the previous 12 months.
|
|
|
|
However, this is not strictly true for Revenue because 1) we have an invoicing
|
|
delay and 2) in some cases, monthly revenue per deal can be negative. In this
|
|
specific cases, the YoY comparison is shifted by one month, and an effective
|
|
revenue value for the revenue share is computed, that cannot be lower than 0.
|
|
|
|
In order to keep both a properly set up score and revenue consistency, both
|
|
a real revenue value and effective revenue value are present in this model,
|
|
while no MoM or YoY value is computed if negative revenue is found.
|
|
|
|
Lastly, this model provides informative date fields, deal attributes, absolute
|
|
metric values and MoM & YoY relative incrementals to enrich reporting.
|
|
|
|
tests:
|
|
- dbt_utils.unique_combination_of_columns:
|
|
combination_of_columns:
|
|
- date
|
|
- id_deal
|
|
|
|
columns:
|
|
- name: date
|
|
data_type: date
|
|
description: |
|
|
Date corresponding to the last day of the month. Given month
|
|
metrics are inclusive to this date. Together with id_deal, it
|
|
acts as the primary key of this model.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: id_deal
|
|
data_type: string
|
|
description: |
|
|
Unique identifier of a Deal. Together with date, it acts as
|
|
the primary key of this model.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: main_deal_name
|
|
data_type: string
|
|
description: |
|
|
Main name for a Deal, representing the client.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: main_billing_country_iso_3_per_deal
|
|
data_type: string
|
|
description: |
|
|
Main billing country for this client. In some cases
|
|
it can be null.
|
|
|
|
- name: deal_lifecycle_state
|
|
data_type: string
|
|
description: |
|
|
Identifier of the lifecycle state of a given deal
|
|
in a given month.
|
|
|
|
- name: given_month_first_day_month
|
|
data_type: date
|
|
description: |
|
|
Informative field. It indicates the first day of the
|
|
month corresponding to date.
|
|
If date = 2024-09-30, this field will be 2024-09-01.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: previous_1_month_first_day_month
|
|
data_type: date
|
|
description: |
|
|
Informative field. It indicates the first day of the
|
|
previous month with respect to date.
|
|
If date = 2024-09-30, this field will be 2024-08-01.
|
|
It can be null if no previous history for that
|
|
deal is found.
|
|
|
|
- name: previous_2_month_first_day_month
|
|
data_type: date
|
|
description: |
|
|
Informative field. It indicates the first day of the
|
|
month 2 months before with respect to date.
|
|
If date = 2024-09-30, this field will be 2024-07-01.
|
|
It can be null if no previous history for that
|
|
deal is found.
|
|
|
|
- name: previous_12_month_first_day_month
|
|
data_type: date
|
|
description: |
|
|
Informative field. It indicates the first day of the
|
|
month with respect to date, but on the previous year.
|
|
If date = 2024-09-30, this field will be 2023-09-01.
|
|
It can be null if no previous history for that
|
|
deal is found.
|
|
|
|
- name: previous_13_month_first_day_month
|
|
data_type: date
|
|
description: |
|
|
Informative field. It indicates the first day of the
|
|
previous month with respect to date, but on the previous year.
|
|
If date = 2024-09-30, this field will be 2023-08-01.
|
|
It can be null if no previous history for that
|
|
deal is found.
|
|
|
|
- name: aggregated_revenue_from_first_day_month
|
|
data_type: date
|
|
description: |
|
|
Informative field. It indicates the first day of the
|
|
month from the lower bound range in which the revenue
|
|
aggregation is computed.
|
|
The aggregation uses the previous 12 months in which we
|
|
know the revenue, thus:
|
|
If date = 2024-09-30, this field will be 2023-09-01.
|
|
It can be null if no previous history for that
|
|
deal is found.
|
|
|
|
- name: aggregated_revenue_to_first_day_month
|
|
data_type: date
|
|
description: |
|
|
Informative field. It indicates the first day of the
|
|
month from the upper bound range in which the revenue
|
|
aggregation is computed.
|
|
The aggregation uses the previous 12 months in which we
|
|
know the revenue, thus:
|
|
If date = 2024-09-30, this field will be 2023-08-01.
|
|
It can be null if no previous history for that
|
|
deal is found.
|
|
|
|
- name: given_month_revenue_in_gbp
|
|
data_type: decimal
|
|
description: |
|
|
Monthly value representing revenue in GBP
|
|
for a specific deal. This value corresponds to
|
|
the given month. This value can be negative,
|
|
but not null.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: previous_1_month_revenue_in_gbp
|
|
data_type: decimal
|
|
description: |
|
|
Monthly value representing revenue in GBP
|
|
for a specific deal. This value corresponds to
|
|
the previous month.
|
|
This value can be negative.
|
|
This value can be null, thus indicating that no
|
|
history is available.
|
|
|
|
- name: previous_2_month_revenue_in_gbp
|
|
data_type: decimal
|
|
description: |
|
|
Monthly value representing revenue in GBP
|
|
for a specific deal. This value corresponds to
|
|
the monthly amount generated 2 months ago
|
|
This value can be negative.
|
|
This value can be null, thus indicating that no
|
|
history is available.
|
|
|
|
- name: previous_12_month_revenue_in_gbp
|
|
data_type: decimal
|
|
description: |
|
|
Monthly value representing revenue in GBP
|
|
for a specific deal. This value corresponds to
|
|
the monthly amount generated 12 months ago.
|
|
This value can be negative.
|
|
This value can be null, thus indicating that no
|
|
history is available.
|
|
|
|
- name: previous_13_month_revenue_in_gbp
|
|
data_type: decimal
|
|
description: |
|
|
Monthly value representing revenue in GBP
|
|
for a specific deal. This value corresponds to
|
|
the monthly amount generated 13 months ago.
|
|
This value can be negative.
|
|
This value can be null, thus indicating that no
|
|
history is available.
|
|
|
|
- name: mom_revenue_growth
|
|
data_type: decimal
|
|
description: |
|
|
Relative increment of the revenue generated in the
|
|
current month with respect to the one generated in
|
|
the previous month.
|
|
It can be null if any revenue used in the computation
|
|
is null or it's negative.
|
|
tests:
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: -1
|
|
strictly: false
|
|
|
|
- name: mom_1_month_shift_revenue_growth
|
|
data_type: decimal
|
|
description: |
|
|
Relative increment of the revenue generated in the
|
|
previous month with respect to the one generated 2
|
|
months ago.
|
|
It can be null if any revenue used in the computation
|
|
is null or it's negative.
|
|
This field is used for the growth score computation.
|
|
tests:
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: -1
|
|
strictly: false
|
|
|
|
- name: yoy_revenue_growth
|
|
data_type: decimal
|
|
description: |
|
|
Relative increment of the revenue generated in the
|
|
current month with respect to the one generated 12
|
|
months ago.
|
|
It can be null if any revenue used in the computation
|
|
is null or it's negative.
|
|
tests:
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: -1
|
|
strictly: false
|
|
|
|
- name: yoy_1_month_shift_revenue_growth
|
|
data_type: decimal
|
|
description: |
|
|
Relative increment of the revenue generated in the
|
|
previous month with respect to the one generated 13
|
|
months ago.
|
|
It can be null if any revenue used in the computation
|
|
is null or it's negative.
|
|
This field is used for the growth score computation.
|
|
tests:
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: -1
|
|
strictly: false
|
|
|
|
- name: given_month_created_bookings
|
|
data_type: integer
|
|
description: |
|
|
Monthly value representing created bookings
|
|
for a specific deal. This value corresponds to
|
|
the given month. This value cannot be null.
|
|
tests:
|
|
- not_null
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: 0
|
|
strictly: false
|
|
|
|
- name: previous_1_month_created_bookings
|
|
data_type: integer
|
|
description: |
|
|
Monthly value representing created bookings
|
|
for a specific deal. This value corresponds to
|
|
the previous month.
|
|
This value can be null, thus indicating that no
|
|
history is available.
|
|
tests:
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: 0
|
|
strictly: false
|
|
|
|
- name: previous_12_month_created_bookings
|
|
data_type: integer
|
|
description: |
|
|
Monthly value representing created bookings
|
|
for a specific deal. This value corresponds to
|
|
monthly amount generated 12 months ago.
|
|
This value can be null, thus indicating that no
|
|
history is available.
|
|
tests:
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: 0
|
|
strictly: false
|
|
|
|
- name: mom_created_bookings_growth
|
|
data_type: decimal
|
|
description: |
|
|
Relative increment of the bookings created in the
|
|
current month with respect to the ones created in
|
|
the previous month.
|
|
It can be null if the bookings created in the
|
|
previous month are null.
|
|
This field is used for the growth score computation.
|
|
tests:
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: -1
|
|
strictly: false
|
|
|
|
- name: yoy_created_bookings_growth
|
|
data_type: decimal
|
|
description: |
|
|
Relative increment of the bookings created in the
|
|
current month with respect to the ones created 12
|
|
months ago.
|
|
It can be null if the bookings created 12 months
|
|
ago are null.
|
|
This field is used for the growth score computation.
|
|
tests:
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: -1
|
|
strictly: false
|
|
|
|
- name: given_month_listings_booked_in_month
|
|
data_type: integer
|
|
description: |
|
|
Monthly value representing the listings booked in month
|
|
for a specific deal. This value corresponds to
|
|
the given month. This value cannot be null.
|
|
tests:
|
|
- not_null
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: 0
|
|
strictly: false
|
|
|
|
- name: previous_1_month_listings_booked_in_month
|
|
data_type: integer
|
|
description: |
|
|
Monthly value representing the listings booked in month
|
|
for a specific deal. This value corresponds to
|
|
the previous month.
|
|
This value can be null, thus indicating that no
|
|
history is available.
|
|
tests:
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: 0
|
|
strictly: false
|
|
|
|
- name: previous_12_month_listings_booked_in_month
|
|
data_type: integer
|
|
description: |
|
|
Monthly value representing the listings booked in month
|
|
for a specific deal. This value corresponds to
|
|
monthly amount generated 12 months ago.
|
|
This value can be null, thus indicating that no
|
|
history is available.
|
|
tests:
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: 0
|
|
strictly: false
|
|
|
|
- name: mom_listings_booked_in_month_growth
|
|
data_type: decimal
|
|
description: |
|
|
Relative increment of the the listings booked in month
|
|
in the current month with respect to the ones of
|
|
the previous month.
|
|
It can be null if the listings booked in month in the
|
|
previous month are null.
|
|
This field is used for the growth score computation.
|
|
tests:
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: -1
|
|
strictly: false
|
|
|
|
- name: yoy_listings_booked_in_month_growth
|
|
data_type: decimal
|
|
description: |
|
|
Relative increment of the listings booked in month
|
|
in the current month with respect to the ones of 12
|
|
months ago.
|
|
It can be null if the listings booked in month of 12
|
|
months ago are null.
|
|
This field is used for the growth score computation.
|
|
tests:
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: -1
|
|
strictly: false
|
|
|
|
- name: deal_revenue_12_months_window
|
|
data_type: decimal
|
|
description: |
|
|
Total aggregated revenue in GBP generated by a deal
|
|
in the months from the period ranging from the
|
|
aggregated_revenue_from_first_day_month to
|
|
aggregated_revenue_to_first_day_month.
|
|
It can be negative if the sum is negative.
|
|
It cannot be null.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: effective_deal_revenue_12_months_window
|
|
data_type: decimal
|
|
description: |
|
|
Effective aggregated revenue in GBP generated by a deal
|
|
in the months from the period ranging from the
|
|
aggregated_revenue_from_first_day_month to
|
|
aggregated_revenue_to_first_day_month.
|
|
All negative monthly revenue values are settled as 0,
|
|
thus this value should not be reported.
|
|
It is used for the deal contribution share with respect
|
|
to the global revenue. It cannot be null.
|
|
tests:
|
|
- not_null
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: 0
|
|
strictly: false
|
|
|
|
- name: effective_global_revenue_12_months_window
|
|
data_type: decimal
|
|
description: |
|
|
Effective aggregated revenue in GBP generated by all deals
|
|
in the months from the period ranging from the
|
|
aggregated_revenue_from_first_day_month to
|
|
aggregated_revenue_to_first_day_month.
|
|
All negative monthly revenue values are settled as 0,
|
|
thus this value should not be reported.
|
|
It is used for the deal contribution share with respect
|
|
to the global revenue. It cannot be null.
|
|
tests:
|
|
- not_null
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: 0
|
|
strictly: false
|
|
|
|
- name: deal_contribution_share_to_global_revenue
|
|
data_type: decimal
|
|
description: |
|
|
Represents the size of the deal in terms of revenue. In
|
|
other words, what's the percentage of the global revenue
|
|
that can be attributed to this deal. It cannot be null.
|
|
tests:
|
|
- not_null
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: 0
|
|
strictly: false
|
|
|
|
- name: deal_contribution_rank_to_global_revenue
|
|
data_type: integer
|
|
description: |
|
|
Represents the ordered list of deals by descending size
|
|
in terms of revenue. It cannot be null. If more than one
|
|
deal have the same share, the order is not under control.
|
|
It cannot be null.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: avg_mom_growth_score
|
|
data_type: decimal
|
|
description: |
|
|
Represents the average score of MoM growth of created
|
|
bookings, MoM growth of listings booked in month and
|
|
MoM shifted by one month of revenue.
|
|
It indicates the tendency of growth of the deal without
|
|
taking into account its revenue size. It cannot be null.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: avg_yoy_growth_score
|
|
data_type: decimal
|
|
description: |
|
|
Represents the average score of YoY growth of created
|
|
bookings, YoY growth of listings booked in month and
|
|
YoY shifted by one month of revenue.
|
|
It indicates the tendency of growth of the deal without
|
|
taking into account its revenue size. It cannot be null.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: avg_growth_score
|
|
data_type: decimal
|
|
description: |
|
|
Represents the average score of YoY and MoM growth of created
|
|
bookings, YoY and MoM growth of listings booked in month and
|
|
YoY and MoM shifted by one month of revenue.
|
|
It indicates the tendency of growth of the deal without
|
|
taking into account its revenue size. It cannot be null.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: weighted_avg_growth_score
|
|
data_type: decimal
|
|
description: |
|
|
It's the weighted version of avg_growth_score that
|
|
takes into account the client size by using the revenue
|
|
contribution share of that deal to the global amount.
|
|
It's the main indicator towards measuring both growth
|
|
(if positive) or decay (if negative) while weighting
|
|
the financial impact this deal tendency can have.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: categorisation_weighted_avg_growth_score
|
|
data_type: string
|
|
description: |
|
|
Discrete categorisation of weighted_avg_growth_score.
|
|
It helps easily identifying which accounts are top losers,
|
|
losers, flat, winners and top winners.
|
|
Currently the categorisation is based on the score itself
|
|
rather than selecting a top up/down.
|
|
tests:
|
|
- not_null
|
|
- accepted_values:
|
|
values:
|
|
- TOP LOSER
|
|
- LOSER
|
|
- FLAT
|
|
- WINNER
|
|
- TOP WINNER
|
|
- UNSET
|
|
|
|
- name: int_monthly_12m_window_contribution_by_deal
|
|
description: |
|
|
The main goal of this model is to provide how much a deal
|
|
contributes to a given metric on the global amount over a
|
|
period of 12 months.
|
|
|
|
At the moment, this is only done for 3 metrics:
|
|
- total_revenue_in_gbp
|
|
- created_bookings
|
|
- listings_booked_in_month
|
|
|
|
There's 2 different contribution methods, the additive and
|
|
the average approach. The additive approach will "penalise"
|
|
accounts that have been active for less than 12 months on the
|
|
contribution amount, while the average approach "boosts" the
|
|
contribution of those accounts that have been active for less
|
|
than 12 months.
|
|
|
|
Mathematically speaking, it is encouraged to use the additive
|
|
approach ;-)
|
|
|
|
Find below the details of the computation:
|
|
- Additive approach:
|
|
Over a period of 12 months, sum the value of a given a metric
|
|
for each deal. Sum all the deals to get a global. Divide the
|
|
deal value vs. the global one.
|
|
- Average approach:
|
|
Over a period of 12 months, sum the value of a given a metric
|
|
for each deal, and divide it by the amount of months we're considering
|
|
for that deal. Sum all the average amounts per deals to get a global.
|
|
Divide the avg per deal value vs. the sum of avgs global one.
|
|
|
|
tests:
|
|
- dbt_utils.unique_combination_of_columns:
|
|
combination_of_columns:
|
|
- date
|
|
- id_deal
|
|
|
|
columns:
|
|
- name: date
|
|
data_type: date
|
|
description: |
|
|
Date corresponding to the last day of the month.
|
|
Metrics are inclusive to this date. Together with id_deal, it
|
|
acts as the primary key of this model.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: id_deal
|
|
data_type: string
|
|
description: |
|
|
Unique identifier of a Deal. Together with date, it acts as
|
|
the primary key of this model.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: deal_lifecycle_state
|
|
data_type: string
|
|
description: |
|
|
Identifier of the lifecycle state of a given deal
|
|
in a given month.
|
|
|
|
- name: preceding_months_count_by_deal
|
|
data_type: integer
|
|
description: |
|
|
Number of months preceding to the one given by date
|
|
that are used for the historic metric retrieval for
|
|
a given deal. In essence it states the amount of
|
|
months a given deal has been active before a the month
|
|
given by date, capped at 12 months.
|
|
tests:
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: 0
|
|
max_value: 12
|
|
strictly: false
|
|
|
|
- name: has_deal_been_created_less_than_12_months_ago
|
|
data_type: boolean
|
|
description: |
|
|
Flag to identify if a given deal has been created less
|
|
than 12 months ago (true) or not (false). It's based on the
|
|
preceding_months_count_by_deal, and will be true on the first
|
|
year of deal activity.
|
|
|
|
- name: total_revenue_12m_additive_contribution
|
|
data_type: numeric
|
|
description: |
|
|
Share of the deal contribution on total revenue
|
|
vs. the global amount, on the preceding 12 months
|
|
with respect to date. It uses the additive approach.
|
|
It can be negative.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: created_bookings_12m_additive_contribution
|
|
data_type: numeric
|
|
description: |
|
|
Share of the deal contribution on created bookings
|
|
vs. the global amount, on the preceding 12 months
|
|
with respect to date. It uses the additive approach.
|
|
tests:
|
|
- not_null
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: 0
|
|
max_value: 1
|
|
strictly: false
|
|
|
|
- name: listings_booked_in_month_12m_additive_contribution
|
|
data_type: numeric
|
|
description: |
|
|
Share of the deal contribution on listings booked in month
|
|
vs. the global amount, on the preceding 12 months
|
|
with respect to date. It uses the additive approach.
|
|
tests:
|
|
- not_null
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: 0
|
|
max_value: 1
|
|
strictly: false
|
|
|
|
- name: total_revenue_12m_average_contribution
|
|
data_type: numeric
|
|
description: |
|
|
Share of the deal contribution on total revenue
|
|
vs. the global amount, on the preceding 12 months
|
|
with respect to date. It uses the average approach.
|
|
It can be negative.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: created_bookings_12m_average_contribution
|
|
data_type: numeric
|
|
description: |
|
|
Share of the deal contribution on created bookings
|
|
vs. the global amount, on the preceding 12 months
|
|
with respect to date. It uses the average approach.
|
|
tests:
|
|
- not_null
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: 0
|
|
max_value: 1
|
|
strictly: false
|
|
|
|
- name: listings_booked_in_month_12m_average_contribution
|
|
data_type: numeric
|
|
description: |
|
|
Share of the deal contribution on listings booked in month
|
|
vs. the global amount, on the preceding 12 months
|
|
with respect to date. It uses the average approach.
|
|
tests:
|
|
- not_null
|
|
- dbt_expectations.expect_column_values_to_be_between:
|
|
min_value: 0
|
|
max_value: 1
|
|
strictly: false
|
|
|
|
- name: int_monthly_churn_metrics
|
|
description: |
|
|
This model is used for global KPIs.
|
|
|
|
It computes the churn contribution by dimension, dimension value
|
|
and date, in a monthly basis. This model is different from the
|
|
usual mtd ones since it strictly depends on the monthly computation
|
|
of metrics by deal, which is done in a monthly basis rather than mtd.
|
|
In essence, it means we won't have data for the current month.
|
|
|
|
This model retrieves the 12 month contribution to global metrics
|
|
by deal and aggregates it to dimension and dimension value for those
|
|
deals that are tagged as '05-Churning' in that month. Thus, it provides
|
|
a total of 6 churn related metrics, represented as ratios over the total:
|
|
- Total Revenue (in GBP)
|
|
- Created Bookings
|
|
- Listings Booked in Month
|
|
In two ways of computing the contribution, Additive and Average. For further
|
|
information, please refer to the documentation of the model:
|
|
- int_monthly_12m_window_contribution_by_deal
|
|
|
|
Lastly, when checking data at any dimension distinct from Global, at the
|
|
moment these values represent the additive contribution of churn with respect
|
|
to the global amount. This means that, for instance, if we have 10% of churn
|
|
in a month, it can be divided by 9% USA and 1% GBR since 9%+1% = 10%.
|
|
|
|
tests:
|
|
- dbt_utils.unique_combination_of_columns:
|
|
combination_of_columns:
|
|
- date
|
|
- dimension
|
|
- dimension_value
|
|
|
|
columns:
|
|
- name: date
|
|
data_type: date
|
|
description: The date for the month-to-date metrics.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: dimension
|
|
data_type: string
|
|
description: The dimension or granularity of the metrics.
|
|
tests:
|
|
- accepted_values:
|
|
values:
|
|
- global
|
|
- by_number_of_listings
|
|
- by_billing_country
|
|
|
|
- name: dimension_value
|
|
data_type: string
|
|
description: The value or segment available for the selected dimension.
|
|
tests:
|
|
- not_null
|
|
|
|
- name: total_revenue_churn_additive_contribution
|
|
data_type: numeric
|
|
description: Total Revenue churn rate (additive approach).
|
|
|
|
- name: created_bookings_churn_additive_contribution
|
|
data_type: numeric
|
|
description: Created Bookings churn rate (additive approach).
|
|
|
|
- name: listings_booked_in_month_churn_additive_contribution
|
|
data_type: numeric
|
|
description: Listings Booked in Month churn rate (additive approach).
|
|
|
|
- name: total_revenue_churn_average_contribution
|
|
data_type: numeric
|
|
description: Total Revenue churn rate (average approach).
|
|
|
|
- name: created_bookings_churn_average_contribution
|
|
data_type: numeric
|
|
description: Created Bookings churn rate (average approach).
|
|
|
|
- name: listings_booked_in_month_churn_average_contribution
|
|
data_type: numeric
|
|
description: Listings Booked in Month churn rate (average approach).
|