Merged PR 5058: Propagate API deals to growth score

# Description

I opted to name the combination of (Platform) Billable Bookings and (API) Billable Verifications as Billable Items. This is to ensure consistent naming.

Changes:
* Renamed `int_kpis_projected__agg_daily_billable_bookings` to `int_kpis_projected__agg_daily_billable_items`. This now has a new CTE named combination_of_billable_items that combines both API and Platform billable items. Renamed any "bookings" field to "items".
* Renamed `int_kpis_projected__agg_monthly_billable_bookings` to `int_kpis_projected__agg_monthly_billable_items`. Renamed any "bookings" field to "items".
* Renamed `int_billable_bookings_growth_score_by_deal` to `int_billable_items_growth_score_by_deal`. This now has a new CTE named `aggregated_monthly_billable_items` that combines the historical information both API and Platform on billable items. Renamed any "bookings" field to "items".
* Changes Schema accordingly. Small note here that the assert dimension completeness stops working since there's dimensions specific to API or Platform, thus I removed it.

# 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: #29374
This commit is contained in:
Oriol Roqué Paniagua 2025-04-25 07:27:22 +00:00
parent 8901cc85ec
commit 0ffcfca6a8
6 changed files with 288 additions and 258 deletions

View file

@ -11,11 +11,31 @@ with
int_kpis__agg_daily_billable_bookings as (
select * from {{ ref("int_kpis__agg_daily_billable_bookings") }}
),
int_kpis__agg_daily_api_billable_verifications as (
select * from {{ ref("int_kpis__agg_daily_api_billable_verifications") }}
),
combination_of_billable_items as (
select
coalesce(bb.date, abv.date) as date,
coalesce(bb.dimension, abv.dimension) as dimension,
coalesce(bb.dimension_value, abv.dimension_value) as dimension_value,
sum(
coalesce(bb.billable_bookings, 0)
+ coalesce(abv.billable_verifications, 0)
) as billable_items
from int_kpis__agg_daily_billable_bookings bb
full outer join
int_kpis__agg_daily_api_billable_verifications abv
on bb.date = abv.date
and bb.dimension = abv.dimension
and bb.dimension_value = abv.dimension_value
group by 1, 2, 3
),
same_month_trend as (
-- Computes the daily bookings based on the same month trend.
-- Computes the daily billable items based on the same month trend.
-- If the latest available date is the 20th of the month, then the daily
-- bookings will be computed from the 1st to the 20th of the month (so 20 days
-- in total).
-- billable items will be computed from the 1st to the 20th of the month
-- (so 20 days in total).
select
dd.last_day_month,
mm.dimension,
@ -24,17 +44,17 @@ with
sum(
case
when dd.is_available_for_same_month_projection
then coalesce(mm.billable_bookings, 0)
then coalesce(mm.billable_items, 0)
else 0
end
),
0
) as same_month_trend_total_billable_bookings,
) as same_month_trend_total_billable_items,
coalesce(
1.0 * sum(
case
when dd.is_available_for_same_month_projection
then coalesce(mm.billable_bookings, 0)
then coalesce(mm.billable_items, 0)
else 0
end
)
@ -49,7 +69,7 @@ with
0
),
0
) as same_month_trend_daily_billable_bookings,
) as same_month_trend_daily_billable_items,
max(
case
when dd.is_available_for_same_month_projection
@ -58,14 +78,14 @@ with
end
) as same_month_trend_total_available_days
from int_kpis_projected__dimension_dates dd
inner join int_kpis__agg_daily_billable_bookings mm on dd.date = mm.date
inner join combination_of_billable_items mm on dd.date = mm.date
group by 1, 2, 3
),
last_7_days_trend as (
-- Computes the daily bookings based on the last 7 days trend.
-- Computes the daily billable items based on the last 7 days trend.
-- If the latest available date is the 20th of the month, then the daily
-- bookings will be computed from the 13th to the 20th of the month (so 7 days
-- in total).
-- billable items will be computed from the 13th to the 20th of the month
-- (so 7 days in total).
select
dd.last_day_month,
mm.dimension,
@ -74,27 +94,27 @@ with
sum(
case
when dd.is_available_for_same_month_projection
then coalesce(mm.billable_bookings, 0)
then coalesce(mm.billable_items, 0)
else 0
end
),
0
) as last_7_days_trend_total_billable_bookings,
) as last_7_days_trend_total_billable_items,
coalesce(
1.0 * sum(
case
when dd.is_available_for_same_month_projection
then coalesce(mm.billable_bookings, 0)
then coalesce(mm.billable_items, 0)
else 0
end
)
/ 7,
0
) as last_7_days_trend_daily_billable_bookings,
) as last_7_days_trend_daily_billable_items,
7 as last_7_days_trend_total_available_days
from int_kpis_projected__dimension_dates dd
inner join
int_kpis__agg_daily_billable_bookings mm
combination_of_billable_items mm
on mm.date between dd.previous_6_days and dd.date
where is_available_for_last_7_days_projection = true
group by 1, 2, 3
@ -107,24 +127,24 @@ with
-- Combination of two sources of trends: same month and last 7 days.
coalesce(
smt.same_month_trend_daily_billable_bookings, 0
) as same_month_trend_daily_billable_bookings,
smt.same_month_trend_daily_billable_items, 0
) as same_month_trend_daily_billable_items,
coalesce(
l7dt.last_7_days_trend_daily_billable_bookings, 0
) as last_7_days_trend_daily_billable_bookings,
l7dt.last_7_days_trend_daily_billable_items, 0
) as last_7_days_trend_daily_billable_items,
round(
(
coalesce(smt.same_month_trend_daily_billable_bookings, 0)
+ coalesce(l7dt.last_7_days_trend_daily_billable_bookings, 0)
coalesce(smt.same_month_trend_daily_billable_items, 0)
+ coalesce(l7dt.last_7_days_trend_daily_billable_items, 0)
)
/ 2,
0
) as projected_daily_billable_bookings,
) as projected_daily_billable_items,
-- Total billable bookings for the same month and last 7 days
-- Total billable items for the same month and last 7 days
-- for information purposes
smt.same_month_trend_total_billable_bookings,
l7dt.last_7_days_trend_total_billable_bookings,
smt.same_month_trend_total_billable_items,
l7dt.last_7_days_trend_total_billable_items,
-- Total available days for the same month and last 7 days
-- for information purposes
@ -156,12 +176,12 @@ select
-- future. This accounts for all the real historical data.
case
when not dd.is_in_the_future then 'ACTUAL' else 'PROJECTED'
end as daily_billable_bookings_for_reporting_source,
end as daily_billable_items_for_reporting_source,
case
when not dd.is_in_the_future
then coalesce(mm.billable_bookings, 0)
else coalesce(cot.projected_daily_billable_bookings, 0)
end as daily_billable_bookings_for_reporting,
then coalesce(mm.billable_items, 0)
else coalesce(cot.projected_daily_billable_items, 0)
end as daily_billable_items_for_reporting,
-- Evaluation source: actual or projected depending on whether the date is
-- available for the same month projection. This accounts only for the historical
@ -169,31 +189,29 @@ select
-- the performance of the projection.
case
when dd.is_available_for_same_month_projection then 'ACTUAL' else 'PROJECTED'
end as daily_billable_bookings_for_evaluation_source,
end as daily_billable_items_for_evaluation_source,
case
when dd.is_available_for_same_month_projection
then coalesce(mm.billable_bookings, 0)
else coalesce(cot.projected_daily_billable_bookings, 0)
end as daily_billable_bookings_for_evaluation,
then coalesce(mm.billable_items, 0)
else coalesce(cot.projected_daily_billable_items, 0)
end as daily_billable_items_for_evaluation,
-- Specific daily billable bookings trends
coalesce(
cot.projected_daily_billable_bookings, 0
) as projected_daily_billable_bookings,
coalesce(mm.billable_bookings, 0) as actual_daily_billable_bookings,
-- Specific daily billable items trends
coalesce(cot.projected_daily_billable_items, 0) as projected_daily_billable_items,
coalesce(mm.billable_items, 0) as actual_daily_billable_items,
-- For information purposes to debug the trends
cot.same_month_trend_daily_billable_bookings,
cot.last_7_days_trend_daily_billable_bookings,
cot.same_month_trend_total_billable_bookings,
cot.last_7_days_trend_total_billable_bookings,
cot.same_month_trend_daily_billable_items,
cot.last_7_days_trend_daily_billable_items,
cot.same_month_trend_total_billable_items,
cot.last_7_days_trend_total_billable_items,
cot.same_month_trend_total_available_days,
cot.last_7_days_trend_total_available_days
from int_kpis_projected__dimension_dates dd
left join combination_of_trends cot on dd.last_day_month = cot.last_day_month
left join
int_kpis__agg_daily_billable_bookings mm
combination_of_billable_items mm
on dd.date = mm.date
and cot.dimension = mm.dimension
and cot.dimension_value = mm.dimension_value

View file

@ -15,14 +15,14 @@ with
-- Metrics --
sum(
daily_billable_bookings_for_reporting
) as current_month_projected_billable_bookings,
daily_billable_items_for_reporting
) as current_month_projected_billable_items,
sum(
daily_billable_bookings_for_evaluation
) as historical_projected_billable_bookings,
sum(actual_daily_billable_bookings) as actual_billable_bookings
daily_billable_items_for_evaluation
) as historical_projected_billable_items,
sum(actual_daily_billable_items) as actual_billable_items
from {{ ref("int_kpis_projected__agg_daily_billable_bookings") }}
from {{ ref("int_kpis_projected__agg_daily_billable_items") }}
group by 1, 2, 3, 4, 5
),
monthly_error_computation as (
@ -31,26 +31,20 @@ with
last_day_month,
dimension,
dimension_value,
current_month_projected_billable_bookings,
historical_projected_billable_bookings,
actual_billable_bookings,
current_month_projected_billable_items,
historical_projected_billable_items,
actual_billable_items,
case
when not is_current_month
then
abs(
historical_projected_billable_bookings
- actual_billable_bookings
)
then abs(historical_projected_billable_items - actual_billable_items)
else null
end as monthly_absolute_error,
case
when not is_current_month
then
1.0 * abs(
historical_projected_billable_bookings
- actual_billable_bookings
)
/ nullif(historical_projected_billable_bookings, 0)
1.0
* abs(historical_projected_billable_items - actual_billable_items)
/ nullif(historical_projected_billable_items, 0)
else null
end as monthly_absolute_percentage_error
@ -77,8 +71,8 @@ select
current_month.dimension,
current_month.dimension_value,
-- Metrics --
current_month.current_month_projected_billable_bookings,
current_month.actual_billable_bookings,
current_month.current_month_projected_billable_items,
current_month.actual_billable_items,
-- Error Attribution --
historical_errors.historical_monthly_mean_absolute_error,
historical_errors.historical_monthly_mean_absolute_percentage_error

View file

@ -100,15 +100,17 @@ models:
data_tests:
- not_null
- name: int_kpis_projected__agg_daily_billable_bookings
- name: int_kpis_projected__agg_daily_billable_items
description: |
This model provides the projected daily billable bookings.
This model provides the projected daily billable items, in
other words, platform billable bookings and API billable
verifications.
It considers 2 computations:
- The daily billable bookings for the current month,
- The daily billable bookings in the past 7 days,
- The daily billable items for the current month,
- The daily billable items in the past 7 days,
and the final value is an arithmetic mean of both.
This model also retrieves the actual billable bookings to be able
This model also retrieves the actual billable items to be able
to compare the projected values with the actual ones.
data_tests:
@ -131,15 +133,13 @@ models:
data_type: string
description: The dimension or granularity of the metrics.
data_tests:
- assert_dimension_completeness:
metric_column_names:
- actual_daily_billable_bookings
- accepted_values:
values:
- global
- by_number_of_listings
- by_billing_country
- by_business_scope
- by_service
- by_deal
- name: dimension_value
@ -193,12 +193,12 @@ models:
data_tests:
- not_null
- name: daily_billable_bookings_for_reporting_source
- name: daily_billable_items_for_reporting_source
data_type: string
description: |
The source of the daily billable bookings for reporting.
The source of the daily billable items for reporting.
This field is used to identify the source of the data displayed
in daily_billable_bookings_for_reporting to differentiate between
in daily_billable_items_for_reporting to differentiate between
the actual and projected values.
It's aimed for reforting purposes as any historical month will
contain the actual figures.
@ -209,25 +209,25 @@ models:
- ACTUAL
- PROJECTED
- name: daily_billable_bookings_for_reporting
- name: daily_billable_items_for_reporting
data_type: integer
description: |
The daily billable bookings for reporting purposes.
The daily billable items for reporting purposes.
This field contains both the actual and projected values.
Any date in the future will contain projected values, while
any date in the past will contain actual values.
data_tests:
- not_null
- name: daily_billable_bookings_for_evaluation_source
- name: daily_billable_items_for_evaluation_source
data_type: string
description: |
Important: This field is used to evaluate the performance
of the projections!
The source of the daily billable bookings for evaluation.
The source of the daily billable items for evaluation.
This field is used to identify the source of the data displayed
in daily_billable_bookings_for_evaluation to differentiate between
in daily_billable_items_for_evaluation to differentiate between
the actual and projected values.
It's aimed for evaluation purposes as any historical month can
contain projected figures.
@ -239,13 +239,13 @@ models:
- ACTUAL
- PROJECTED
- name: daily_billable_bookings_for_evaluation
- name: daily_billable_items_for_evaluation
data_type: integer
description: |
Important: This field is used to evaluate the performance
of the projections!
The daily billable bookings for evaluation purposes.
The daily billable items for evaluation purposes.
This field contains both the actual and projected values.
Any date in the future will contain projected values. Any date
in the past which day is after the yesterday day will also contain
@ -254,57 +254,57 @@ models:
data_tests:
- not_null
- name: projected_daily_billable_bookings
- name: projected_daily_billable_items
data_type: integer
description: |
The projected daily billable bookings. This field is the result
of the projection of the daily billable bookings for the current month
The projected daily billable items. This field is the result
of the projection of the daily billable items for the current month
and the past 7 days.
data_tests:
- not_null
- name: actual_daily_billable_bookings
- name: actual_daily_billable_items
description: |
The actual billable bookings for the same period as the projected ones.
The actual billable items for the same period as the projected ones.
This comes from the standard KPIs.
data_tests:
- not_null
- name: same_month_trend_daily_billable_bookings
- name: same_month_trend_daily_billable_items
data_type: float
description: |
The average daily billable bookings for the current month.
The average daily billable items for the current month.
This field is the result of the division of the actual daily billable
bookings to date by the number of days available within the current month
items to date by the number of days available within the current month
to date, and contains decimals.
This is just for information purposes.
data_tests:
- not_null
- name: last_7_days_trend_daily_billable_bookings
- name: last_7_days_trend_daily_billable_items
data_type: float
description: |
The average daily billable bookings for the past 7 days.
The average daily billable items for the past 7 days.
This field is the result of the division of the actual daily billable
bookings for the past 7 days by 7 days, and contains decimals.
items for the past 7 days by 7 days, and contains decimals.
This is just for information purposes.
data_tests:
- not_null
- name: same_month_trend_total_billable_bookings
- name: same_month_trend_total_billable_items
data_type: integer
description: |
The total billable bookings for the current month.
The total billable items for the current month.
This field is the result of the sum of the actual daily billable
bookings to date.
items to date.
This is just for information purposes.
- name: last_7_days_trend_total_billable_bookings
- name: last_7_days_trend_total_billable_items
data_type: integer
description: |
The total billable bookings for the past 7 days.
The total billable items for the past 7 days.
This field is the result of the sum of the actual daily billable
bookings for the past 7 days.
items for the past 7 days.
This is just for information purposes.
- name: same_month_trend_total_available_days
@ -323,10 +323,12 @@ models:
past 7 days.
This is just for information purposes.
- name: int_kpis_projected__agg_monthly_billable_bookings
- name: int_kpis_projected__agg_monthly_billable_items
description: |
This model provides the projected monthly billable bookings per dimension
and dimension value. It only considers the current month.
This model provides the projected monthly billable items per dimension
and dimension value.
Billable items are defined as platform billable bookings and API
billable verifications. It only considers the current month.
Historical data is considered only to assess the performance of the
projections.
The projection logic is handled on the equivalent daily model,
@ -357,15 +359,13 @@ models:
data_type: string
description: The dimension or granularity of the metrics.
data_tests:
- assert_dimension_completeness:
metric_column_names:
- actual_billable_bookings
- accepted_values:
values:
- global
- by_number_of_listings
- by_billing_country
- by_business_scope
- by_service
- by_deal
- name: dimension_value
@ -374,12 +374,12 @@ models:
data_tests:
- not_null
- name: current_month_projected_billable_bookings
- name: current_month_projected_billable_items
data_type: integer
description: |
The projected monthly billable bookings for the current month.
This field is the result of the sum of the actual daily billable bookings
for the current month to date and the projected daily billable bookings
The projected monthly billable items for the current month.
This field is the result of the sum of the actual daily billable items
for the current month to date and the projected daily billable items
for the rest of the days in the month that are in the future.
The closest we are to the end of the month, the more accurate this value will be.
@ -391,10 +391,10 @@ models:
data_tests:
- not_null
- name: actual_billable_bookings
- name: actual_billable_items
data_type: integer
description: |
The sum of the actual daily billable bookings for the current month to date.
The sum of the actual daily billable items for the current month to date.
This comes from the standard KPIs.
data_tests:
- not_null
@ -407,7 +407,7 @@ models:
This field is used to assess the performance of the projections.
This is based on the absolute differences between the projected
monthly billable bookings for each previous month vs the actual value.
monthly billable items for each previous month vs the actual value.
In order to be consistent, it uses the same number of days available
for the current month to date as the actual value, and the rest of the days
are projected.
@ -425,7 +425,7 @@ models:
This field is used to assess the performance of the projections.
This is based on the absolute percentage differences between the projected
monthly billable bookings for each previous month vs the actual value.
monthly billable items for each previous month vs the actual value.
In order to be consistent, it uses the same number of days available
for the current month to date as the actual value, and the rest of the days
are projected.