Inside a dating platform LookML project: sessions, revenue, subscriptions and messaging
A larger project with two halves. The event_tracker model wires Snowplow-style web events into sessions, visitors and transactions. The enterprise model covers product data: messages, date proposals, subscriptions, churn, scores and experiments. Seven views it depends on, including users, are not in the repo. Trust: Source-defined
SQL on these pages is Redshift. Inferred from :: casts, BTRIM and GETDATE in the source. Trust: Inferred
Each lane is an explore: base view left, joins right with their keys. 7 referenced views are not in the repo and are drawn dashed. Lane headings name the dashboards that query them.
Explores, joins and dashboards in dating-platform
No relationship declared
Not in the repo
Text version
churn (enterprise | "Churn Report"): churn
transactions (enterprise | read by business_overview (4 tiles), read by conversion_rate_dashboard (2 tiles)): transactions (not in repo), users (not in repo), subscriptions, user_score
messages (enterprise | always_filter | read by maps_dashboard (1 tile)): messages, sender (users) (not in repo), recipient (users) (not in repo)
propositions (enterprise | conditionally_filter): propositions, users (not in repo), messages
date_ideas (enterprise): date_ideas, propositions
tests (enterprise | "Test Metrics"): user_metrics (not in repo), user_experiment_buckets, tests (experiments), user_tenure_metrics, users (not in repo), user_score, messages
○deals.view.lookmlInventory only. Declares offersDeclares offers: id, title, price, non_member_price and quantity. It is only reached through the bookings explore, so it is covered on the bookings page.
○partners.model.lookmlInventory onlyOne explore, bookings, with joins to users and offers. Its graph and its join_type misuse are shown on the bookings page and the repo map.
users, user_metrics, user_transactions and four session building blocks are referenced but never declared. Three explores and most dashboard tiles depend on them.
What goes wrong: Explores like transactions and tests cannot be validated from this repo, and the business dashboards cannot run as written.
All 20 joins in this repo rely on Looker's default many_to_one. Several are one-to-many in practice, such as messages per proposition and tenure rows per user.
What goes wrong: Measures on the base view can be multiplied by the join without any warning in the explore.
transactions is an explore in both enterprise (over the missing user_transactions) and event_tracker (over web ecommerce events). Dashboards are included by both models.
activities.view.lookml declares events, guests.view.lookml declares visitors, and user_sessions.view.lookml declares two views. Search by view name, not file name.
Mechanical findings from parsing the LookML. They are facts about the files. The cards above explain which ones matter.
Show all 88 checks
name-collision4
activities.view.lookml:64 events.timestamp is declared as both dimension and dimension_group.
guests.view.lookml:43 visitors.first_touch is declared as both dimension and dimension_group.
proposal_templates.view.lookml:43 proposition_templates.featured is declared as both dimension and dimension_group.
user_sessions.view.lookml:122 sessions.start is declared as both dimension and dimension_group.
set-missing2
activities.view.lookml:214 events.sessions_count drills into set "detail", which is not declared.
guests.view.lookml:162 visitors.sessions_count drills into set "details", which is not declared.
set-member-missing21
activities.view.lookml:296 Set events.visit_detail lists "domain_session_index", which is not a field or set in this view.
activities.view.lookml:322 Set events.transaction_detail lists "domain_session_index", which is not a field or set in this view.
event_transactions.view.lookml:69 Set transactions.transaction_detail lists "domain_userid", which is not a field or set in this view.
event_transactions.view.lookml:69 Set transactions.transaction_detail lists "domain_sessionidx", which is not a field or set in this view.
guests.view.lookml:239 Set visitors.individual_detail lists "referer_host", which is not a field or set in this view.
guests.view.lookml:239 Set visitors.individual_detail lists "number_of_events", which is not a field or set in this view.
membership_activity.view.lookml:100 Set churn.detail lists "id", which is not a field or set in this view.
membership_activity.view.lookml:100 Set churn.detail lists "amount", which is not a field or set in this view.
membership_activity.view.lookml:100 Set churn.detail lists "transaction_type", which is not a field or set in this view.
membership_activity.view.lookml:105 Set churn.users lists "id", which is not a field or set in this view.
membership_activity.view.lookml:105 Set churn.users lists "transaction_type", which is not a field or set in this view.
membership_activity.view.lookml:105 Set churn.users lists "type", which is not a field or set in this view.
membership_activity.view.lookml:105 Set churn.users lists "payment_type", which is not a field or set in this view.
membership_activity.view.lookml:105 Set churn.users lists "gross_revenue", which is not a field or set in this view.
membership_activity.view.lookml:105 Set churn.users lists "amount", which is not a field or set in this view.
membership_activity.view.lookml:105 Set churn.users lists "net_revenue", which is not a field or set in this view.
membership_activity.view.lookml:105 Set churn.users lists "refunds", which is not a field or set in this view.
membership_activity.view.lookml:105 Set churn.users lists "user_id", which is not a field or set in this view.
membership_activity.view.lookml:105 Set churn.users lists "credit_card_type", which is not a field or set in this view.
user_sessions.view.lookml:431 Set sessions.detail lists "sessions_from_returning_visitors_count", which is not a field or set in this view.
user_sessions.view.lookml:431 Set sessions.detail lists "zipe_code_count", which is not a field or set in this view.
missing-view20
company_overview.dashboard.lookml:10 Tile total_revenue reads transactions.total_revenue, transactions.created_date from user_transactions, which is not in the repo.
company_overview.dashboard.lookml:21 Tile transactions reads transactions.count, transactions.created_date from user_transactions, which is not in the repo.
company_overview.dashboard.lookml:32 Tile transactions_by_type reads transactions.created_month, transactions.count, transactions.type, transactions.created_date from user_transactions, which is not in the repo.
company_overview.dashboard.lookml:116 Tile revenue_by_type reads transactions.created_month, transactions.total_revenue, transactions.type, transactions.created_date from user_transactions, which is not in the repo.
conversion_metrics.dashboard.lookml:21 Tile daily_revenue reads transactions.created_date, transactions.gross_revenue from user_transactions, which is not in the repo.
conversion_metrics.dashboard.lookml:21 Tile daily_revenue reads users.orientation from users, which is not in the repo.
conversion_metrics.dashboard.lookml:83 Tile revenue_by_month reads transactions.created_month, transactions.net_revenue from user_transactions, which is not in the repo.
enterprise.model.lookml:8 Explore transactions is based on user_transactions, which is not in the repo.
enterprise.model.lookml:12 Join transactions.users targets users, which is not in the repo.
enterprise.model.lookml:28 Join messages.sender targets users, which is not in the repo.
enterprise.model.lookml:32 Join messages.recipient targets users, which is not in the repo.
enterprise.model.lookml:43 Join propositions.users targets users, which is not in the repo.
enterprise.model.lookml:55 Explore tests is based on user_metrics, which is not in the repo.
enterprise.model.lookml:68 Join tests.users targets users, which is not in the repo.
geographics.dashboard.lookml:35 Tile map reads sender.zipcode from users, which is not in the repo.
partners.model.lookml:8 Join bookings.users targets users, which is not in the repo.
user_sessions.view.lookml:15 sessions builds on ${sessions_basic.SQL_TABLE_NAME}; no view named sessions_basic is in the repo.
user_sessions.view.lookml:15 sessions builds on ${sessions_geo.SQL_TABLE_NAME}; no view named sessions_geo is in the repo.
user_sessions.view.lookml:15 sessions builds on ${sessions_last_page.SQL_TABLE_NAME}; no view named sessions_last_page is in the repo.
user_sessions.view.lookml:15 sessions builds on ${sessions_technology.SQL_TABLE_NAME}; no view named sessions_technology is in the repo.
missing-explore6
company_overview.dashboard.lookml:62 Tile users_map queries explore users, which no model in the repo declares.
company_overview.dashboard.lookml:74 Tile users_by_orientation queries explore users, which no model in the repo declares.
company_overview.dashboard.lookml:90 Tile average_lifetime_value queries explore users, which no model in the repo declares.
conversion_metrics.dashboard.lookml:53 Tile gap_revenue queries explore transaction_ledger, which no model in the repo declares.
geographics.dashboard.lookml:16 Tile map queries explore users, which no model in the repo declares.
geographics.dashboard.lookml:52 Tile another_map queries explore users, which no model in the repo declares.
missing-field1
conversion_metrics.dashboard.lookml:21 Tile daily_revenue reads acquisition.channel; explore transactions has no view or join named acquisition.
duplicate-explore2
enterprise.model.lookml:8 Explore transactions is declared in 2 models (enterprise, event_tracker).
event_tracker.model.lookml:18 Explore transactions is declared in 2 models (enterprise, event_tracker).
no-relationship20
enterprise.model.lookml:12 Join transactions.users declares no relationship.
enterprise.model.lookml:14 Join transactions.subscriptions declares no relationship.
enterprise.model.lookml:17 Join transactions.user_score declares no relationship.
enterprise.model.lookml:28 Join messages.sender declares no relationship.
enterprise.model.lookml:32 Join messages.recipient declares no relationship.
enterprise.model.lookml:43 Join propositions.users declares no relationship.
enterprise.model.lookml:46 Join propositions.messages declares no relationship.
enterprise.model.lookml:53 Join date_ideas.propositions declares no relationship.
enterprise.model.lookml:59 Join tests.user_experiment_buckets declares no relationship.
enterprise.model.lookml:62 Join tests.tests declares no relationship.
enterprise.model.lookml:65 Join tests.user_tenure_metrics declares no relationship.
enterprise.model.lookml:68 Join tests.users declares no relationship.
enterprise.model.lookml:72 Join tests.user_score declares no relationship.
enterprise.model.lookml:75 Join tests.messages declares no relationship.
event_tracker.model.lookml:7 Join events.sessions declares no relationship.
event_tracker.model.lookml:11 Join events.visitors declares no relationship.
event_tracker.model.lookml:15 Join sessions.visitors declares no relationship.
event_tracker.model.lookml:21 Join transaction_items.transactions declares no relationship.
partners.model.lookml:8 Join bookings.users declares no relationship.
partners.model.lookml:10 Join bookings.offers declares no relationship.
duplicate-tile1
geographics.dashboard.lookml:35 Tile name "map" is used more than once in maps_dashboard.
no-primary-key6
guests.view.lookml:1 visitors declares no primary_key.
membership_activity.view.lookml:1 churn declares no primary_key.
participant_groups.view.lookml:1 user_experiment_buckets declares no primary_key.
purchase_items.view.lookml:1 transaction_items declares no primary_key.
user_sessions.view.lookml:1 session_apps declares no primary_key.
user_sessions.view.lookml:13 sessions declares no primary_key.
time-dimension1
guests.view.lookml:51 visitors.last_touch uses type: time on a dimension instead of a dimension_group.
unknown-param1
guests.view.lookml:145 visitors.bounced_visitor_count uses "filter:" (singular), which is not the measure filters parameter.
dotted-name1
participant_groups.view.lookml:4 user_experiment_buckets declares a field named "users.bucket" with a dot in it.
relationship-in-join-type1
partners.model.lookml:10 Join bookings.offers puts "one_to_one" in join_type, where a join type such as left_outer belongs.
dimension-uses-measure1
proposals.view.lookml:146 Dimension propositions.response_rate references a measure.