dating_platform/membership_activity.view.lookml 4 dims4 measures 3 warnings Repo files

LookML view · dating-platform

The churn view: leads, upgrades, downgrades and renewals per day in one UNION

At a glance

Does
Unions four counts per site, source and calendar day: new users as leads, downgrades, upgrades and renewals. Exposes day, month, site, source and four sums.Trust: Source-defined
Why
A subscription movement report. The enterprise model labels its explore Churn Report, for tracking upgrades against downgrades by acquisition source.Trust: Inferred
Grain
One row per site, source and calendar day after the outer GROUP BY. No primary key is declared.Trust: Source-defined
Source
dating_platform/membership_activity.view.lookml 115 lines
Source: membership_activity.view.lookml L1-10
dating_platform/membership_activity.view.lookmlL1-10
- view: churn  derived_table:    sql: |      SELECT  site, source, calendar_date,              SUM(upgrades) AS upgrades,              SUM(downgrades) AS downgrades,              SUM(leads) AS leads,              SUM(renewals) AS renewals      FROM  (        SELECT  U.site,                 U.source,                 TRUNC(U.created_at) AS calendar_date,                 COUNT(1) AS leads,

dating-platform, membership_activity.view.lookml, lines 1-10

Shape

Trust: Source-defined

Every field as declared, with the dashboard tiles that read it. Computed from the source; nothing here is edited.

Derived table: persists for 1 hour. Reads warehouse tables directly.

Dimensions 4

NameTypeSQLUsed byTags
dayL73date${TABLE}.calendar_date-
monthL76date_month${TABLE}.calendar_date-
siteL79string${TABLE}.site-
sourceL81string${TABLE}.source-

Measures 4

NameTypeSQLUsed byTags
leadsL83sum${TABLE}.leads-
downgradesL87sum${TABLE}.downgrades-
renewalsL91sum${TABLE}.renewals-
upgradesL95sum${TABLE}.upgrades-

Relationships

Trust: Source-defined

No joins, no upstream views and no dashboard tiles reference this view. It is an island in the model.

Relationships of churn
Relationships of churn. Text version follows the diagram.This viewUsed by: explores, views, dashboardsbase view churn explore in enterprise
  • This Block
Text version
  • churn is the base view of churn: base view

Filters and exclusions that change meaning

A downgrade is an auto-renew-off subscription past its renewal date

Trust: Source-defined

The downgrade branch counts subscriptions with auto_renew = false and next_renewal_on before today, dated on the renewal day. Cancellations with time left are not counted yet.

Source: membership_activity.view.lookml L22-38
dating_platform/membership_activity.view.lookmlL22-38
                 U.source,                 trunc(U.created_at)        UNION ALL        SELECT    U.site,                  U.source,                  TRUNC(S.next_renewal_on) AS calendar_date,                  0,                  COUNT(1) AS downgrades,                  0,                  0 AS renewals        FROM  subscriptions S              JOIN users U ON S.user_id = U.id              JOIN user_transactions T              ON  S.user_id = T.user_id                  AND T.type = 'upgrade'        WHERE S.auto_renew = false              AND S.next_renewal_on < GETDATE()        GROUP BY U.site,                 U.source,                 trunc(S.next_renewal_on)        UNION ALL        SELECT  U.site,                U.source,

dating-platform, membership_activity.view.lookml, lines 22-38

Worth noticing

Each event type has its own date

Trust: Source-defined

Leads use the user created_at, upgrades and renewals use the transaction created_at, and downgrades use next_renewal_on. One day mixes three clocks.

Source: membership_activity.view.lookml L9-27
dating_platform/membership_activity.view.lookmlL9-27
              SUM(downgrades) AS downgrades,              SUM(leads) AS leads,              SUM(renewals) AS renewals      FROM  (        SELECT  U.site,                 U.source,                 TRUNC(U.created_at) AS calendar_date,                 COUNT(1) AS leads,                 0 AS downgrades,                 0 AS upgrades,                 0 AS renewals          FROM  users U          GROUP BY U.site,                 U.source,                 trunc(U.created_at)        UNION ALL        SELECT    U.site,                  U.source,                  TRUNC(S.next_renewal_on) AS calendar_date,                  0,                  COUNT(1) AS downgrades,                  0,                  0 AS renewals        FROM  subscriptions S              JOIN users U ON S.user_id = U.id

dating-platform, membership_activity.view.lookml, lines 9-27

Sets copied from a transactions view

Trust: Source-defined

The detail and users sets list amount, gross_revenue, credit_card_type and other fields that churn does not declare.

Source: membership_activity.view.lookml L99-115
dating_platform/membership_activity.view.lookmlL99-115
    type: sum    sql: ${TABLE}.upgrades    detail: detail*  sets:    detail:    - id    - users.id    - amount    - transaction_type    users:    - id    - transaction_type    - type    - payment_type    - gross_revenue    - amount    - net_revenue    - refunds    - user_id    - credit_card_type

dating-platform, membership_activity.view.lookml, lines 99-115

What can change the answer 3

Blocker: Downgrades multiply by upgrade transactions

Trust: Source-defined

The downgrade branch joins user_transactions on user_id with T.type = 'upgrade'. A user with three upgrade transactions adds three downgrades for one subscription.

What goes wrong: downgrades overstates churn for the most engaged upgraders, and net movement looks worse than it is.

Read the guide: Join fanout

Source: membership_activity.view.lookml L22-38
dating_platform/membership_activity.view.lookmlL22-38
                 U.source,                 trunc(U.created_at)        UNION ALL        SELECT    U.site,                  U.source,                  TRUNC(S.next_renewal_on) AS calendar_date,                  0,                  COUNT(1) AS downgrades,                  0,                  0 AS renewals        FROM  subscriptions S              JOIN users U ON S.user_id = U.id              JOIN user_transactions T              ON  S.user_id = T.user_id                  AND T.type = 'upgrade'        WHERE S.auto_renew = false              AND S.next_renewal_on < GETDATE()        GROUP BY U.site,                 U.source,                 trunc(S.next_renewal_on)        UNION ALL        SELECT  U.site,                U.source,

dating-platform, membership_activity.view.lookml, lines 22-38

Caution: No churn rate is defined

Trust: Source-defined

The explore is labelled Churn Report, but the view only sums counts. Any rate has to be built by hand, and the source defines no denominator.

What goes wrong: Two analysts can publish different churn rates from the same explore.

Source: membership_activity.view.lookml L83-98
dating_platform/membership_activity.view.lookmlL83-98
    sql: ${TABLE}.site  - dimension: source    sql: ${TABLE}.source  - measure: leads    type: sum    sql: ${TABLE}.leads    detail: detail*  - measure: downgrades    type: sum    sql: ${TABLE}.downgrades    detail: detail*  - measure: renewals    type: sum    sql: ${TABLE}.renewals    detail: detail*  - measure: upgrades    type: sum    sql: ${TABLE}.upgrades    detail: detail*  sets:    detail:    - id

dating-platform, membership_activity.view.lookml, lines 83-98

Note: Reads tables, not views

Trust: Source-defined

The derived table selects from users, subscriptions and user_transactions directly. users and user_transactions are referenced as LookML views elsewhere but are not in the repo.

Read the guide: Missing tables and stale references

Source: membership_activity.view.lookml L29-33
dating_platform/membership_activity.view.lookmlL29-33
                  COUNT(1) AS downgrades,                  0,                  0 AS renewals        FROM  subscriptions S              JOIN users U ON S.user_id = U.id              JOIN user_transactions T              ON  S.user_id = T.user_id                  AND T.type = 'upgrade'        WHERE S.auto_renew = false              AND S.next_renewal_on < GETDATE()        GROUP BY U.site,

dating-platform, membership_activity.view.lookml, lines 29-33

Parser checks 14

Trust: Source-defined

Mechanical findings from parsing the LookML. They are facts about the files. The cards above explain which ones matter.

Show all 14 checks
  • no-primary-key 1
    • membership_activity.view.lookml:1 churn declares no primary_key.
  • set-member-missing 13
    • 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.

Related

Guides built on this file

Related source files

Source model