dbt
Saas ecosystem
Conversion Funnel
Conversion Funnel model for saas ecosystem.
inferred
Blocks
conversion_funnel.sql · 59 lines
inferred
-- models/conversion_funnel.sql
{{ config(materialized='view') }}
WITH dates AS (
SELECT id FROM date_dim
),
entrances AS (
SELECT sum(entrances), date_id
FROM entrance_fact
GROUP BY date_id
),
actions AS (
SELECT count(DISTINCT user_id), date_id
FROM system_action_fact
JOIN system_action_dim ON system_action_fact.system_action_id = system_action_dim.id
JOIN user_dim ON system_action_fact.user_id = user_dim.id
WHERE system_action = 'user_account_created'
AND user_dim.account_type = 'end_user'
GROUP BY date_id
),
logins AS (
WITH new_accounts AS (
SELECT user_id, date_id
FROM system_action_fact
JOIN system_action_dim ON system_action_fact.system_action_id = system_action_dim.id
WHERE system_action = 'user_account_created'
)
SELECT COUNT(DISTINCT session_duration_new.user_id), new_accounts.date_id
FROM session_duration_scratch_table AS session_duration_new
JOIN user_dim ON session_duration_new.user_id = user_dim.id
JOIN new_accounts ON session_duration_new.user_id = new_accounts.user_id
WHERE user_dim.account_type = 'end_user' AND session_duration_new.sequence_number = 1
GROUP BY new_accounts.date_id
),
content_sessions AS (
SELECT COUNT(DISTINCT content_session_dim_new.username), created_date_id date_id
FROM content_session_scratch_table AS content_session_dim_new
JOIN user_dim ON content_session_dim_new.username = user_dim.username
WHERE user_dim.account_type = 'end_user' AND content_session_dim_new.sequence_number = 1
GROUP BY created_date_id
)
SELECT dates.id, entrances.sum page_views, actions.count accounts_created, logins.count sessions_created, content_sessions.count content_sessions_created FROM dates
LEFT OUTER JOIN entrances ON entrances.date_id = dates.id
LEFT OUTER JOIN actions ON actions.date_id = dates.id
LEFT OUTER JOIN logins ON logins.date_id = dates.id
LEFT OUTER JOIN content_sessions ON content_sessions.date_id = dates.id
ORDER BY dates.id ASC
# models/schema.yml
version: 2
models:
- name: conversion_funnel
columns:
- name: id
- name: page_views
- name: accounts_created
- name: sessions_created
- name: content_sessions_created
Assumptions
- materialized='view' is the default; no persist hint found.
- schema.yml columns come from view dimensions; a primary_key dimension gets unique + not_null tests.
conversion_funnel.sql · 44 lines
source-preserved
validation: parses
WITH dates AS (
SELECT id FROM date_dim
),
entrances AS (
SELECT sum(entrances), date_id
FROM entrance_fact
GROUP BY date_id
),
actions AS (
SELECT count(DISTINCT user_id), date_id
FROM system_action_fact
JOIN system_action_dim ON system_action_fact.system_action_id = system_action_dim.id
JOIN user_dim ON system_action_fact.user_id = user_dim.id
WHERE system_action = 'user_account_created'
AND user_dim.account_type = 'end_user'
GROUP BY date_id
),
logins AS (
WITH new_accounts AS (
SELECT user_id, date_id
FROM system_action_fact
JOIN system_action_dim ON system_action_fact.system_action_id = system_action_dim.id
WHERE system_action = 'user_account_created'
)
SELECT COUNT(DISTINCT session_duration_new.user_id), new_accounts.date_id
FROM session_duration_scratch_table AS session_duration_new
JOIN user_dim ON session_duration_new.user_id = user_dim.id
JOIN new_accounts ON session_duration_new.user_id = new_accounts.user_id
WHERE user_dim.account_type = 'end_user' AND session_duration_new.sequence_number = 1
GROUP BY new_accounts.date_id
),
content_sessions AS (
SELECT COUNT(DISTINCT content_session_dim_new.username), created_date_id date_id
FROM content_session_scratch_table AS content_session_dim_new
JOIN user_dim ON content_session_dim_new.username = user_dim.username
WHERE user_dim.account_type = 'end_user' AND content_session_dim_new.sequence_number = 1
GROUP BY created_date_id
)
SELECT dates.id, entrances.sum page_views, actions.count accounts_created, logins.count sessions_created, content_sessions.count content_sessions_created FROM dates
LEFT OUTER JOIN entrances ON entrances.date_id = dates.id
LEFT OUTER JOIN actions ON actions.date_id = dates.id
LEFT OUTER JOIN logins ON logins.date_id = dates.id
LEFT OUTER JOIN content_sessions ON content_sessions.date_id = dates.id
ORDER BY dates.id ASC
conversion_funnel.view.lkml · 104 lines
inferred
view: conversion_funnel {
derived_table: {
sql: WITH dates AS (
SELECT id FROM date_dim
),
entrances AS (
SELECT sum(entrances), date_id
FROM entrance_fact
GROUP BY date_id
),
actions AS (
SELECT count(DISTINCT user_id), date_id
FROM system_action_fact
JOIN system_action_dim ON system_action_fact.system_action_id = system_action_dim.id
JOIN user_dim ON system_action_fact.user_id = user_dim.id
WHERE system_action = 'user_account_created'
AND user_dim.account_type = 'end_user'
GROUP BY date_id
),
logins AS (
WITH new_accounts AS (
SELECT user_id, date_id
FROM system_action_fact
JOIN system_action_dim ON system_action_fact.system_action_id = system_action_dim.id
WHERE system_action = 'user_account_created'
)
SELECT COUNT(DISTINCT session_duration_new.user_id), new_accounts.date_id
FROM session_duration_scratch_table AS session_duration_new
JOIN user_dim ON session_duration_new.user_id = user_dim.id
JOIN new_accounts ON session_duration_new.user_id = new_accounts.user_id
WHERE user_dim.account_type = 'end_user' AND session_duration_new.sequence_number = 1
GROUP BY new_accounts.date_id
),
content_sessions AS (
SELECT COUNT(DISTINCT content_session_dim_new.username), created_date_id date_id
FROM content_session_scratch_table AS content_session_dim_new
JOIN user_dim ON content_session_dim_new.username = user_dim.username
WHERE user_dim.account_type = 'end_user' AND content_session_dim_new.sequence_number = 1
GROUP BY created_date_id
)
SELECT dates.id, entrances.sum page_views, actions.count accounts_created, logins.count sessions_created, content_sessions.count content_sessions_created FROM dates
LEFT OUTER JOIN entrances ON entrances.date_id = dates.id
LEFT OUTER JOIN actions ON actions.date_id = dates.id
LEFT OUTER JOIN logins ON logins.date_id = dates.id
LEFT OUTER JOIN content_sessions ON content_sessions.date_id = dates.id
ORDER BY dates.id ASC ;;
}
dimension: id {
type: int
hidden: yes
sql: ${TABLE}.id ;;
}
dimension: page_views {
type: int
hidden: yes
sql: ${TABLE}.page_views ;;
}
dimension: accounts_created {
type: int
hidden: yes
sql: ${TABLE}.accounts_created ;;
}
dimension: sessions_created {
type: int
hidden: yes
sql: ${TABLE}.sessions_created ;;
}
dimension: content_sessions_created {
type: int
hidden: yes
sql: ${TABLE}.content_sessions_created ;;
}
dimension_group: funnel {
type: time
timeframes: [date, week, month, month_num, day_of_week, day_of_week_index, week_of_year, day_of_month]
sql: (SUBSTRING(${id}, 1, 4) || '-' || SUBSTRING(${id}, 5, 2) || '-' || SUBSTRING(${id}, 7, 2)|| ' ' || '00:00')::timestamp ;;
}
measure: page_view_sum {
type: sum
sql: ${page_views} ;;
}
measure: accounts_created_sum {
type: sum
sql: ${accounts_created} ;;
}
measure: sessions_created_sum {
type: sum
sql: ${sessions_created} ;;
}
measure: content_sessions_created_sum {
type: sum
sql: ${content_sessions_created} ;;
}
}
conversion_funnel.view.lookml · 91 lines
source-preserved
- view: conversion_funnel
derived_table:
sql: WITH dates AS (
SELECT id FROM date_dim
),
entrances AS (
SELECT sum(entrances), date_id
FROM entrance_fact
GROUP BY date_id
),
actions AS (
SELECT count(DISTINCT user_id), date_id
FROM system_action_fact
JOIN system_action_dim ON system_action_fact.system_action_id = system_action_dim.id
JOIN user_dim ON system_action_fact.user_id = user_dim.id
WHERE system_action = 'user_account_created'
AND user_dim.account_type = 'end_user'
GROUP BY date_id
),
logins AS (
WITH new_accounts AS (
SELECT user_id, date_id
FROM system_action_fact
JOIN system_action_dim ON system_action_fact.system_action_id = system_action_dim.id
WHERE system_action = 'user_account_created'
)
SELECT COUNT(DISTINCT session_duration_new.user_id), new_accounts.date_id
FROM session_duration_scratch_table AS session_duration_new
JOIN user_dim ON session_duration_new.user_id = user_dim.id
JOIN new_accounts ON session_duration_new.user_id = new_accounts.user_id
WHERE user_dim.account_type = 'end_user' AND session_duration_new.sequence_number = 1
GROUP BY new_accounts.date_id
),
content_sessions AS (
SELECT COUNT(DISTINCT content_session_dim_new.username), created_date_id date_id
FROM content_session_scratch_table AS content_session_dim_new
JOIN user_dim ON content_session_dim_new.username = user_dim.username
WHERE user_dim.account_type = 'end_user' AND content_session_dim_new.sequence_number = 1
GROUP BY created_date_id
)
SELECT dates.id, entrances.sum page_views, actions.count accounts_created, logins.count sessions_created, content_sessions.count content_sessions_created FROM dates
LEFT OUTER JOIN entrances ON entrances.date_id = dates.id
LEFT OUTER JOIN actions ON actions.date_id = dates.id
LEFT OUTER JOIN logins ON logins.date_id = dates.id
LEFT OUTER JOIN content_sessions ON content_sessions.date_id = dates.id
ORDER BY dates.id ASC
fields:
- dimension: id
type: int
hidden: true
sql: ${TABLE}.id
- dimension: page_views
type: int
hidden: true
sql: ${TABLE}.page_views
- dimension: accounts_created
type: int
hidden: true
sql: ${TABLE}.accounts_created
- dimension: sessions_created
type: int
hidden: true
sql: ${TABLE}.sessions_created
- dimension: content_sessions_created
type: int
hidden: true
sql: ${TABLE}.content_sessions_created
- dimension_group: funnel
type: time
timeframes:
- date
- week
- month
- month_num
- day_of_week
- day_of_week_index
- week_of_year
- day_of_month
sql: (SUBSTRING(${id}, 1, 4) || '-' || SUBSTRING(${id}, 5, 2) || '-' || SUBSTRING(${id}, 7, 2)|| ' ' || '00:00')::timestamp
- measure: page_view_sum
type: sum
sql: ${page_views}
- measure: accounts_created_sum
type: sum
sql: ${accounts_created}
- measure: sessions_created_sum
type: sum
sql: ${sessions_created}
- measure: content_sessions_created_sum
type: sum
sql: ${content_sessions_created}
Contents
- conversion_funnel.sql
- conversion_funnel.sql
- conversion_funnel.view.lkml
- conversion_funnel.view.lookml