Merged PR 3169: Adding Churn metrics to Global KPIs
# 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
This commit is contained in:
parent
901be930df
commit
9440e6d624
3 changed files with 238 additions and 1 deletions
119
models/intermediate/cross/int_monthly_churn_metrics.sql
Normal file
119
models/intermediate/cross/int_monthly_churn_metrics.sql
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
{% set dimensions = get_kpi_dimensions() %}
|
||||
{% set churn_lifecycle_states = "('05-Churning')" %}
|
||||
|
||||
{{ config(materialized="table", unique_key=["date", "dimension", "dimension_value"]) }}
|
||||
with
|
||||
int_monthly_12m_window_contribution_by_deal as (
|
||||
select * from {{ ref("int_monthly_12m_window_contribution_by_deal") }}
|
||||
),
|
||||
int_dates_mtd_by_dimension as (
|
||||
select * from {{ ref("int_dates_mtd_by_dimension") }}
|
||||
),
|
||||
int_core__mtd_accommodation_segmentation as (
|
||||
select * from {{ ref("int_core__mtd_accommodation_segmentation") }}
|
||||
),
|
||||
int_core__deal as (select * from {{ ref("int_core__deal") }}),
|
||||
churn_metrics_per_date as (
|
||||
{% for dimension in dimensions %}
|
||||
select
|
||||
m12wc.date,
|
||||
{{ dimension.dimension }} as dimension,
|
||||
{{ dimension.dimension_value }} as dimension_value,
|
||||
sum(
|
||||
case
|
||||
when m12wc.deal_lifecycle_state in {{ churn_lifecycle_states }}
|
||||
then m12wc.total_revenue_12m_additive_contribution
|
||||
else 0
|
||||
end
|
||||
) as total_revenue_churn_additive_contribution,
|
||||
sum(
|
||||
case
|
||||
when m12wc.deal_lifecycle_state in {{ churn_lifecycle_states }}
|
||||
then m12wc.created_bookings_12m_additive_contribution
|
||||
else 0
|
||||
end
|
||||
) as created_bookings_churn_additive_contribution,
|
||||
sum(
|
||||
case
|
||||
when m12wc.deal_lifecycle_state in {{ churn_lifecycle_states }}
|
||||
then m12wc.listings_booked_in_month_12m_additive_contribution
|
||||
else 0
|
||||
end
|
||||
) as listings_booked_in_month_churn_additive_contribution,
|
||||
sum(
|
||||
case
|
||||
when m12wc.deal_lifecycle_state in {{ churn_lifecycle_states }}
|
||||
then m12wc.total_revenue_12m_average_contribution
|
||||
else 0
|
||||
end
|
||||
) as total_revenue_churn_average_contribution,
|
||||
sum(
|
||||
case
|
||||
when m12wc.deal_lifecycle_state in {{ churn_lifecycle_states }}
|
||||
then m12wc.created_bookings_12m_average_contribution
|
||||
else 0
|
||||
end
|
||||
) as created_bookings_churn_average_contribution,
|
||||
sum(
|
||||
case
|
||||
when m12wc.deal_lifecycle_state in {{ churn_lifecycle_states }}
|
||||
then m12wc.listings_booked_in_month_12m_average_contribution
|
||||
else 0
|
||||
end
|
||||
) as listings_booked_in_month_churn_average_contribution
|
||||
from int_monthly_12m_window_contribution_by_deal m12wc
|
||||
{% if dimension.dimension == "'by_number_of_listings'" %}
|
||||
inner join
|
||||
int_core__mtd_accommodation_segmentation mas
|
||||
on m12wc.id_deal = mas.id_deal
|
||||
and m12wc.date = mas.date
|
||||
{% elif dimension.dimension == "'by_billing_country'" %}
|
||||
inner join
|
||||
int_core__deal ud
|
||||
on m12wc.id_deal = ud.id_deal
|
||||
and ud.main_billing_country_iso_3_per_deal is not null
|
||||
{% endif %}
|
||||
where deal_lifecycle_state is not null
|
||||
group by 1, 2, 3
|
||||
{% if not loop.last %}
|
||||
union all
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
)
|
||||
-- Final aggregation of subqueries --
|
||||
select
|
||||
d.year,
|
||||
d.month,
|
||||
d.day,
|
||||
d.date,
|
||||
d.dimension,
|
||||
d.dimension_value,
|
||||
d.is_end_of_month,
|
||||
d.is_current_month,
|
||||
cast(
|
||||
c.total_revenue_churn_additive_contribution as numeric(19, 6)
|
||||
) as total_revenue_churn_additive_contribution,
|
||||
cast(
|
||||
c.created_bookings_churn_additive_contribution as numeric(19, 6)
|
||||
) as created_bookings_churn_additive_contribution,
|
||||
cast(
|
||||
c.listings_booked_in_month_churn_additive_contribution as numeric(19, 6)
|
||||
) as listings_booked_in_month_churn_additive_contribution,
|
||||
cast(
|
||||
c.total_revenue_churn_average_contribution as numeric(19, 6)
|
||||
) as total_revenue_churn_average_contribution,
|
||||
cast(
|
||||
c.created_bookings_churn_average_contribution as numeric(19, 6)
|
||||
) as created_bookings_churn_average_contribution,
|
||||
cast(
|
||||
c.listings_booked_in_month_churn_average_contribution as numeric(19, 6)
|
||||
) as listings_booked_in_month_churn_average_contribution
|
||||
from int_dates_mtd_by_dimension d
|
||||
left join
|
||||
churn_metrics_per_date c
|
||||
on c.date = d.date
|
||||
and c.dimension = d.dimension
|
||||
and c.dimension_value = d.dimension_value
|
||||
-- Remove current month dates since data won't be available anyway. This is specific
|
||||
-- for this churn metrics model
|
||||
where d.is_current_month = 0
|
||||
|
|
@ -31,6 +31,7 @@ with
|
|||
int_xero__mtd_invoicing_metrics as (
|
||||
select * from {{ ref("int_xero__mtd_invoicing_metrics") }}
|
||||
),
|
||||
int_monthly_churn_metrics as (select * from {{ ref("int_monthly_churn_metrics") }}),
|
||||
int_dates_mtd_by_dimension as (
|
||||
select * from {{ ref("int_dates_mtd_by_dimension") }}
|
||||
),
|
||||
|
|
@ -159,7 +160,15 @@ with
|
|||
+ coalesce(invoicing.xero_apis_net_fees_in_gbp, 0)
|
||||
) / nullif(
|
||||
accommodations.listings_booked_in_month, 0
|
||||
) as total_revenue_per_listings_booked_in_month
|
||||
) as total_revenue_per_listings_booked_in_month,
|
||||
|
||||
-- CHURN --
|
||||
churn.total_revenue_churn_additive_contribution,
|
||||
churn.created_bookings_churn_additive_contribution,
|
||||
churn.listings_booked_in_month_churn_additive_contribution,
|
||||
churn.total_revenue_churn_average_contribution,
|
||||
churn.created_bookings_churn_average_contribution,
|
||||
churn.listings_booked_in_month_churn_average_contribution
|
||||
|
||||
from int_dates_mtd_by_dimension d
|
||||
left join
|
||||
|
|
@ -207,6 +216,11 @@ with
|
|||
on d.date = invoicing.date
|
||||
and d.dimension = invoicing.dimension
|
||||
and d.dimension_value = invoicing.dimension_value
|
||||
left join
|
||||
int_monthly_churn_metrics churn
|
||||
on d.date = churn.date
|
||||
and d.dimension = churn.dimension
|
||||
and d.dimension_value = churn.dimension_value
|
||||
)
|
||||
select
|
||||
current.year,
|
||||
|
|
@ -302,6 +316,30 @@ select
|
|||
calculate_safe_relative_increment(
|
||||
"total_revenue_per_listings_booked_in_month"
|
||||
)
|
||||
}},
|
||||
|
||||
-- CHURN --
|
||||
{{ calculate_safe_relative_increment("total_revenue_churn_additive_contribution") }},
|
||||
{{
|
||||
calculate_safe_relative_increment(
|
||||
"created_bookings_churn_additive_contribution"
|
||||
)
|
||||
}},
|
||||
{{
|
||||
calculate_safe_relative_increment(
|
||||
"listings_booked_in_month_churn_additive_contribution"
|
||||
)
|
||||
}},
|
||||
{{ calculate_safe_relative_increment("total_revenue_churn_average_contribution") }},
|
||||
{{
|
||||
calculate_safe_relative_increment(
|
||||
"created_bookings_churn_average_contribution"
|
||||
)
|
||||
}},
|
||||
{{
|
||||
calculate_safe_relative_increment(
|
||||
"listings_booked_in_month_churn_average_contribution"
|
||||
)
|
||||
}}
|
||||
|
||||
from plain_kpi_combination current
|
||||
|
|
|
|||
|
|
@ -1262,3 +1262,83 @@ models:
|
|||
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).
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue