# Description It adds 2 new metrics in Main KPIs, both for Global/per Dimension and By Deal. If merged, metrics will NOT appear automatically in the Global/per Dimension nor in the By Deal. These two new metrics are: * Income Retained: Total Revenue - Waiver Paid Back to Host * Income Retained Post Resolutions: Total Revenue - Waiver Paid Back to Host - Host Resolutions Amount Paid Why these are important:  Even though we grow considerably in terms of Revenue, the gap of Waivers that we pay back to host is also increasing. Thus the "real" increment is actually lower. However, what I find more interesting is the heavy decrease in Income Retained Post Resolutions. Here's the Year-by-Year comparison:  In November 2024, we're back to the figures of 2023 (-0.4%) and this should be alarming considering we're growing in Total Revenue by 27% and in Retained Income by 41% vs. Nov 23. In terms of business impact, I'd opt for having these 2 metrics computed as these capture a reality that otherwise we keep hidden. Happy to discuss renames and how/if we move forward with this. # 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. Attached working excel with the extraction [20241227_retained_revenue_global.xlsx](https://guardhog.visualstudio.com/4148d95f-4b6d-4205-bcff-e9c8e0d2ca65/_apis/git/repositories/54ac356f-aad7-46d2-b62c-e8c5b3bb8ebf/pullRequests/3906/attachments/20241227_retained_revenue_global.xlsx) Related work items: #25804
495 lines
20 KiB
SQL
495 lines
20 KiB
SQL
{% set metrics = [
|
|
{
|
|
"order_by": 1,
|
|
"metric": "Created Bookings",
|
|
"value": "created_bookings",
|
|
"previous_year_value": "previous_year_created_bookings",
|
|
"relative_increment": "relative_increment_created_bookings",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 2,
|
|
"metric": "Cancelled Bookings",
|
|
"value": "cancelled_bookings",
|
|
"previous_year_value": "previous_year_cancelled_bookings",
|
|
"relative_increment": "relative_increment_cancelled_bookings",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "negative",
|
|
},
|
|
{
|
|
"order_by": 3,
|
|
"metric": "Checkout Bookings",
|
|
"value": "check_out_bookings",
|
|
"previous_year_value": "previous_year_check_out_bookings",
|
|
"relative_increment": "relative_increment_check_out_bookings",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 4,
|
|
"metric": "Est. Billable Bookings",
|
|
"value": "billable_bookings",
|
|
"previous_year_value": "previous_year_billable_bookings",
|
|
"relative_increment": "relative_increment_billable_bookings",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 10,
|
|
"metric": "Guest Journey Created",
|
|
"value": "created_guest_journeys",
|
|
"previous_year_value": "previous_year_created_guest_journeys",
|
|
"relative_increment": "relative_increment_created_guest_journeys",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 11,
|
|
"metric": "Guest Journey Started",
|
|
"value": "started_guest_journeys",
|
|
"previous_year_value": "previous_year_started_guest_journeys",
|
|
"relative_increment": "relative_increment_started_guest_journeys",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 12,
|
|
"metric": "Guest Journey Completed",
|
|
"value": "completed_guest_journeys",
|
|
"previous_year_value": "previous_year_completed_guest_journeys",
|
|
"relative_increment": "relative_increment_completed_guest_journeys",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 13,
|
|
"metric": "Guest Journey with Payment",
|
|
"value": "paid_guest_journeys",
|
|
"previous_year_value": "previous_year_paid_guest_journeys",
|
|
"relative_increment": "relative_increment_paid_guest_journeys",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 20,
|
|
"metric": "New Deals",
|
|
"value": "new_deals",
|
|
"previous_year_value": "previous_year_new_deals",
|
|
"relative_increment": "relative_increment_new_deals",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 21,
|
|
"metric": "First Time Booked Deals",
|
|
"value": "first_time_booked_deals",
|
|
"previous_year_value": "previous_year_first_time_booked_deals",
|
|
"relative_increment": "relative_increment_first_time_booked_deals",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 22,
|
|
"metric": "Deals Booked in Month",
|
|
"value": "deals_booked_in_month",
|
|
"previous_year_value": "previous_year_deals_booked_in_month",
|
|
"relative_increment": "relative_increment_deals_booked_in_month",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 23,
|
|
"metric": "Deals Booked in 6 Months",
|
|
"value": "deals_booked_in_6_months",
|
|
"previous_year_value": "previous_year_deals_booked_in_6_months",
|
|
"relative_increment": "relative_increment_deals_booked_in_6_months",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 24,
|
|
"metric": "Deals Booked in 12 Months",
|
|
"value": "deals_booked_in_12_months",
|
|
"previous_year_value": "previous_year_deals_booked_in_12_months",
|
|
"relative_increment": "relative_increment_deals_booked_in_12_months",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 25,
|
|
"metric": "Churning Deals",
|
|
"value": "churning_deals",
|
|
"previous_year_value": "previous_year_churning_deals",
|
|
"relative_increment": "relative_increment_churning_deals",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "negative",
|
|
},
|
|
{
|
|
"order_by": 30,
|
|
"metric": "New Listings",
|
|
"value": "new_listings",
|
|
"previous_year_value": "previous_year_new_listings",
|
|
"relative_increment": "relative_increment_new_listings",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 31,
|
|
"metric": "First Time Booked Listings",
|
|
"value": "first_time_booked_listings",
|
|
"previous_year_value": "previous_year_first_time_booked_listings",
|
|
"relative_increment": "relative_increment_first_time_booked_listings",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 32,
|
|
"metric": "Listings Booked in Month",
|
|
"value": "listings_booked_in_month",
|
|
"previous_year_value": "previous_year_listings_booked_in_month",
|
|
"relative_increment": "relative_increment_listings_booked_in_month",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 33,
|
|
"metric": "Listings Booked in 6 Months",
|
|
"value": "listings_booked_in_6_months",
|
|
"previous_year_value": "previous_year_listings_booked_in_6_months",
|
|
"relative_increment": "relative_increment_listings_booked_in_6_months",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 34,
|
|
"metric": "Listings Booked in 12 Months",
|
|
"value": "listings_booked_in_12_months",
|
|
"previous_year_value": "previous_year_listings_booked_in_12_months",
|
|
"relative_increment": "relative_increment_listings_booked_in_12_months",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 35,
|
|
"metric": "Churning Listings",
|
|
"value": "churning_listings",
|
|
"previous_year_value": "previous_year_churning_listings",
|
|
"relative_increment": "relative_increment_churning_listings",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "negative",
|
|
},
|
|
{
|
|
"order_by": 40,
|
|
"metric": "Host Resolutions Payment Count",
|
|
"value": "xero_host_resolution_payment_count",
|
|
"previous_year_value": "previous_year_xero_host_resolution_payment_count",
|
|
"relative_increment": "relative_increment_xero_host_resolution_payment_count",
|
|
"number_format": "integer",
|
|
"increment_sign_format": "negative",
|
|
},
|
|
{
|
|
"order_by": 100,
|
|
"metric": "Guest Journey Start Rate",
|
|
"value": "start_rate_guest_journey",
|
|
"previous_year_value": "previous_year_start_rate_guest_journey",
|
|
"relative_increment": "relative_increment_start_rate_guest_journey",
|
|
"number_format": "percentage",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 101,
|
|
"metric": "Guest Journey Completion Rate",
|
|
"value": "completion_rate_guest_journey",
|
|
"previous_year_value": "previous_year_completion_rate_guest_journey",
|
|
"relative_increment": "relative_increment_completion_rate_guest_journey",
|
|
"number_format": "percentage",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 102,
|
|
"metric": "Guest Journey Incompletion Rate",
|
|
"value": "incompletion_rate_guest_journey",
|
|
"previous_year_value": "previous_year_incompletion_rate_guest_journey",
|
|
"relative_increment": "relative_increment_incompletion_rate_guest_journey",
|
|
"number_format": "percentage",
|
|
"increment_sign_format": "negative",
|
|
},
|
|
{
|
|
"order_by": 103,
|
|
"metric": "Guest Journey Payment Rate",
|
|
"value": "payment_rate_guest_journey",
|
|
"previous_year_value": "previous_year_payment_rate_guest_journey",
|
|
"relative_increment": "relative_increment_payment_rate_guest_journey",
|
|
"number_format": "percentage",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 120,
|
|
"metric": "Revenue Churn Rate",
|
|
"value": "total_revenue_churn_average_contribution",
|
|
"previous_year_value": "previous_year_total_revenue_churn_average_contribution",
|
|
"relative_increment": "relative_increment_total_revenue_churn_average_contribution",
|
|
"number_format": "percentage",
|
|
"increment_sign_format": "negative",
|
|
},
|
|
{
|
|
"order_by": 121,
|
|
"metric": "Bookings Churn Rate",
|
|
"value": "created_bookings_churn_average_contribution",
|
|
"previous_year_value": "previous_year_created_bookings_churn_average_contribution",
|
|
"relative_increment": "relative_increment_created_bookings_churn_average_contribution",
|
|
"number_format": "percentage",
|
|
"increment_sign_format": "negative",
|
|
},
|
|
{
|
|
"order_by": 122,
|
|
"metric": "Listings Churn Rate",
|
|
"value": "listings_booked_in_month_churn_average_contribution",
|
|
"previous_year_value": "previous_year_listings_booked_in_month_churn_average_contribution",
|
|
"relative_increment": "relative_increment_listings_booked_in_month_churn_average_contribution",
|
|
"number_format": "percentage",
|
|
"increment_sign_format": "negative",
|
|
},
|
|
{
|
|
"order_by": 200,
|
|
"metric": "Total Revenue",
|
|
"value": "total_revenue_in_gbp",
|
|
"previous_year_value": "previous_year_total_revenue_in_gbp",
|
|
"relative_increment": "relative_increment_total_revenue_in_gbp",
|
|
"number_format": "currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 201,
|
|
"metric": "Revenue Retained",
|
|
"value": "revenue_retained_in_gbp",
|
|
"previous_year_value": "previous_year_revenue_retained_in_gbp",
|
|
"relative_increment": "relative_increment_revenue_retained_in_gbp",
|
|
"number_format": "currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 202,
|
|
"metric": "Revenue Retained Post Resolutions",
|
|
"value": "revenue_retained_post_resolutions_in_gbp",
|
|
"previous_year_value": "previous_year_revenue_retained_post_resolutions_in_gbp",
|
|
"relative_increment": "relative_increment_revenue_retained_post_resolutions_in_gbp",
|
|
"number_format": "currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 211,
|
|
"metric": "Total Revenue per Booking Created",
|
|
"value": "total_revenue_per_created_booking",
|
|
"previous_year_value": "previous_year_total_revenue_per_created_booking",
|
|
"relative_increment": "relative_increment_total_revenue_per_created_booking",
|
|
"number_format": "converted_metric_currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 212,
|
|
"metric": "Total Revenue per Guest Journey Created",
|
|
"value": "total_revenue_per_created_guest_journey",
|
|
"previous_year_value": "previous_year_total_revenue_per_created_guest_journey",
|
|
"relative_increment": "relative_increment_total_revenue_per_created_guest_journey",
|
|
"number_format": "converted_metric_currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 213,
|
|
"metric": "Total Revenue per Deals Booked in Month",
|
|
"value": "total_revenue_per_deals_booked_in_month",
|
|
"previous_year_value": "previous_year_total_revenue_per_deals_booked_in_month",
|
|
"relative_increment": "relative_increment_total_revenue_per_deals_booked_in_month",
|
|
"number_format": "converted_metric_currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 214,
|
|
"metric": "Total Revenue per Listings Booked in Month",
|
|
"value": "total_revenue_per_listings_booked_in_month",
|
|
"previous_year_value": "previous_year_total_revenue_per_listings_booked_in_month",
|
|
"relative_increment": "relative_increment_total_revenue_per_listings_booked_in_month",
|
|
"number_format": "converted_metric_currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 220,
|
|
"metric": "Invoiced Operator Revenue",
|
|
"value": "xero_operator_net_fees_in_gbp",
|
|
"previous_year_value": "previous_year_xero_operator_net_fees_in_gbp",
|
|
"relative_increment": "relative_increment_xero_operator_net_fees_in_gbp",
|
|
"number_format": "currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 225,
|
|
"metric": "Invoiced Booking Fees Revenue",
|
|
"value": "xero_booking_net_fees_in_gbp",
|
|
"previous_year_value": "previous_year_xero_booking_net_fees_in_gbp",
|
|
"relative_increment": "relative_increment_xero_booking_net_fees_in_gbp",
|
|
"number_format": "currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 226,
|
|
"metric": "Invoiced Listing Fees Revenue",
|
|
"value": "xero_listing_net_fees_in_gbp",
|
|
"previous_year_value": "previous_year_xero_listing_net_fees_in_gbp",
|
|
"relative_increment": "relative_increment_xero_listing_net_fees_in_gbp",
|
|
"number_format": "currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 227,
|
|
"metric": "Invoiced Verification Fees Revenue",
|
|
"value": "xero_verification_net_fees_in_gbp",
|
|
"previous_year_value": "previous_year_xero_verification_net_fees_in_gbp",
|
|
"relative_increment": "relative_increment_xero_verification_net_fees_in_gbp",
|
|
"number_format": "currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 230,
|
|
"metric": "Invoiced APIs Revenue",
|
|
"value": "xero_apis_net_fees_in_gbp",
|
|
"previous_year_value": "previous_year_xero_apis_net_fees_in_gbp",
|
|
"relative_increment": "relative_increment_xero_apis_net_fees_in_gbp",
|
|
"number_format": "currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 235,
|
|
"metric": "Invoiced Athena Revenue",
|
|
"value": "xero_guesty_net_fees_in_gbp",
|
|
"previous_year_value": "previous_year_xero_guesty_net_fees_in_gbp",
|
|
"relative_increment": "relative_increment_xero_guesty_net_fees_in_gbp",
|
|
"number_format": "currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 236,
|
|
"metric": "Invoiced E-Deposit Revenue",
|
|
"value": "xero_e_deposit_net_fees_in_gbp",
|
|
"previous_year_value": "previous_year_xero_e_deposit_net_fees_in_gbp",
|
|
"relative_increment": "relative_increment_xero_e_deposit_net_fees_in_gbp",
|
|
"number_format": "currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 250,
|
|
"metric": "Guest Revenue",
|
|
"value": "total_guest_payments_in_gbp",
|
|
"previous_year_value": "previous_year_total_guest_payments_in_gbp",
|
|
"relative_increment": "relative_increment_total_guest_payments_in_gbp",
|
|
"number_format": "currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 251,
|
|
"metric": "Guest Revenue per Guest Journey Completed",
|
|
"value": "guest_payments_per_completed_guest_journey",
|
|
"previous_year_value": "previous_year_guest_payments_per_completed_guest_journey",
|
|
"relative_increment": "relative_increment_guest_payments_per_completed_guest_journey",
|
|
"number_format": "converted_metric_currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 252,
|
|
"metric": "Guest Revenue per Guest Journey with Payment",
|
|
"value": "guest_payments_per_paid_guest_journey",
|
|
"previous_year_value": "previous_year_guest_payments_per_paid_guest_journey",
|
|
"relative_increment": "relative_increment_guest_payments_per_paid_guest_journey",
|
|
"number_format": "converted_metric_currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 260,
|
|
"metric": "Deposit Fees Revenue",
|
|
"value": "deposit_fees_in_gbp",
|
|
"previous_year_value": "previous_year_deposit_fees_in_gbp",
|
|
"relative_increment": "relative_increment_deposit_fees_in_gbp",
|
|
"number_format": "currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 262,
|
|
"metric": "Waiver Revenue",
|
|
"value": "waiver_payments_in_gbp",
|
|
"previous_year_value": "previous_year_waiver_payments_in_gbp",
|
|
"relative_increment": "relative_increment_waiver_payments_in_gbp",
|
|
"number_format": "currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 263,
|
|
"metric": "Damage Host-Waiver Payments",
|
|
"value": "xero_waiver_paid_back_to_host_in_gbp",
|
|
"previous_year_value": "previous_year_xero_waiver_paid_back_to_host_in_gbp",
|
|
"relative_increment": "relative_increment_xero_waiver_paid_back_to_host_in_gbp",
|
|
"number_format": "currency_gbp",
|
|
"increment_sign_format": "negative",
|
|
},
|
|
{
|
|
"order_by": 264,
|
|
"metric": "Waiver Retained",
|
|
"value": "waiver_net_fees_in_gbp",
|
|
"previous_year_value": "previous_year_waiver_net_fees_in_gbp",
|
|
"relative_increment": "relative_increment_waiver_net_fees_in_gbp",
|
|
"number_format": "currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 265,
|
|
"metric": "Check-In Hero Revenue",
|
|
"value": "checkin_cover_fees_in_gbp",
|
|
"previous_year_value": "previous_year_checkin_cover_fees_in_gbp",
|
|
"relative_increment": "relative_increment_checkin_cover_fees_in_gbp",
|
|
"number_format": "currency_gbp",
|
|
"increment_sign_format": "positive",
|
|
},
|
|
{
|
|
"order_by": 270,
|
|
"metric": "Host Resolutions Amount Paid",
|
|
"value": "xero_host_resolution_amount_paid_in_gbp",
|
|
"previous_year_value": "previous_year_xero_host_resolution_amount_paid_in_gbp",
|
|
"relative_increment": "relative_increment_xero_host_resolution_amount_paid_in_gbp",
|
|
"number_format": "currency_gbp",
|
|
"increment_sign_format": "negative",
|
|
},
|
|
] %}
|
|
with
|
|
int_mtd_vs_previous_year_metrics as (
|
|
select * from {{ ref("int_mtd_vs_previous_year_metrics") }}
|
|
)
|
|
{% for metric in metrics %}
|
|
select
|
|
year,
|
|
month,
|
|
day,
|
|
is_end_of_month,
|
|
is_current_month,
|
|
is_end_of_month_or_yesterday,
|
|
first_day_month,
|
|
date,
|
|
dimension,
|
|
dimension_value,
|
|
previous_year_date,
|
|
{{ metric.order_by }} as order_by,
|
|
-- quotation marks added because text format
|
|
'{{ metric.number_format }}' as number_format,
|
|
'{{ metric.metric }}' as metric,
|
|
{{ metric.value }} as value,
|
|
{{ metric.previous_year_value }} as previous_year_value,
|
|
{{ metric.relative_increment }} as relative_increment,
|
|
case
|
|
when '{{ metric.increment_sign_format }}' = 'negative'
|
|
then {{ metric.relative_increment }} * -1
|
|
else {{ metric.relative_increment }}
|
|
end as relative_increment_with_sign_format
|
|
from int_mtd_vs_previous_year_metrics
|
|
{% if not loop.last %}
|
|
union all
|
|
{% endif %}
|
|
{% endfor %}
|