# Generated from the GASP Standard (https://gaspwiki.com) by `npm run derive` in gasp-wiki-mcp. Do not edit; edit /standard/ and re-run.
version: 0.2.0.dev0
name: GASP reference model
description: "GASP Standard reference model: the canonical SaaS datasets, their joins and every computable GASP metric. Sources and columns use the canonical names; an adopter's mapping replaces them. https://gaspwiki.com"
datasets:
  - name: revenue_event
    source: gasp.revenue_event
    description: "Revenue event. Kind: event. CEL class: Revenue_Event."
    primary_key:
      - event_id
    fields:
      - name: change_nature
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: change_nature
        description: permanent, temporary or scheduled_reversal (Adjusted NRR/GRR)
        datatype: String
        ai_context:
          instructions: One of permanent, temporary, scheduled_reversal
      - name: currency
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: currency
        description: ISO 4217 currency code
        datatype: String
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: event_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: event_date
        dimension:
          is_time: true
        description: Date the event occurred
        datatype: Date
      - name: event_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: event_id
        description: Unique, immutable event identifier
        datatype: String
      - name: event_type
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: event_type
        description: Revenue movement classifier (CEL Revenue_Event.event_type)
        datatype: String
        ai_context:
          instructions: One of new, expansion, contraction, churn, reactivation, renewal
      - name: expansion_classification
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: expansion_classification
        description: ATL expansion tag; required for NRR-M and ARR-M
        datatype: String
        ai_context:
          instructions: One of same_product, new_module, new_buying_centre, pricing_adjustment, recontracting, usage_realisation
      - name: lifecycle_attribution
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: lifecycle_attribution
        description: ATL lifecycle tag
        datatype: String
        ai_context:
          instructions: One of acquisition, activation, retention, expansion, reactivation, servicing
      - name: mrr_change
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: mrr_change
        description: Change in MRR; negative for contraction and churn
        datatype: Decimal
      - name: new_mrr
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: new_mrr
        description: MRR after the event
        datatype: Decimal
      - name: prior_mrr
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: prior_mrr
        description: MRR before the event
        datatype: Decimal
      - name: segment
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: segment
        description: Customer segment (SMB, Mid-Market, Enterprise or the organisation's own scheme) at the time of the event or snapshot. The field behind the Segment concept; carried on revenue tables so retention and movement metrics slice by it without a join.
        datatype: String
      - name: subscription_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: subscription_id
        description: Subscription identifier
        datatype: String
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"event","cel":"Revenue_Event"}'
  - name: cost_event
    source: gasp.cost_event
    description: "Cost event. Kind: event. CEL class: Cost_Event."
    primary_key:
      - event_id
    fields:
      - name: cost
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: cost
        description: Cost amount (CEL Cost_Event.amount)
        datatype: Decimal
      - name: cost_centre
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: cost_centre
        description: Department or team that incurred the cost
        datatype: String
        ai_context:
          instructions: One of marketing, sales, customer_success, support, engineering, product, finance, people, services, partnerships, general
      - name: cost_function
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: cost_function
        description: Purpose of cost (ATL cost function, extended to all cost events)
        datatype: String
        ai_context:
          instructions: One of gtm, implementation, onboarding, infrastructure, support, success_engineering, account_management, research_development, general_administrative, services_delivery, recruiting, partner_program, partner_commission
      - name: cost_type
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: cost_type
        description: Nature of cost (CEL)
        datatype: String
        ai_context:
          instructions: One of personnel, software, services, infrastructure, other
      - name: currency
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: currency
        description: ISO 4217 currency code
        datatype: String
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: event_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: event_date
        dimension:
          is_time: true
        description: Date the event occurred
        datatype: Date
      - name: event_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: event_id
        description: Unique, immutable event identifier
        datatype: String
      - name: lifecycle_attribution
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: lifecycle_attribution
        description: ATL lifecycle tag
        datatype: String
        ai_context:
          instructions: One of acquisition, activation, retention, expansion, reactivation, servicing
      - name: partner_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: partner_id
        description: Partner identifier
        datatype: String
      - name: project_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: project_id
        description: Services project identifier; null on costs not attributable to a project
        datatype: String
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"event","cel":"Cost_Event"}'
  - name: contract_event
    source: gasp.contract_event
    description: "Contract event. Kind: event. CEL class: Contract_Event."
    primary_key:
      - event_id
    fields:
      - name: acv
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: acv
        description: Annual contract value, recurring only
        datatype: Decimal
      - name: contract_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: contract_end
        description: Contract end date
        datatype: Date
      - name: contract_event_type
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: contract_event_type
        description: Contract milestone (CEL Contract_Event.event_type)
        datatype: String
        ai_context:
          instructions: One of new_contract, renewal, amendment, cancellation
      - name: contract_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: contract_start
        description: Contract start date
        datatype: Date
      - name: currency
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: currency
        description: ISO 4217 currency code
        datatype: String
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: event_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: event_date
        dimension:
          is_time: true
        description: Date the event occurred
        datatype: Date
      - name: event_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: event_id
        description: Unique, immutable event identifier
        datatype: String
      - name: segment
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: segment
        description: Customer segment (SMB, Mid-Market, Enterprise or the organisation's own scheme) at the time of the event or snapshot. The field behind the Segment concept; carried on revenue tables so retention and movement metrics slice by it without a join.
        datatype: String
      - name: subscription_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: subscription_id
        description: Subscription identifier
        datatype: String
      - name: tcv
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: tcv
        description: Total contract value
        datatype: Decimal
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"event","cel":"Contract_Event"}'
  - name: amendment_event
    source: gasp.amendment_event
    description: "Amendment event. Kind: event. CEL class: Amendment_Event."
    primary_key:
      - event_id
    fields:
      - name: amendment_type
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: amendment_type
        description: Mid-term change kind (CEL, extended with cross_sell)
        datatype: String
        ai_context:
          instructions: One of upgrade, downgrade, add_on, cross_sell, seat_change, pricing_change
      - name: change_nature
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: change_nature
        description: permanent, temporary or scheduled_reversal (Adjusted NRR/GRR)
        datatype: String
        ai_context:
          instructions: One of permanent, temporary, scheduled_reversal
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: event_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: event_date
        dimension:
          is_time: true
        description: Date the event occurred
        datatype: Date
      - name: event_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: event_id
        description: Unique, immutable event identifier
        datatype: String
      - name: expansion_classification
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: expansion_classification
        description: ATL expansion tag; required for NRR-M and ARR-M
        datatype: String
        ai_context:
          instructions: One of same_product, new_module, new_buying_centre, pricing_adjustment, recontracting, usage_realisation
      - name: lifecycle_attribution
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: lifecycle_attribution
        description: ATL lifecycle tag
        datatype: String
        ai_context:
          instructions: One of acquisition, activation, retention, expansion, reactivation, servicing
      - name: mrr_change
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: mrr_change
        description: Change in MRR; negative for contraction and churn
        datatype: Decimal
      - name: segment
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: segment
        description: Customer segment (SMB, Mid-Market, Enterprise or the organisation's own scheme) at the time of the event or snapshot. The field behind the Segment concept; carried on revenue tables so retention and movement metrics slice by it without a join.
        datatype: String
      - name: subscription_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: subscription_id
        description: Subscription identifier
        datatype: String
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"event","cel":"Amendment_Event"}'
  - name: lifecycle_event
    source: gasp.lifecycle_event
    description: "Lifecycle state change. Kind: event. CEL class: Lifecycle_State_Change."
    primary_key:
      - event_id
    fields:
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: event_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: event_date
        dimension:
          is_time: true
        description: Date the event occurred
        datatype: Date
      - name: event_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: event_id
        description: Unique, immutable event identifier
        datatype: String
      - name: new_state
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: new_state
        description: New lifecycle state
        datatype: String
      - name: prior_state
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: prior_state
        description: Previous lifecycle state
        datatype: String
      - name: state_category
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: state_category
        description: Lifecycle state after the change (CEL)
        datatype: String
        ai_context:
          instructions: One of activation, onboarding_complete, healthy, at_risk, churned, reactivated
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"event","cel":"Lifecycle_State_Change"}'
  - name: trial
    source: gasp.trial
    description: "Trial. Kind: fact."
    primary_key:
      - trial_id
      - trial_end_date
    fields:
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: trial_end_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: trial_end_date
        dimension:
          is_time: true
        description: "Date the trial ended: the conversion date, the expiry date or the day it was cancelled"
        datatype: Date
      - name: trial_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: trial_id
        description: Trial identifier
        datatype: String
      - name: trial_start_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: trial_start_date
        description: Date the trial started
        datatype: Date
      - name: trial_status
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: trial_status
        description: "Outcome of the trial: active while it runs, then converted, expired or cancelled"
        datatype: String
        ai_context:
          instructions: One of active, converted, expired, cancelled
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"fact"}'
  - name: customer
    source: gasp.customer
    description: "Customer. Kind: snapshot."
    primary_key:
      - customer_id
      - snapshot_date
    fields:
      - name: acquisition_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: acquisition_date
        description: Date the customer first became paying
        datatype: Date
      - name: activation_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: activation_date
        description: Date the activation milestone was reached
        datatype: Date
      - name: composite_score
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: composite_score
        description: Health score on a 0 to 100 scale
        datatype: Decimal
      - name: criteria_met
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: criteria_met
        description: Product-qualified criteria met
        datatype: Boolean
      - name: csm_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: csm_id
        description: Assigned customer success manager
        datatype: String
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: customer_status
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_status
        description: Customer lifecycle status; active means at least one active subscription
        datatype: String
        ai_context:
          instructions: One of trial, active, churned, dormant
      - name: last_active_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: last_active_date
        description: Most recent qualifying activity
        datatype: Date
      - name: onboarding_completion_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: onboarding_completion_date
        description: Onboarding completion; null while open
        datatype: Date
      - name: qbr_completed
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: qbr_completed
        description: A QBR was held in the period
        datatype: Boolean
      - name: qbr_due
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: qbr_due
        description: A QBR was due in the period
        datatype: Boolean
      - name: segment
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: segment
        description: Customer segment (SMB, Mid-Market, Enterprise or the organisation's own scheme) at the time of the event or snapshot. The field behind the Segment concept; carried on revenue tables so retention and movement metrics slice by it without a join.
        datatype: String
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
      - name: upgrade_eligible
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: upgrade_eligible
        description: Customer is on a plan with an upgrade path
        datatype: Boolean
    custom_extensions:
      - vendor_name: GASP
        data: "{\"kind\":\"snapshot\",\"activeWhen\":\"field.customer_status = 'active'\"}"
  - name: contact
    source: gasp.contact
    description: "Contact. Kind: snapshot."
    primary_key:
      - contact_id
      - snapshot_date
    fields:
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: contact_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: contact_id
        description: "Contact identifier: a named person at a customer account"
        datatype: String
      - name: contact_role
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: contact_role
        description: The contact's role in the account relationship
        datatype: String
        ai_context:
          instructions: One of executive_sponsor, decision_maker, champion, day_to_day, procurement, other
      - name: contact_engaged
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: contact_engaged
        description: The contact had recorded activity (meeting, email, call, QBR) in the trailing 90 days
        datatype: Boolean
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: plan
    source: gasp.plan
    description: "Plan. Kind: snapshot."
    primary_key:
      - plan_id
      - snapshot_date
    fields:
      - name: plan_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: plan_id
        description: Pricing plan identifier; the plan a subscription is priced by
        datatype: String
      - name: plan_name
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: plan_name
        description: Plan display name (Starter, Pro, Enterprise)
        datatype: String
      - name: billing_period
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: billing_period
        description: How often the plan bills
        datatype: String
        ai_context:
          instructions: One of monthly, annual, multi_year
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: product
    source: gasp.product
    description: "Product. Kind: snapshot."
    primary_key:
      - product_id
      - snapshot_date
    fields:
      - name: product_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: product_id
        description: Product identifier; the purchasable unit a license grants access to
        datatype: String
      - name: product_name
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: product_name
        description: Product display name
        datatype: String
      - name: product_line
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: product_line
        description: Product family the product belongs to
        datatype: String
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: license
    source: gasp.license
    description: "License. Kind: snapshot."
    primary_key:
      - license_id
      - snapshot_date
    fields:
      - name: product_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: product_id
        description: Product identifier; the purchasable unit a license grants access to
        datatype: String
      - name: license_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: license_id
        description: "License identifier: one entitlement a subscription grants"
        datatype: String
      - name: license_status
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: license_status
        description: Whether the license currently grants access
        datatype: String
        ai_context:
          instructions: One of active, suspended, expired
      - name: seats_purchased
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: seats_purchased
        description: Seats the license entitles the customer to
        datatype: Integer
      - name: seats_assigned
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: seats_assigned
        description: Seats assigned to a named user
        datatype: Integer
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
      - name: subscription_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: subscription_id
        description: Subscription identifier
        datatype: String
    custom_extensions:
      - vendor_name: GASP
        data: "{\"kind\":\"snapshot\",\"activeWhen\":\"field.license_status = 'active'\"}"
  - name: subscription
    source: gasp.subscription
    description: "Subscription. Kind: snapshot."
    primary_key:
      - subscription_id
      - snapshot_date
    fields:
      - name: auto_renewed
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: auto_renewed
        description: Renewal happened without manual intervention
        datatype: Boolean
      - name: contract_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: contract_end
        description: Contract end date
        datatype: Date
      - name: contract_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: contract_start
        description: Contract start date
        datatype: Date
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: forecast_renewal_amount
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: forecast_renewal_amount
        description: Forecast renewal value
        datatype: Decimal
      - name: plan_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: plan_id
        description: Pricing plan identifier; the plan a subscription is priced by
        datatype: String
      - name: mrr
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: mrr
        description: Monthly recurring revenue of the subscription
        datatype: Decimal
      - name: mrr_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: mrr_end
        description: MRR at period end (cohort form)
        datatype: Decimal
      - name: mrr_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: mrr_start
        description: MRR at period start (cohort form)
        datatype: Decimal
      - name: renewal_amount
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: renewal_amount
        description: Value up for renewal
        datatype: Decimal
      - name: renewal_complete_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: renewal_complete_date
        description: Date renewal processing finished
        datatype: Date
      - name: renewal_notified_on_time
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: renewal_notified_on_time
        description: Renewal notice sent within the agreed window
        datatype: Boolean
      - name: renewal_trigger_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: renewal_trigger_date
        description: Date renewal processing started
        datatype: Date
      - name: renewed
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: renewed
        description: Renewed at the most recent term end
        datatype: Boolean
      - name: segment
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: segment
        description: Customer segment (SMB, Mid-Market, Enterprise or the organisation's own scheme) at the time of the event or snapshot. The field behind the Segment concept; carried on revenue tables so retention and movement metrics slice by it without a join.
        datatype: String
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
      - name: subscription_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: subscription_id
        description: Subscription identifier
        datatype: String
      - name: subscription_status
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: subscription_status
        description: Subscription status
        datatype: String
        ai_context:
          instructions: One of active, cancelled, expired, paused
    custom_extensions:
      - vendor_name: GASP
        data: "{\"kind\":\"snapshot\",\"activeWhen\":\"field.subscription_status = 'active'\"}"
  - name: opportunity
    source: gasp.opportunity
    description: "Opportunity. Kind: snapshot."
    primary_key:
      - opportunity_id
      - snapshot_date
    fields:
      - name: advanced_to_next_stage
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: advanced_to_next_stage
        description: Advanced one stage in the period
        datatype: Boolean
      - name: channel
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: channel
        description: "Marketing channel: the channel a campaign runs in, and the first-touch channel of an opportunity"
        datatype: String
        ai_context:
          instructions: One of paid_ads, organic_search, email, events, content, referral, marketplace, direct, other
      - name: close_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: close_date
        description: Actual or expected close date of the opportunity; on a project or registration, the close date of the won deal
        datatype: Date
      - name: close_date_valid
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: close_date_valid
        description: Close date is in the future or matches the actual close
        datatype: Boolean
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: forecast_category
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: forecast_category
        description: Forecast category
        datatype: String
        ai_context:
          instructions: One of pipeline, best_case, commit, closed
      - name: includes_services
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: includes_services
        description: Deal includes professional services
        datatype: Boolean
      - name: lead_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: lead_id
        description: Lead identifier
        datatype: String
      - name: marketing_influenced
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: marketing_influenced
        description: A marketing touch exists on the opportunity
        datatype: Boolean
      - name: marketing_source
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: marketing_source
        description: Team that sourced the opportunity
        datatype: String
        ai_context:
          instructions: One of marketing, sales, partner, other
      - name: opportunity_amount
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: opportunity_amount
        description: Opportunity value (recurring)
        datatype: Decimal
      - name: opportunity_created_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: opportunity_created_date
        description: Date the opportunity was created
        datatype: Date
      - name: opportunity_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: opportunity_id
        description: Opportunity (deal) identifier
        datatype: String
      - name: opportunity_stage
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: opportunity_stage
        description: Sales stage of an opportunity, or of a partner's registered deal
        datatype: String
        ai_context:
          instructions: One of qualification, discovery, proposal, negotiation, closed_won, closed_lost
      - name: partner_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: partner_id
        description: Partner identifier
        datatype: String
      - name: partner_sourced
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: partner_sourced
        description: Sourced by a partner
        datatype: Boolean
      - name: rep_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: rep_id
        description: Sales rep identifier
        datatype: String
      - name: required_fields_complete
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: required_fields_complete
        description: All required CRM fields populated
        datatype: Boolean
      - name: revenue_type
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: revenue_type
        description: Revenue line type
        datatype: String
        ai_context:
          instructions: One of subscription, services, usage, other
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
      - name: stage_accurate
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: stage_accurate
        description: Stage matches observed activity
        datatype: Boolean
      - name: stage_probability
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: stage_probability
        description: Win probability for the stage, 0 to 1
        datatype: Decimal
      - name: updated_within_sla
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: updated_within_sla
        description: Updated inside the hygiene SLA
        datatype: Boolean
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: lead
    source: gasp.lead
    description: "Lead. Kind: snapshot."
    primary_key:
      - lead_id
      - snapshot_date
    fields:
      - name: lead_created_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: lead_created_date
        description: Date the lead was created
        datatype: Date
      - name: lead_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: lead_id
        description: Lead identifier
        datatype: String
      - name: lead_source
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: lead_source
        description: Lead source
        datatype: String
      - name: lead_stage
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: lead_stage
        description: Lead funnel stage
        datatype: String
        ai_context:
          instructions: One of lead, mql, sql, opportunity, disqualified
      - name: mql_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: mql_date
        description: Date the lead became an MQL
        datatype: Date
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
      - name: sql_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: sql_date
        description: Date the lead was accepted by sales
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: user
    source: gasp.user
    description: "User. Kind: snapshot."
    primary_key:
      - user_id
      - snapshot_date
    fields:
      - name: activation_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: activation_date
        description: Date the activation milestone was reached
        datatype: Date
      - name: core_features_adopted
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: core_features_adopted
        description: User has adopted the defined core feature set
        datatype: Boolean
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: first_use_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: first_use_date
        description: First use of the feature
        datatype: Date
      - name: last_active_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: last_active_date
        description: Most recent qualifying activity
        datatype: Date
      - name: signup_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: signup_date
        description: User signup date
        datatype: Date
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
      - name: user_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: user_id
        description: Product user identifier
        datatype: String
      - name: user_status
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: user_status
        description: User activity status
        datatype: String
        ai_context:
          instructions: One of active, dormant, deactivated
    custom_extensions:
      - vendor_name: GASP
        data: "{\"kind\":\"snapshot\",\"activeWhen\":\"field.user_status = 'active'\"}"
  - name: employee
    source: gasp.employee
    description: "Employee. Kind: snapshot."
    primary_key:
      - employee_id
      - snapshot_date
    fields:
      - name: department
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: department
        description: Department
        datatype: String
      - name: employee_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: employee_id
        description: Employee identifier
        datatype: String
      - name: employee_status
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: employee_status
        description: Employment status
        datatype: String
        ai_context:
          instructions: One of active, on_leave, terminated
      - name: application_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: application_date
        description: Date the hired employee applied; the start of Time to Hire
        datatype: Date
      - name: hire_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: hire_date
        description: Employment start date
        datatype: Date
      - name: hire_source
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: hire_source
        description: Recruiting channel the employee was hired through
        datatype: String
        ai_context:
          instructions: One of referral, inbound, sourced, agency, internal, campus, other
      - name: is_high_performer
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: is_high_performer
        description: Rated high performer
        datatype: Boolean
      - name: job_level
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: job_level
        description: Seniority level
        datatype: String
        ai_context:
          instructions: One of individual_contributor, manager, director, vp, c_level
      - name: market_midpoint
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: market_midpoint
        description: Market midpoint for the role
        datatype: Decimal
      - name: performance_rating
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: performance_rating
        description: Most recent performance rating
        datatype: Decimal
      - name: salary
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: salary
        description: Base salary
        datatype: Decimal
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
      - name: termination_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: termination_date
        description: Employment end date
        datatype: Date
      - name: termination_type
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: termination_type
        description: Voluntary or involuntary
        datatype: String
        ai_context:
          instructions: One of voluntary, involuntary
      - name: underrepresented_group
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: underrepresented_group
        description: Self-identified member of an underrepresented group
        datatype: Boolean
    custom_extensions:
      - vendor_name: GASP
        data: "{\"kind\":\"snapshot\",\"activeWhen\":\"field.employee_status = 'active'\"}"
  - name: partner
    source: gasp.partner
    description: "Partner. Kind: snapshot."
    primary_key:
      - partner_id
      - snapshot_date
    fields:
      - name: certification_status
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: certification_status
        description: Certification state
        datatype: String
        ai_context:
          instructions: One of none, in_progress, certified, expired
      - name: partner_churn_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: partner_churn_date
        description: Date the partner left the programme
        datatype: Date
      - name: partner_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: partner_id
        description: Partner identifier
        datatype: String
      - name: partner_recruited_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: partner_recruited_date
        description: Date the partner signed
        datatype: Date
      - name: partner_status
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: partner_status
        description: Partner lifecycle status
        datatype: String
        ai_context:
          instructions: One of recruited, active, churned
      - name: partner_tier
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: partner_tier
        description: Partner programme tier
        datatype: String
        ai_context:
          instructions: One of registered, silver, gold, platinum
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
      - name: training_completed
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: training_completed
        description: Required training completed
        datatype: Boolean
    custom_extensions:
      - vendor_name: GASP
        data: "{\"kind\":\"snapshot\",\"activeWhen\":\"field.partner_status = 'active'\"}"
  - name: project
    source: gasp.project
    description: "Project. Kind: snapshot."
    primary_key:
      - project_id
      - snapshot_date
    fields:
      - name: close_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: close_date
        description: Actual or expected close date of the opportunity; on a project or registration, the close date of the won deal
        datatype: Date
      - name: consultant_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: consultant_id
        description: Consultant identifier
        datatype: String
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: escalated
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: escalated
        description: Escalated beyond first line
        datatype: Boolean
      - name: hours_actual
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: hours_actual
        description: Actual hours
        datatype: Decimal
      - name: hours_budgeted
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: hours_budgeted
        description: Budgeted hours
        datatype: Decimal
      - name: project_completion_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: project_completion_date
        description: Project completion; null while open
        datatype: Date
      - name: project_cost
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: project_cost
        description: Delivery cost of the project
        datatype: Decimal
      - name: project_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: project_id
        description: Services project identifier; null on costs not attributable to a project
        datatype: String
      - name: project_revenue
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: project_revenue
        description: Revenue recognised on the project
        datatype: Decimal
      - name: project_start_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: project_start_date
        description: Project start
        datatype: Date
      - name: referenceable
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: referenceable
        description: Customer agreed to be a reference
        datatype: Boolean
      - name: scope_changed
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: scope_changed
        description: Scope changed after kickoff
        datatype: Boolean
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
      - name: target_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: target_date
        description: Committed completion date
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: invoice
    source: gasp.invoice
    description: "Invoice. Kind: snapshot."
    primary_key:
      - invoice_id
      - snapshot_date
    fields:
      - name: billing_trigger_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: billing_trigger_date
        description: Date the billing event occurred
        datatype: Date
      - name: credit_memo_count
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: credit_memo_count
        description: Credit memos issued against the invoice
        datatype: Integer
      - name: currency
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: currency
        description: ISO 4217 currency code
        datatype: String
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: invoice_amount
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: invoice_amount
        description: Invoiced amount
        datatype: Decimal
      - name: invoice_corrected
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: invoice_corrected
        description: Corrected after issue
        datatype: Boolean
      - name: invoice_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: invoice_date
        description: Invoice date
        datatype: Date
      - name: invoice_disputed
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: invoice_disputed
        description: Disputed by the customer
        datatype: Boolean
      - name: invoice_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: invoice_id
        description: Invoice identifier
        datatype: String
      - name: outstanding_amount
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: outstanding_amount
        description: Unpaid balance as of snapshot_date
        datatype: Decimal
      - name: payment_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: payment_date
        description: Date paid in full; null while unpaid
        datatype: Date
      - name: payment_method
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: payment_method
        description: Payment method
        datatype: String
        ai_context:
          instructions: One of credit_card, ach, wire, check, other
      - name: payment_status
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: payment_status
        description: Payment status
        datatype: String
        ai_context:
          instructions: One of paid, unpaid, partial, written_off
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: campaign
    source: gasp.campaign
    description: "Campaign spend. Kind: fact."
    primary_key:
      - campaign_id
      - period_start
    fields:
      - name: ad_spend
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: ad_spend
        description: Media spend in the period
        datatype: Decimal
      - name: campaign_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: campaign_id
        description: Campaign identifier
        datatype: String
      - name: channel
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: channel
        description: "Marketing channel: the channel a campaign runs in, and the first-touch channel of an opportunity"
        datatype: String
        ai_context:
          instructions: One of paid_ads, organic_search, email, events, content, referral, marketplace, direct, other
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        description: Start of the period the row describes
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"fact"}'
  - name: sales_rep
    source: gasp.sales_rep
    description: "Sales rep period. Kind: fact."
    primary_key:
      - rep_id
      - period_start
    fields:
      - name: closed_revenue
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: closed_revenue
        description: Closed-won value credited to the rep in the period
        datatype: Decimal
      - name: hire_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: hire_date
        description: Employment start date
        datatype: Date
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        description: Start of the period the row describes
        datatype: Date
      - name: quota
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: quota
        description: Quota for the period
        datatype: Decimal
      - name: ramped_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: ramped_date
        description: Date the rep first hit sustained quota
        datatype: Date
      - name: rep_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: rep_id
        description: Sales rep identifier
        datatype: String
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"fact"}'
  - name: consultant
    source: gasp.consultant
    description: "Consultant capacity. Kind: fact."
    primary_key:
      - consultant_id
      - period_start
    fields:
      - name: available_hours
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: available_hours
        description: Capacity hours in the period
        datatype: Decimal
      - name: consultant_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: consultant_id
        description: Consultant identifier
        datatype: String
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        description: Start of the period the row describes
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"fact"}'
  - name: ticket
    source: gasp.ticket
    description: "Support ticket. Kind: event."
    primary_key:
      - ticket_id
    fields:
      - name: agent_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: agent_id
        description: Handling agent
        datatype: String
      - name: created_at
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: created_at
        dimension:
          is_time: true
        description: Creation time
        datatype: DateTime
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: escalated
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: escalated
        description: Escalated beyond first line
        datatype: Boolean
      - name: first_response_at
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: first_response_at
        description: First agent response time
        datatype: DateTime
      - name: first_response_due_at
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: first_response_due_at
        description: First response SLA deadline
        datatype: DateTime
      - name: reopened
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: reopened
        description: Reopened after resolution
        datatype: Boolean
      - name: resolution_due_at
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: resolution_due_at
        description: Resolution SLA deadline
        datatype: DateTime
      - name: resolved_at
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: resolved_at
        description: Resolution time
        datatype: DateTime
      - name: resolved_first_contact
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: resolved_first_contact
        description: Resolved in the first interaction
        datatype: Boolean
      - name: ticket_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: ticket_id
        description: Ticket identifier
        datatype: String
      - name: ticket_status
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: ticket_status
        description: Ticket status
        datatype: String
        ai_context:
          instructions: One of open, pending, resolved, closed
      - name: ticket_type
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: ticket_type
        description: Ticket category the agent or the help desk assigns
        datatype: String
        ai_context:
          instructions: One of how_to, bug, billing, account, feature_request, other
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"event"}'
  - name: product_event
    source: gasp.product_event
    description: "Product usage event. Kind: event."
    primary_key:
      - event_id
    fields:
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: event_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: event_date
        dimension:
          is_time: true
        description: Date the event occurred
        datatype: Date
      - name: event_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: event_id
        description: Unique, immutable event identifier
        datatype: String
      - name: feature_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: feature_id
        description: Feature identifier
        datatype: String
      - name: product_event_type
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: product_event_type
        description: Kind of product event; qualifying events define active use
        datatype: String
        ai_context:
          instructions: One of qualifying, action, error, reactivation, login
      - name: session_duration
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: session_duration
        description: Session length in minutes
        datatype: Integer
      - name: session_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: session_id
        description: Session identifier
        datatype: String
      - name: signup_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: signup_date
        description: User signup date
        datatype: Date
      - name: usage_count
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: usage_count
        description: Actions in the event or session
        datatype: Integer
      - name: user_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: user_id
        description: Product user identifier
        datatype: String
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"event"}'
  - name: survey_response
    source: gasp.survey_response
    description: "Survey response. Kind: event."
    primary_key:
      - response_id
    fields:
      - name: ces_score
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: ces_score
        description: 1 to 7 effort score
        datatype: Integer
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: employee_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: employee_id
        description: Employee identifier
        datatype: String
      - name: engagement_score
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: engagement_score
        description: Engagement survey score
        datatype: Decimal
      - name: lead_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: lead_id
        description: Lead identifier
        datatype: String
      - name: nps_score
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: nps_score
        description: 0 to 10 recommend score
        datatype: Integer
      - name: partner_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: partner_id
        description: Partner identifier
        datatype: String
      - name: project_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: project_id
        description: Services project identifier; null on costs not attributable to a project
        datatype: String
      - name: response_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: response_id
        description: Survey response identifier
        datatype: String
      - name: satisfaction_score
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: satisfaction_score
        description: 1 to 5 satisfaction score
        datatype: Integer
      - name: survey_completed
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: survey_completed
        description: Response completed
        datatype: Boolean
      - name: survey_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: survey_date
        dimension:
          is_time: true
        description: Response date
        datatype: Date
      - name: survey_type
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: survey_type
        description: Survey programme the response belongs to
        datatype: String
        ai_context:
          instructions: One of customer, onboarding, project, partner, employee, prospect
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"event"}'
  - name: kb_article
    source: gasp.kb_article
    description: "Knowledge base article. Kind: fact."
    primary_key:
      - article_id
      - period_start
    fields:
      - name: article_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: article_id
        description: Knowledge base article identifier
        datatype: String
      - name: deflections
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: deflections
        description: Sessions resolved without a ticket
        datatype: Integer
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        description: Start of the period the row describes
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"fact"}'
  - name: requisition
    source: gasp.requisition
    description: "Job requisition. Kind: snapshot."
    primary_key:
      - requisition_id
      - snapshot_date
    fields:
      - name: filled_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: filled_date
        description: Date the requisition was filled
        datatype: Date
      - name: hire_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: hire_date
        description: Employment start date
        datatype: Date
      - name: offer_status
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: offer_status
        description: Status of the latest offer
        datatype: String
        ai_context:
          instructions: One of extended, accepted, declined, withdrawn
      - name: requisition_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: requisition_id
        description: Requisition identifier
        datatype: String
      - name: requisition_opened_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: requisition_opened_date
        description: Date the requisition opened
        datatype: Date
      - name: requisition_status
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: requisition_status
        description: Requisition status
        datatype: String
        ai_context:
          instructions: One of open, filled, closed
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: incident
    source: gasp.incident
    description: "Incident. Kind: event."
    primary_key:
      - incident_id
    fields:
      - name: acknowledged_at
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: acknowledged_at
        description: Acknowledgement time
        datatype: DateTime
      - name: detected_at
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: detected_at
        description: Detection time
        datatype: DateTime
      - name: incident_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: incident_id
        description: Incident identifier
        datatype: String
      - name: incident_type
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: incident_type
        description: Incident category
        datatype: String
        ai_context:
          instructions: One of availability, performance, security, data
      - name: recovery_time
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: recovery_time
        description: Minutes from start to service restored
        datatype: Integer
      - name: resolved_at
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: resolved_at
        description: Resolution time
        datatype: DateTime
      - name: severity
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: severity
        description: Incident severity
        datatype: String
        ai_context:
          instructions: One of sev1, sev2, sev3, sev4
      - name: started_at
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: started_at
        dimension:
          is_time: true
        description: Incident start time
        datatype: DateTime
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"event"}'
  - name: deployment
    source: gasp.deployment
    description: "Deployment. Kind: event."
    primary_key:
      - deployment_id
    fields:
      - name: committed_at
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: committed_at
        description: First commit time of the change
        datatype: DateTime
      - name: deploy_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: deploy_date
        dimension:
          is_time: true
        description: Deployment time
        datatype: DateTime
      - name: deployment_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: deployment_id
        description: Deployment identifier
        datatype: String
      - name: incident_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: incident_id
        description: Incident identifier
        datatype: String
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"event"}'
  - name: vulnerability
    source: gasp.vulnerability
    description: "Vulnerability. Kind: snapshot."
    primary_key:
      - vulnerability_id
      - snapshot_date
    fields:
      - name: discovered_at
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: discovered_at
        description: Discovery time
        datatype: DateTime
      - name: patched_at
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: patched_at
        description: Patch time
        datatype: DateTime
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
      - name: vulnerability_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: vulnerability_id
        description: Vulnerability identifier
        datatype: String
      - name: vulnerability_status
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: vulnerability_status
        description: Vulnerability status
        datatype: String
        ai_context:
          instructions: One of open, patched, accepted
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: service_metrics
    source: gasp.service_metrics
    description: "Service reliability. Kind: fact."
    primary_key:
      - service_id
      - period_start
    fields:
      - name: downtime_minutes
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: downtime_minutes
        description: Minutes unavailable in the period
        datatype: Integer
      - name: error_count
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: error_count
        description: Failed requests
        datatype: Integer
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        description: Start of the period the row describes
        datatype: Date
      - name: request_count
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: request_count
        description: Total requests
        datatype: Integer
      - name: response_time_ms
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: response_time_ms
        description: Response time per request sample
        datatype: Integer
      - name: service_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: service_id
        description: Service identifier
        datatype: String
      - name: sla_met
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: sla_met
        description: SLA met for the period row
        datatype: Boolean
      - name: utilization
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: utilization
        description: Resource utilisation, 0 to 1
        datatype: Decimal
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"fact"}'
  - name: issue
    source: gasp.issue
    description: "Issue (bug or request). Kind: event."
    primary_key:
      - issue_id
    fields:
      - name: created_at
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: created_at
        dimension:
          is_time: true
        description: Creation time
        datatype: DateTime
      - name: issue_environment
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: issue_environment
        description: Where the issue was found
        datatype: String
        ai_context:
          instructions: One of production, pre_production
      - name: issue_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: issue_id
        description: Issue identifier
        datatype: String
      - name: issue_source
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: issue_source
        description: Who reported the issue
        datatype: String
        ai_context:
          instructions: One of user_report, internal, monitoring
      - name: issue_type
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: issue_type
        description: Issue kind
        datatype: String
        ai_context:
          instructions: One of bug, feature_request, question, incident
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"event"}'
  - name: feature
    source: gasp.feature
    description: "Feature. Kind: snapshot."
    primary_key:
      - feature_id
      - snapshot_date
    fields:
      - name: actual_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: actual_date
        description: Actual delivery date
        datatype: Date
      - name: feature_created_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: feature_created_date
        description: Date the feature was first specified
        datatype: Date
      - name: feature_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: feature_id
        description: Feature identifier
        datatype: String
      - name: first_use_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: first_use_date
        description: First use of the feature
        datatype: Date
      - name: planned_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: planned_date
        description: Planned delivery date
        datatype: Date
      - name: release_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: release_date
        description: Release date
        datatype: Date
      - name: release_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: release_id
        description: Release identifier
        datatype: String
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: release
    source: gasp.release
    description: "Release. Kind: event."
    primary_key:
      - release_id
    fields:
      - name: release_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: release_date
        dimension:
          is_time: true
        description: Release date
        datatype: Date
      - name: release_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: release_id
        description: Release identifier
        datatype: String
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"event"}'
  - name: roadmap_item
    source: gasp.roadmap_item
    description: "Roadmap item. Kind: snapshot."
    primary_key:
      - roadmap_item_id
      - snapshot_date
    fields:
      - name: roadmap_item_completed
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: roadmap_item_completed
        description: Roadmap item delivered
        datatype: Boolean
      - name: roadmap_item_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: roadmap_item_id
        description: Roadmap item identifier
        datatype: String
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: project_milestone
    source: gasp.project_milestone
    description: "Project milestone. Kind: snapshot."
    primary_key:
      - project_milestone_id
      - snapshot_date
    fields:
      - name: actual_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: actual_date
        description: Actual delivery date
        datatype: Date
      - name: planned_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: planned_date
        description: Planned delivery date
        datatype: Date
      - name: project_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: project_id
        description: Services project identifier; null on costs not attributable to a project
        datatype: String
      - name: project_milestone_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: project_milestone_id
        description: Project milestone identifier
        datatype: String
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: time_entry
    source: gasp.time_entry
    description: "Time entry. Kind: event."
    primary_key:
      - entry_id
    fields:
      - name: billed_hours
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: billed_hours
        description: Hours billed to the customer
        datatype: Decimal
      - name: billed_revenue
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: billed_revenue
        description: Revenue billed for the entry
        datatype: Decimal
      - name: consultant_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: consultant_id
        description: Consultant identifier
        datatype: String
      - name: entry_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: entry_date
        dimension:
          is_time: true
        description: Time entry date
        datatype: Date
      - name: entry_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: entry_id
        description: Time entry identifier
        datatype: String
      - name: hours
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: hours
        description: Hours logged
        datatype: Decimal
      - name: project_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: project_id
        description: Services project identifier; null on costs not attributable to a project
        datatype: String
      - name: standard_rate
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: standard_rate
        description: Standard hourly rate
        datatype: Decimal
      - name: time_entry_type
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: time_entry_type
        description: Billable or non-billable category
        datatype: String
        ai_context:
          instructions: One of billable, training, pre_sales, internal
      - name: written_off_hours
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: written_off_hours
        description: Hours written off
        datatype: Decimal
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"event"}'
  - name: deliverable
    source: gasp.deliverable
    description: "Deliverable. Kind: snapshot."
    primary_key:
      - deliverable_id
      - snapshot_date
    fields:
      - name: deliverable_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: deliverable_id
        description: Deliverable identifier
        datatype: String
      - name: project_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: project_id
        description: Services project identifier; null on costs not attributable to a project
        datatype: String
      - name: reworked
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: reworked
        description: Deliverable required rework
        datatype: Boolean
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: onboarding
    source: gasp.onboarding
    description: "Onboarding engagement. Kind: snapshot."
    primary_key:
      - onboarding_id
      - snapshot_date
    fields:
      - name: contract_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: contract_start
        description: Contract start date
        datatype: Date
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: hours
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: hours
        description: Hours logged
        datatype: Decimal
      - name: onboarding_completion_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: onboarding_completion_date
        description: Onboarding completion; null while open
        datatype: Date
      - name: onboarding_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: onboarding_id
        description: Onboarding engagement identifier
        datatype: String
      - name: onboarding_start_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: onboarding_start_date
        description: Onboarding kickoff date
        datatype: Date
      - name: resource_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: resource_id
        description: Onboarding specialist
        datatype: String
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
      - name: steps_completed
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: steps_completed
        description: Onboarding tasks completed
        datatype: Integer
      - name: steps_total
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: steps_total
        description: Onboarding tasks assigned
        datatype: Integer
      - name: target_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: target_date
        description: Committed completion date
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: onboarding_milestone
    source: gasp.onboarding_milestone
    description: "Onboarding milestone. Kind: event."
    primary_key:
      - onboarding_id
    fields:
      - name: contract_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: contract_start
        description: Contract start date
        datatype: Date
      - name: milestone_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: milestone_date
        dimension:
          is_time: true
        description: Date the milestone was reached
        datatype: Date
      - name: milestone_due_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: milestone_due_date
        description: Date the milestone is due under the onboarding plan. A planned milestone carries it before milestone_date is set
        datatype: Date
      - name: onboarding_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: onboarding_id
        description: Onboarding engagement identifier
        datatype: String
      - name: onboarding_milestone
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: onboarding_milestone
        description: Milestone reached
        datatype: String
        ai_context:
          instructions: One of kickoff, first_value, go_live, full_adoption
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"event"}'
  - name: onboarding_session
    source: gasp.onboarding_session
    description: "Onboarding session. Kind: event."
    primary_key:
      - onboarding_id
    fields:
      - name: attendees
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: attendees
        description: Customer attendees at the session
        datatype: Integer
      - name: onboarding_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: onboarding_id
        description: Onboarding engagement identifier
        datatype: String
      - name: onboarding_session_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: onboarding_session_date
        dimension:
          is_time: true
        description: Scheduled session date
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"event"}'
  - name: quote
    source: gasp.quote
    description: "Quote. Kind: snapshot."
    primary_key:
      - quote_id
      - snapshot_date
    fields:
      - name: list_price
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: list_price
        description: List price of the quote
        datatype: Decimal
      - name: quote_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: quote_id
        description: Quote identifier
        datatype: String
      - name: quote_requested_at
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: quote_requested_at
        description: Quote requested
        datatype: DateTime
      - name: quote_sent_at
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: quote_sent_at
        description: Quote sent
        datatype: DateTime
      - name: quoted_price
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: quoted_price
        description: Net price of the quote
        datatype: Decimal
      - name: revision_count
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: revision_count
        description: Revisions before acceptance
        datatype: Integer
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: order
    source: gasp.order
    description: "Order. Kind: snapshot."
    primary_key:
      - order_id
      - snapshot_date
    fields:
      - name: has_error
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: has_error
        description: Order needed correction
        datatype: Boolean
      - name: order_completed_at
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: order_completed_at
        description: Order processed
        datatype: DateTime
      - name: order_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: order_id
        description: Order identifier
        datatype: String
      - name: order_received_at
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: order_received_at
        description: Order received
        datatype: DateTime
      - name: quote_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: quote_id
        description: Quote identifier
        datatype: String
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: revenue_schedule
    source: gasp.revenue_schedule
    description: "Revenue schedule. Kind: fact."
    primary_key:
      - subscription_id
      - period_start
    fields:
      - name: billed_amount
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: billed_amount
        description: Amount billed for the subscription in the period
        datatype: Decimal
      - name: customer_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: customer_id
        description: Customer (account) identifier. Primary business noun; CEL name
        datatype: String
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        description: Start of the period the row describes
        datatype: Date
      - name: recognition_correct
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: recognition_correct
        description: Recognition matched policy on review
        datatype: Boolean
      - name: recognized_revenue
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: recognized_revenue
        description: Revenue recognised for the subscription in the period
        datatype: Decimal
      - name: subscription_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: subscription_id
        description: Subscription identifier
        datatype: String
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"fact"}'
  - name: financials
    source: gasp.financials
    description: "Income statement and cash flow. Kind: fact."
    primary_key:
      - period_start
    fields:
      - name: bad_debt_expense
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: bad_debt_expense
        description: Bad debt written off in the period
        datatype: Decimal
      - name: capital_expenditures
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: capital_expenditures
        description: Capital expenditure for the period
        datatype: Decimal
      - name: ebitda
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: ebitda
        description: EBITDA for the period
        datatype: Decimal
      - name: net_income
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: net_income
        description: Net income for the period
        datatype: Decimal
      - name: operating_cash_flow
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: operating_cash_flow
        description: Operating cash flow for the period
        datatype: Decimal
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        description: Start of the period the row describes
        datatype: Date
      - name: revenue
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: revenue
        description: GAAP recognised revenue for the period
        datatype: Decimal
      - name: revenue_type
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: revenue_type
        description: Revenue line type
        datatype: String
        ai_context:
          instructions: One of subscription, services, usage, other
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"fact"}'
  - name: balance_sheet
    source: gasp.balance_sheet
    description: "Balance sheet. Kind: snapshot."
    primary_key:
      - snapshot_date
    fields:
      - name: accounts_receivable
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: accounts_receivable
        description: Accounts receivable balance at period end
        datatype: Decimal
      - name: cash_balance
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: cash_balance
        description: Cash and equivalents at period end
        datatype: Decimal
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: web_traffic
    source: gasp.web_traffic
    description: "Web traffic. Kind: fact."
    primary_key:
      - traffic_source
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        description: Start of the period the row describes
        datatype: Date
      - name: traffic_source
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: traffic_source
        description: Traffic source
        datatype: String
        ai_context:
          instructions: One of organic_search, paid_search, paid_social, social, email, referral, direct, other
      - name: unique_visitors
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: unique_visitors
        description: Unique visitors in the period
        datatype: Integer
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"fact"}'
  - name: brand_mention
    source: gasp.brand_mention
    description: "Brand mentions. Kind: fact."
    primary_key:
      - mention_source
      - period_start
    fields:
      - name: is_competitor
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: is_competitor
        description: Mention is of a competitor
        datatype: Boolean
      - name: mention_count
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: mention_count
        description: Brand mentions in the period
        datatype: Integer
      - name: mention_source
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: mention_source
        description: Mention source
        datatype: String
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        description: Start of the period the row describes
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"fact"}'
  - name: crm_record
    source: gasp.crm_record
    description: "CRM record quality. Kind: snapshot."
    primary_key:
      - record_id
      - snapshot_date
    fields:
      - name: populated_field_count
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: populated_field_count
        description: Required fields populated
        datatype: Integer
      - name: record_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: record_id
        description: CRM record identifier
        datatype: String
      - name: required_field_count
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: required_field_count
        description: Required fields defined
        datatype: Integer
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
      - name: sync_status
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: sync_status
        description: Cross-system match state
        datatype: String
        ai_context:
          instructions: One of matched, mismatched, missing
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: partner_activity
    source: gasp.partner_activity
    description: "Partner activity. Kind: event."
    primary_key:
      - activity_id
    fields:
      - name: activity_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: activity_date
        dimension:
          is_time: true
        description: Activity date
        datatype: Date
      - name: activity_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: activity_id
        description: Partner activity identifier
        datatype: String
      - name: partner_activity_type
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: partner_activity_type
        description: Joint marketing activity kind
        datatype: String
        ai_context:
          instructions: One of webinar, event, content, campaign
      - name: partner_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: partner_id
        description: Partner identifier
        datatype: String
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"event"}'
  - name: deal_registration
    source: gasp.deal_registration
    description: "Partner deal registration. Kind: snapshot."
    primary_key:
      - registration_id
      - snapshot_date
    fields:
      - name: close_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: close_date
        description: Actual or expected close date of the opportunity; on a project or registration, the close date of the won deal
        datatype: Date
      - name: opportunity_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: opportunity_id
        description: Opportunity (deal) identifier
        datatype: String
      - name: opportunity_stage
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: opportunity_stage
        description: Sales stage of an opportunity, or of a partner's registered deal
        datatype: String
        ai_context:
          instructions: One of qualification, discovery, proposal, negotiation, closed_won, closed_lost
      - name: partner_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: partner_id
        description: Partner identifier
        datatype: String
      - name: registration_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: registration_date
        description: Date the deal was registered
        datatype: Date
      - name: registration_id
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: registration_id
        description: Partner deal registration identifier
        datatype: String
      - name: snapshot_date
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: snapshot_date
        dimension:
          is_time: true
        description: As-of date of the snapshot row
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"snapshot"}'
  - name: forecast
    source: gasp.forecast
    description: "Revenue forecast. Kind: fact."
    primary_key:
      - period_start
    fields:
      - name: actual_revenue
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: actual_revenue
        description: Revenue actually closed in the period
        datatype: Decimal
      - name: forecasted_revenue
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: forecasted_revenue
        description: Revenue forecast made before the period
        datatype: Decimal
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        description: Start of the period the row describes
        datatype: Date
    custom_extensions:
      - vendor_name: GASP
        data: '{"kind":"fact"}'
  - name: gasp_staged_gasp_arr_o
    source: SELECT p.period_start, p.period_end, (((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active'))) - (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date > (p.period_end - INTERVAL '12 month') AND event_date <= p.period_end AND expansion_classification IN ('pricing_adjustment', 'recontracting') AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active'))) * 12)) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_arr_o: one row per reporting period holding the metric value, computed by the GASP compiled query (needs cohort, window)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: ARR (Annual Recurring Revenue), Operating form for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_arr_o\",\"reason\":\"cohort\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, (((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active'))) - (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date > DATEADD(month, -12, p.period_end) AND event_date <= p.period_end AND expansion_classification IN ('pricing_adjustment', 'recontracting') AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active'))) * 12)) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, (((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active'))) - (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date > DATE_SUB(p.period_end, INTERVAL 12 MONTH) AND event_date <= p.period_end AND expansion_classification IN ('pricing_adjustment', 'recontracting') AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active'))) * 12)) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, (((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active'))) - (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date > DATEADD(MONTH, -12, p.period_end) AND event_date <= p.period_end AND expansion_classification IN ('pricing_adjustment', 'recontracting') AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active'))) * 12)) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_mrr_growth_rate
    source: SELECT p.period_start, p.period_end, ((CAST((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) - ((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = (p.period_end - INTERVAL '1 month') AND subscription_status = 'active'))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = (p.period_end - INTERVAL '1 month') AND subscription_status = 'active')), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_mrr_growth_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs lag)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: MRR Growth Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_mrr_growth_rate\",\"reason\":\"lag\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) - ((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = DATEADD(month, -1, p.period_end) AND subscription_status = 'active'))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = DATEADD(month, -1, p.period_end) AND subscription_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) - ((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = DATE_SUB(p.period_end, INTERVAL 1 MONTH) AND subscription_status = 'active'))) AS FLOAT64) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = DATE_SUB(p.period_end, INTERVAL 1 MONTH) AND subscription_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) - ((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = DATEADD(MONTH, -1, p.period_end) AND subscription_status = 'active'))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = DATEADD(MONTH, -1, p.period_end) AND subscription_status = 'active')), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_carry_mrr
    source: SELECT p.period_start, p.period_end, (((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn')))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction'))))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_carry_mrr: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Carry MRR for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_carry_mrr\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, (((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn')))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction'))))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, (((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn')))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction'))))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, (((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn')))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction'))))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_nrr
    source: SELECT p.period_start, p.period_end, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) + ((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_nrr: one row per reporting period holding the metric value, computed by the GASP compiled query (needs cohort, at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Net Revenue Retention (NRR) for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_nrr\",\"reason\":\"cohort\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) + ((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) + ((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS FLOAT64) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) + ((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_nrr_o
    source: SELECT p.period_start, p.period_end, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) + (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (event_type = 'expansion' AND expansion_classification IN ('same_product', 'usage_realisation')) AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_nrr_o: one row per reporting period holding the metric value, computed by the GASP compiled query (needs cohort, at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Net Revenue Retention (NRR), Operating form for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_nrr_o\",\"reason\":\"cohort\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) + (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (event_type = 'expansion' AND expansion_classification IN ('same_product', 'usage_realisation')) AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) + (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (event_type = 'expansion' AND expansion_classification IN ('same_product', 'usage_realisation')) AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS FLOAT64) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) + (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (event_type = 'expansion' AND expansion_classification IN ('same_product', 'usage_realisation')) AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_nrr_m
    source: SELECT p.period_start, p.period_end, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) + (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (event_type IN ('expansion', 'reactivation') AND expansion_classification IN ('same_product', 'new_module', 'new_buying_centre', 'pricing_adjustment', 'recontracting', 'usage_realisation')) AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_nrr_m: one row per reporting period holding the metric value, computed by the GASP compiled query (needs cohort, at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Net Revenue Retention (NRR), Market form for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_nrr_m\",\"reason\":\"cohort\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) + (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (event_type IN ('expansion', 'reactivation') AND expansion_classification IN ('same_product', 'new_module', 'new_buying_centre', 'pricing_adjustment', 'recontracting', 'usage_realisation')) AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) + (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (event_type IN ('expansion', 'reactivation') AND expansion_classification IN ('same_product', 'new_module', 'new_buying_centre', 'pricing_adjustment', 'recontracting', 'usage_realisation')) AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS FLOAT64) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) + (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (event_type IN ('expansion', 'reactivation') AND expansion_classification IN ('same_product', 'new_module', 'new_buying_centre', 'pricing_adjustment', 'recontracting', 'usage_realisation')) AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_nrr_adjusted
    source: SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')) + (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (event_type IN ('expansion', 'contraction', 'churn') AND change_nature = 'permanent') AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_nrr_adjusted: one row per reporting period holding the metric value, computed by the GASP compiled query (needs cohort)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Net Revenue Retention (NRR), adjusted variant for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_nrr_adjusted\",\"reason\":\"cohort\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')) + (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (event_type IN ('expansion', 'contraction', 'churn') AND change_nature = 'permanent') AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) AS DOUBLE) / NULLIF((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')) + (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (event_type IN ('expansion', 'contraction', 'churn') AND change_nature = 'permanent') AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) AS FLOAT64) / NULLIF((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')) + (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (event_type IN ('expansion', 'contraction', 'churn') AND change_nature = 'permanent') AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) AS DOUBLE) / NULLIF((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_nrr_by_segment
    source: SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) + ((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.subscription WHERE segment IS NOT NULL) _d
    description: "Staged dataset for gasp_nrr_by_segment: one row per reporting period and segment value holding the metric value, computed by the GASP compiled query (needs cohort, at period_start)."
    primary_key:
      - period_start
      - segment
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: segment
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: segment
        datatype: String
        description: Customer segment (SMB, Mid-Market, Enterprise or the organisation's own scheme) at the time of the event or snapshot. The field behind the Segment concept; carried on revenue tables so retention and movement metrics slice by it without a join.
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Net Revenue Retention (NRR), by_segment breakdown for the period and segment
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_nrr_by_segment\",\"reason\":\"cohort\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) + ((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.subscription WHERE segment IS NOT NULL) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) + ((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS FLOAT64) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.subscription WHERE segment IS NOT NULL) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) + ((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.subscription WHERE segment IS NOT NULL) _d\"}}"
  - name: gasp_staged_gasp_grr
    source: SELECT p.period_start, p.period_end, ((CAST(((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_grr: one row per reporting period holding the metric value, computed by the GASP compiled query (needs cohort, at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Gross Revenue Retention (GRR) for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_grr\",\"reason\":\"cohort\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST(((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST(((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS FLOAT64) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST(((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_grr_per_customer
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(LEAST(mrr_end, mrr_start)) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_grr_per_customer: one row per reporting period holding the metric value, computed by the GASP compiled query (needs cohort)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Gross Revenue Retention (GRR), per_customer variant for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_grr_per_customer\",\"reason\":\"cohort\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(LEAST(mrr_end, mrr_start)) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')) AS DOUBLE) / NULLIF((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(LEAST(mrr_end, mrr_start)) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')) AS FLOAT64) / NULLIF((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(LEAST(mrr_end, mrr_start)) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')) AS DOUBLE) / NULLIF((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_grr_adjusted
    source: SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')) + (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (event_type IN ('contraction', 'churn') AND change_nature = 'permanent') AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_grr_adjusted: one row per reporting period holding the metric value, computed by the GASP compiled query (needs cohort)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Gross Revenue Retention (GRR), adjusted variant for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_grr_adjusted\",\"reason\":\"cohort\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')) + (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (event_type IN ('contraction', 'churn') AND change_nature = 'permanent') AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) AS DOUBLE) / NULLIF((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')) + (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (event_type IN ('contraction', 'churn') AND change_nature = 'permanent') AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) AS FLOAT64) / NULLIF((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')) + (SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (event_type IN ('contraction', 'churn') AND change_nature = 'permanent') AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) AS DOUBLE) / NULLIF((SELECT SUM(mrr_start) FROM gasp.subscription WHERE snapshot_date = p.period_end AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_grr_by_segment
    source: SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST(((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.subscription WHERE segment IS NOT NULL) _d
    description: "Staged dataset for gasp_grr_by_segment: one row per reporting period and segment value holding the metric value, computed by the GASP compiled query (needs cohort, at period_start)."
    primary_key:
      - period_start
      - segment
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: segment
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: segment
        datatype: String
        description: Customer segment (SMB, Mid-Market, Enterprise or the organisation's own scheme) at the time of the event or snapshot. The field behind the Segment concept; carried on revenue tables so retention and movement metrics slice by it without a join.
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Gross Revenue Retention (GRR), by_segment breakdown for the period and segment
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_grr_by_segment\",\"reason\":\"cohort\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST(((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.subscription WHERE segment IS NOT NULL) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST(((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS FLOAT64) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.subscription WHERE segment IS NOT NULL) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST(((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment AND customer_id IN (SELECT customer_id FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'))), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.subscription WHERE segment IS NOT NULL) _d\"}}"
  - name: gasp_staged_gasp_logo_churn_rate
    source: SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_logo_churn_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Logo Churn Rate (Customer Churn) for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_logo_churn_rate\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn')) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_logo_churn_rate_by_segment
    source: SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment)) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active' AND segment = _d.segment)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.revenue_event WHERE segment IS NOT NULL) _d
    description: "Staged dataset for gasp_logo_churn_rate_by_segment: one row per reporting period and segment value holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
      - segment
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: segment
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: segment
        datatype: String
        description: Customer segment (SMB, Mid-Market, Enterprise or the organisation's own scheme) at the time of the event or snapshot. The field behind the Segment concept; carried on revenue tables so retention and movement metrics slice by it without a join.
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Logo Churn Rate (Customer Churn), by_segment breakdown for the period and segment
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_logo_churn_rate_by_segment\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment)) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active' AND segment = _d.segment)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.revenue_event WHERE segment IS NOT NULL) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment)) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active' AND segment = _d.segment)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.revenue_event WHERE segment IS NOT NULL) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment)) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active' AND segment = _d.segment)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.revenue_event WHERE segment IS NOT NULL) _d\"}}"
  - name: gasp_staged_gasp_revenue_churn_rate
    source: SELECT p.period_start, p.period_end, ((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_revenue_churn_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Revenue Churn Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_revenue_churn_rate\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS FLOAT64) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_revenue_churn_rate_by_segment
    source: SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND segment = _d.segment)))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.revenue_event WHERE segment IS NOT NULL) _d
    description: "Staged dataset for gasp_revenue_churn_rate_by_segment: one row per reporting period and segment value holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
      - segment
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: segment
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: segment
        datatype: String
        description: Customer segment (SMB, Mid-Market, Enterprise or the organisation's own scheme) at the time of the event or snapshot. The field behind the Segment concept; carried on revenue tables so retention and movement metrics slice by it without a join.
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Revenue Churn Rate, by_segment breakdown for the period and segment
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_revenue_churn_rate_by_segment\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND segment = _d.segment)))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.revenue_event WHERE segment IS NOT NULL) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND segment = _d.segment)))) AS FLOAT64) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.revenue_event WHERE segment IS NOT NULL) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction' AND segment = _d.segment)))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.revenue_event WHERE segment IS NOT NULL) _d\"}}"
  - name: gasp_staged_gasp_cac_by_cost_centre
    source: SELECT p.period_start, p.period_end, _d.cost_centre AS cost_centre, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'gtm' AND cost_centre = _d.cost_centre) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'marketing' AS cost_centre UNION ALL SELECT 'sales' AS cost_centre UNION ALL SELECT 'customer_success' AS cost_centre UNION ALL SELECT 'support' AS cost_centre UNION ALL SELECT 'engineering' AS cost_centre UNION ALL SELECT 'product' AS cost_centre UNION ALL SELECT 'finance' AS cost_centre UNION ALL SELECT 'people' AS cost_centre UNION ALL SELECT 'services' AS cost_centre UNION ALL SELECT 'partnerships' AS cost_centre UNION ALL SELECT 'general' AS cost_centre) _d
    description: "Staged dataset for gasp_cac_by_cost_centre: one row per reporting period and cost_centre value holding the metric value, computed by the GASP compiled query (needs total)."
    primary_key:
      - period_start
      - cost_centre
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: cost_centre
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: cost_centre
        datatype: String
        description: Department or team that incurred the cost
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: CAC (Customer Acquisition Cost), by_cost_centre breakdown for the period and cost_centre
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_cac_by_cost_centre\",\"reason\":\"total\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.cost_centre AS cost_centre, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'gtm' AND cost_centre = _d.cost_centre) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'marketing' AS cost_centre UNION ALL SELECT 'sales' AS cost_centre UNION ALL SELECT 'customer_success' AS cost_centre UNION ALL SELECT 'support' AS cost_centre UNION ALL SELECT 'engineering' AS cost_centre UNION ALL SELECT 'product' AS cost_centre UNION ALL SELECT 'finance' AS cost_centre UNION ALL SELECT 'people' AS cost_centre UNION ALL SELECT 'services' AS cost_centre UNION ALL SELECT 'partnerships' AS cost_centre UNION ALL SELECT 'general' AS cost_centre) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.cost_centre AS cost_centre, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'gtm' AND cost_centre = _d.cost_centre) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'marketing' AS cost_centre UNION ALL SELECT 'sales' AS cost_centre UNION ALL SELECT 'customer_success' AS cost_centre UNION ALL SELECT 'support' AS cost_centre UNION ALL SELECT 'engineering' AS cost_centre UNION ALL SELECT 'product' AS cost_centre UNION ALL SELECT 'finance' AS cost_centre UNION ALL SELECT 'people' AS cost_centre UNION ALL SELECT 'services' AS cost_centre UNION ALL SELECT 'partnerships' AS cost_centre UNION ALL SELECT 'general' AS cost_centre) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.cost_centre AS cost_centre, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'gtm' AND cost_centre = _d.cost_centre) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'marketing' AS cost_centre UNION ALL SELECT 'sales' AS cost_centre UNION ALL SELECT 'customer_success' AS cost_centre UNION ALL SELECT 'support' AS cost_centre UNION ALL SELECT 'engineering' AS cost_centre UNION ALL SELECT 'product' AS cost_centre UNION ALL SELECT 'finance' AS cost_centre UNION ALL SELECT 'people' AS cost_centre UNION ALL SELECT 'services' AS cost_centre UNION ALL SELECT 'partnerships' AS cost_centre UNION ALL SELECT 'general' AS cost_centre) _d\"}}"
  - name: gasp_staged_gasp_ltv
    source: SELECT p.period_start, p.period_end, ((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE PRECISION) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_ltv: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: LTV (Customer Lifetime Value) for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_ltv\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) AS DOUBLE) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) AS FLOAT64) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS FLOAT64) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS FLOAT64) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) AS DOUBLE) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_ltv_o
    source: SELECT p.period_start, p.period_end, ((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST((((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function IN ('support', 'success_engineering', 'implementation', 'onboarding'))) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE PRECISION) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_ltv_o: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: LTV (Customer Lifetime Value), Operating form for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_ltv_o\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST((((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function IN ('support', 'success_engineering', 'implementation', 'onboarding'))) AS DOUBLE) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST((((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function IN ('support', 'success_engineering', 'implementation', 'onboarding'))) AS FLOAT64) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS FLOAT64) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS FLOAT64) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST((((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function IN ('support', 'success_engineering', 'implementation', 'onboarding'))) AS DOUBLE) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_ltv_m
    source: SELECT p.period_start, p.period_end, ((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE PRECISION) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_ltv_m: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: LTV (Customer Lifetime Value), Market form for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_ltv_m\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) AS DOUBLE) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) AS FLOAT64) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS FLOAT64) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS FLOAT64) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) AS DOUBLE) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_ltv_cac_ratio
    source: SELECT p.period_start, p.period_end, ((CAST(((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE PRECISION) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS DOUBLE PRECISION) / NULLIF(((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'gtm') AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')), 0))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_ltv_cac_ratio: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: LTV:CAC Ratio for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_ltv_cac_ratio\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST(((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) AS DOUBLE) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS DOUBLE) / NULLIF(((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'gtm') AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')), 0))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST(((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) AS FLOAT64) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS FLOAT64) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS FLOAT64) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS FLOAT64) / NULLIF(((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'gtm') AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')), 0))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST(((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) AS DOUBLE) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS DOUBLE) / NULLIF(((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'gtm') AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')), 0))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_ltv_cac_ratio_o
    source: SELECT p.period_start, p.period_end, ((CAST(((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST((((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function IN ('support', 'success_engineering', 'implementation', 'onboarding'))) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE PRECISION) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS DOUBLE PRECISION) / NULLIF(((CAST(((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'gtm') + (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function IN ('implementation', 'onboarding'))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')), 0))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_ltv_cac_ratio_o: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: LTV:CAC Ratio, Operating form for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_ltv_cac_ratio_o\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST(((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST((((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function IN ('support', 'success_engineering', 'implementation', 'onboarding'))) AS DOUBLE) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS DOUBLE) / NULLIF(((CAST(((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'gtm') + (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function IN ('implementation', 'onboarding'))) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')), 0))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST(((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST((((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function IN ('support', 'success_engineering', 'implementation', 'onboarding'))) AS FLOAT64) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS FLOAT64) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS FLOAT64) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS FLOAT64) / NULLIF(((CAST(((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'gtm') + (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function IN ('implementation', 'onboarding'))) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')), 0))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST(((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST((((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function IN ('support', 'success_engineering', 'implementation', 'onboarding'))) AS DOUBLE) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS DOUBLE) / NULLIF(((CAST(((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'gtm') + (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function IN ('implementation', 'onboarding'))) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')), 0))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_ltv_cac_ratio_m
    source: SELECT p.period_start, p.period_end, ((CAST(((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE PRECISION) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS DOUBLE PRECISION) / NULLIF(((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'gtm') AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')), 0))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_ltv_cac_ratio_m: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: LTV:CAC Ratio, Market form for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_ltv_cac_ratio_m\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST(((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) AS DOUBLE) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS DOUBLE) / NULLIF(((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'gtm') AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')), 0))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST(((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) AS FLOAT64) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS FLOAT64) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS FLOAT64) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS FLOAT64) / NULLIF(((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'gtm') AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')), 0))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST(((CAST((((CAST(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active')), 0))) * ((CAST(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'infrastructure')) AS DOUBLE) / NULLIF((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end), 0)))) AS DOUBLE) / NULLIF(((CAST((((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn'))) + ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction')))) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))), 0))) AS DOUBLE) / NULLIF(((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'gtm') AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')), 0))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_rule_of_40
    source: SELECT p.period_start, p.period_end, (((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) * 12)) - ((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = (p.period_end - INTERVAL '1 year') AND subscription_status = 'active')) * 12))) AS DOUBLE PRECISION) / NULLIF(((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = (p.period_end - INTERVAL '1 year') AND subscription_status = 'active')) * 12)), 0)) + ((CAST((SELECT SUM(ebitda) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_rule_of_40: one row per reporting period holding the metric value, computed by the GASP compiled query (needs lag)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Rule of 40 for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_rule_of_40\",\"reason\":\"lag\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, (((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) * 12)) - ((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = DATEADD(year, -1, p.period_end) AND subscription_status = 'active')) * 12))) AS DOUBLE) / NULLIF(((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = DATEADD(year, -1, p.period_end) AND subscription_status = 'active')) * 12)), 0)) + ((CAST((SELECT SUM(ebitda) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) AS DOUBLE) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, (((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) * 12)) - ((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = DATE_SUB(p.period_end, INTERVAL 1 YEAR) AND subscription_status = 'active')) * 12))) AS FLOAT64) / NULLIF(((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = DATE_SUB(p.period_end, INTERVAL 1 YEAR) AND subscription_status = 'active')) * 12)), 0)) + ((CAST((SELECT SUM(ebitda) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) AS FLOAT64) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, (((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) * 12)) - ((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = DATEADD(YEAR, -1, p.period_end) AND subscription_status = 'active')) * 12))) AS DOUBLE) / NULLIF(((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = DATEADD(YEAR, -1, p.period_end) AND subscription_status = 'active')) * 12)), 0)) + ((CAST((SELECT SUM(ebitda) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end) AS DOUBLE) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_partner_tier_distribution
    source: SELECT p.period_start, p.period_end, _d.partner_tier AS partner_tier, ((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND partner_tier = _d.partner_tier) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'registered' AS partner_tier UNION ALL SELECT 'silver' AS partner_tier UNION ALL SELECT 'gold' AS partner_tier UNION ALL SELECT 'platinum' AS partner_tier) _d
    description: "Staged dataset for gasp_partner_tier_distribution: one row per reporting period and partner_tier value holding the metric value, computed by the GASP compiled query (needs total)."
    primary_key:
      - period_start
      - partner_tier
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: partner_tier
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: partner_tier
        datatype: String
        description: Partner programme tier
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Partner Tier Distribution for the period and partner_tier
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_partner_tier_distribution\",\"reason\":\"total\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.partner_tier AS partner_tier, ((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND partner_tier = _d.partner_tier) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'registered' AS partner_tier UNION ALL SELECT 'silver' AS partner_tier UNION ALL SELECT 'gold' AS partner_tier UNION ALL SELECT 'platinum' AS partner_tier) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.partner_tier AS partner_tier, ((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND partner_tier = _d.partner_tier) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'registered' AS partner_tier UNION ALL SELECT 'silver' AS partner_tier UNION ALL SELECT 'gold' AS partner_tier UNION ALL SELECT 'platinum' AS partner_tier) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.partner_tier AS partner_tier, ((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND partner_tier = _d.partner_tier) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'registered' AS partner_tier UNION ALL SELECT 'silver' AS partner_tier UNION ALL SELECT 'gold' AS partner_tier UNION ALL SELECT 'platinum' AS partner_tier) _d\"}}"
  - name: gasp_staged_gasp_partner_activation_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND ((partner_recruited_date >= p.period_start AND partner_recruited_date <= p.period_end) AND partner_status = 'active')) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_recruited_date >= p.period_start AND partner_recruited_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_partner_activation_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Partner Activation Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_partner_activation_rate\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND ((partner_recruited_date >= p.period_start AND partner_recruited_date <= p.period_end) AND partner_status = 'active')) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_recruited_date >= p.period_start AND partner_recruited_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND ((partner_recruited_date >= p.period_start AND partner_recruited_date <= p.period_end) AND partner_status = 'active')) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_recruited_date >= p.period_start AND partner_recruited_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND ((partner_recruited_date >= p.period_start AND partner_recruited_date <= p.period_end) AND partner_status = 'active')) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_recruited_date >= p.period_start AND partner_recruited_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_partner_churn_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_churn_date >= p.period_start AND partner_churn_date <= p.period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_start AND partner_status = 'active'), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_partner_churn_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start, period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Partner Churn Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_partner_churn_rate\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_churn_date >= p.period_start AND partner_churn_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_start AND partner_status = 'active'), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_churn_date >= p.period_start AND partner_churn_date <= p.period_end)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_start AND partner_status = 'active'), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_churn_date >= p.period_start AND partner_churn_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_start AND partner_status = 'active'), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_partner_churn_rate_by_partner_tier
    source: SELECT p.period_start, p.period_end, _d.partner_tier AS partner_tier, ((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_churn_date >= p.period_start AND partner_churn_date <= p.period_end) AND partner_tier = _d.partner_tier) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_start AND partner_status = 'active' AND partner_tier = _d.partner_tier), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'registered' AS partner_tier UNION ALL SELECT 'silver' AS partner_tier UNION ALL SELECT 'gold' AS partner_tier UNION ALL SELECT 'platinum' AS partner_tier) _d
    description: "Staged dataset for gasp_partner_churn_rate_by_partner_tier: one row per reporting period and partner_tier value holding the metric value, computed by the GASP compiled query (needs at period_start, period bound in filter)."
    primary_key:
      - period_start
      - partner_tier
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: partner_tier
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: partner_tier
        datatype: String
        description: Partner programme tier
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Partner Churn Rate, by_partner_tier breakdown for the period and partner_tier
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_partner_churn_rate_by_partner_tier\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.partner_tier AS partner_tier, ((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_churn_date >= p.period_start AND partner_churn_date <= p.period_end) AND partner_tier = _d.partner_tier) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_start AND partner_status = 'active' AND partner_tier = _d.partner_tier), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'registered' AS partner_tier UNION ALL SELECT 'silver' AS partner_tier UNION ALL SELECT 'gold' AS partner_tier UNION ALL SELECT 'platinum' AS partner_tier) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.partner_tier AS partner_tier, ((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_churn_date >= p.period_start AND partner_churn_date <= p.period_end) AND partner_tier = _d.partner_tier) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_start AND partner_status = 'active' AND partner_tier = _d.partner_tier), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'registered' AS partner_tier UNION ALL SELECT 'silver' AS partner_tier UNION ALL SELECT 'gold' AS partner_tier UNION ALL SELECT 'platinum' AS partner_tier) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.partner_tier AS partner_tier, ((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_churn_date >= p.period_start AND partner_churn_date <= p.period_end) AND partner_tier = _d.partner_tier) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_start AND partner_status = 'active' AND partner_tier = _d.partner_tier), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'registered' AS partner_tier UNION ALL SELECT 'silver' AS partner_tier UNION ALL SELECT 'gold' AS partner_tier UNION ALL SELECT 'platinum' AS partner_tier) _d\"}}"
  - name: gasp_staged_gasp_partner_sourced_revenue
    source: SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_partner_sourced_revenue: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Partner-Sourced Revenue for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_partner_sourced_revenue\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_partner_influenced_revenue
    source: SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_partner_influenced_revenue: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Partner-Influenced Revenue for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_partner_influenced_revenue\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_channel_revenue_percentage
    source: SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_channel_revenue_percentage: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Channel Revenue Percentage for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_channel_revenue_percentage\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS DOUBLE) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS FLOAT64) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS DOUBLE) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_partner_revenue_growth
    source: SELECT p.period_start, p.period_end, ((CAST((((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) - ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = (p.period_end - INTERVAL '1 year') AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= (p.period_start - INTERVAL '1 year') AND close_date <= (p.period_end - INTERVAL '1 year')))))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = (p.period_end - INTERVAL '1 year') AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= (p.period_start - INTERVAL '1 year') AND close_date <= (p.period_end - INTERVAL '1 year'))))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_partner_revenue_growth: one row per reporting period holding the metric value, computed by the GASP compiled query (needs lag, period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Partner Revenue Growth for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_partner_revenue_growth\",\"reason\":\"lag\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) - ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = DATEADD(year, -1, p.period_end) AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= DATEADD(year, -1, p.period_start) AND close_date <= DATEADD(year, -1, p.period_end)))))) AS DOUBLE) / NULLIF(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = DATEADD(year, -1, p.period_end) AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= DATEADD(year, -1, p.period_start) AND close_date <= DATEADD(year, -1, p.period_end))))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) - ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = DATE_SUB(p.period_end, INTERVAL 1 YEAR) AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= DATE_SUB(p.period_start, INTERVAL 1 YEAR) AND close_date <= DATE_SUB(p.period_end, INTERVAL 1 YEAR)))))) AS FLOAT64) / NULLIF(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = DATE_SUB(p.period_end, INTERVAL 1 YEAR) AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= DATE_SUB(p.period_start, INTERVAL 1 YEAR) AND close_date <= DATE_SUB(p.period_end, INTERVAL 1 YEAR))))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) - ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = DATEADD(YEAR, -1, p.period_end) AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= DATEADD(YEAR, -1, p.period_start) AND close_date <= DATEADD(YEAR, -1, p.period_end)))))) AS DOUBLE) / NULLIF(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = DATEADD(YEAR, -1, p.period_end) AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= DATEADD(YEAR, -1, p.period_start) AND close_date <= DATEADD(YEAR, -1, p.period_end))))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_average_partner_revenue
    source: SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND partner_status = 'active')), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_average_partner_revenue: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Average Partner Revenue for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_average_partner_revenue\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND partner_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND partner_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND partner_status = 'active')), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_partner_deal_registration_volume
    source: SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT registration_id) FROM gasp.deal_registration WHERE snapshot_date = p.period_end AND (registration_date >= p.period_start AND registration_date <= p.period_end))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_partner_deal_registration_volume: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Partner Deal Registration Volume for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_partner_deal_registration_volume","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT registration_id) FROM gasp.deal_registration WHERE snapshot_date = p.period_end AND (registration_date >= p.period_start AND registration_date <= p.period_end))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT registration_id) FROM gasp.deal_registration WHERE snapshot_date = p.period_end AND (registration_date >= p.period_start AND registration_date <= p.period_end))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT registration_id) FROM gasp.deal_registration WHERE snapshot_date = p.period_end AND (registration_date >= p.period_start AND registration_date <= p.period_end))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_deal_registration_to_close_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT registration_id) FROM gasp.deal_registration WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT registration_id) FROM gasp.deal_registration WHERE snapshot_date = p.period_end AND (registration_date >= p.period_start AND registration_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_deal_registration_to_close_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Deal Registration-to-Close Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_deal_registration_to_close_rate\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT registration_id) FROM gasp.deal_registration WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT registration_id) FROM gasp.deal_registration WHERE snapshot_date = p.period_end AND (registration_date >= p.period_start AND registration_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT registration_id) FROM gasp.deal_registration WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT registration_id) FROM gasp.deal_registration WHERE snapshot_date = p.period_end AND (registration_date >= p.period_start AND registration_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT registration_id) FROM gasp.deal_registration WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT registration_id) FROM gasp.deal_registration WHERE snapshot_date = p.period_end AND (registration_date >= p.period_start AND registration_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_partner_win_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage IN ('closed_won', 'closed_lost')) AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_partner_win_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Partner Win Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_partner_win_rate\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage IN ('closed_won', 'closed_lost')) AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS FLOAT64) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage IN ('closed_won', 'closed_lost')) AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage IN ('closed_won', 'closed_lost')) AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_partner_deal_size
    source: SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_partner_deal_size: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Partner Deal Size for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_partner_deal_size\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS DOUBLE) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS FLOAT64) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS DOUBLE) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_partner_sales_cycle
    source: SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (close_date - registration_date)) FROM gasp.deal_registration WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_partner_sales_cycle: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Partner Sales Cycle for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_partner_sales_cycle\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY DATEDIFF(day, registration_date, close_date)) FROM gasp.deal_registration WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((SELECT APPROX_QUANTILES(DATE_DIFF(close_date, registration_date, DAY), 1000)[OFFSET(500)] FROM gasp.deal_registration WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE(DATEDIFF(close_date, registration_date), 0.5) FROM gasp.deal_registration WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_partner_margin_commission
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'partner_commission') AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_partner_margin_commission: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Partner Margin / Commission for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_partner_margin_commission\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'partner_commission') AS DOUBLE) / NULLIF(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'partner_commission') AS FLOAT64) / NULLIF(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'partner_commission') AS DOUBLE) / NULLIF(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_cost_of_partner_acquisition
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'partner_program') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_recruited_date >= p.period_start AND partner_recruited_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_cost_of_partner_acquisition: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Cost of Partner Acquisition for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_cost_of_partner_acquisition\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'partner_program') AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_recruited_date >= p.period_start AND partner_recruited_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'partner_program') AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_recruited_date >= p.period_start AND partner_recruited_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'partner_program') AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_recruited_date >= p.period_start AND partner_recruited_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_partner_lifetime_value
    source: SELECT p.period_start, p.period_end, ((CAST(((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND partner_status = 'active')), 0))) AS DOUBLE PRECISION) / NULLIF(((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_churn_date >= p.period_start AND partner_churn_date <= p.period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_start AND partner_status = 'active'), 0))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_partner_lifetime_value: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start, period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Partner Lifetime Value for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_partner_lifetime_value\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST(((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND partner_status = 'active')), 0))) AS DOUBLE) / NULLIF(((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_churn_date >= p.period_start AND partner_churn_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_start AND partner_status = 'active'), 0))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST(((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND partner_status = 'active')), 0))) AS FLOAT64) / NULLIF(((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_churn_date >= p.period_start AND partner_churn_date <= p.period_end)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_start AND partner_status = 'active'), 0))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST(((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_id IS NOT NULL AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND partner_status = 'active')), 0))) AS DOUBLE) / NULLIF(((CAST((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_end AND (partner_churn_date >= p.period_start AND partner_churn_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT partner_id) FROM gasp.partner WHERE snapshot_date = p.period_start AND partner_status = 'active'), 0))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_partner_roi
    source: SELECT p.period_start, p.period_end, ((CAST((((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'partner_program')) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'partner_program'), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_partner_roi: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Partner ROI for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_partner_roi\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'partner_program')) AS DOUBLE) / NULLIF((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'partner_program'), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'partner_program')) AS FLOAT64) / NULLIF((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'partner_program'), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((partner_sourced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) - (SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'partner_program')) AS DOUBLE) / NULLIF((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'partner_program'), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_marketplace_revenue
    source: SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((channel = 'marketplace' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_marketplace_revenue: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Marketplace Revenue for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_marketplace_revenue\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((channel = 'marketplace' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((channel = 'marketplace' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((channel = 'marketplace' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_marketplace_as_of_revenue
    source: SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((channel = 'marketplace' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_marketplace_as_of_revenue: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Marketplace as % of Revenue for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_marketplace_as_of_revenue\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((channel = 'marketplace' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS DOUBLE) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((channel = 'marketplace' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS FLOAT64) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((channel = 'marketplace' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS DOUBLE) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_pipeline_velocity
    source: SELECT p.period_start, p.period_end, ((CAST((((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND opportunity_stage NOT IN ('closed_won', 'closed_lost')) * ((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= p.period_start AND close_date <= p.period_end))), 0)))) * ((CAST((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))), 0)))) AS DOUBLE PRECISION) / NULLIF(((SELECT AVG((close_date - opportunity_created_date)) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_pipeline_velocity: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Pipeline Velocity for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_pipeline_velocity\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND opportunity_stage NOT IN ('closed_won', 'closed_lost')) * ((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= p.period_start AND close_date <= p.period_end))), 0)))) * ((CAST((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))), 0)))) AS DOUBLE) / NULLIF(((SELECT AVG(DATEDIFF(day, opportunity_created_date, close_date)) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND opportunity_stage NOT IN ('closed_won', 'closed_lost')) * ((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS FLOAT64) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= p.period_start AND close_date <= p.period_end))), 0)))) * ((CAST((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS FLOAT64) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))), 0)))) AS FLOAT64) / NULLIF(((SELECT AVG(DATE_DIFF(close_date, opportunity_created_date, DAY)) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND opportunity_stage NOT IN ('closed_won', 'closed_lost')) * ((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= p.period_start AND close_date <= p.period_end))), 0)))) * ((CAST((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))), 0)))) AS DOUBLE) / NULLIF(((SELECT AVG(DATEDIFF(close_date, opportunity_created_date)) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_win_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_win_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Win Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_win_rate\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS FLOAT64) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_win_rate_by_channel
    source: SELECT p.period_start, p.period_end, _d.channel AS channel, ((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)) AND channel = _d.channel) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= p.period_start AND close_date <= p.period_end)) AND channel = _d.channel), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'paid_ads' AS channel UNION ALL SELECT 'organic_search' AS channel UNION ALL SELECT 'email' AS channel UNION ALL SELECT 'events' AS channel UNION ALL SELECT 'content' AS channel UNION ALL SELECT 'referral' AS channel UNION ALL SELECT 'marketplace' AS channel UNION ALL SELECT 'direct' AS channel UNION ALL SELECT 'other' AS channel) _d
    description: "Staged dataset for gasp_win_rate_by_channel: one row per reporting period and channel value holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
      - channel
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: channel
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: channel
        datatype: String
        description: "Marketing channel: the channel a campaign runs in, and the first-touch channel of an opportunity"
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Win Rate, by_channel breakdown for the period and channel
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_win_rate_by_channel\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.channel AS channel, ((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)) AND channel = _d.channel) AS DOUBLE) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= p.period_start AND close_date <= p.period_end)) AND channel = _d.channel), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'paid_ads' AS channel UNION ALL SELECT 'organic_search' AS channel UNION ALL SELECT 'email' AS channel UNION ALL SELECT 'events' AS channel UNION ALL SELECT 'content' AS channel UNION ALL SELECT 'referral' AS channel UNION ALL SELECT 'marketplace' AS channel UNION ALL SELECT 'direct' AS channel UNION ALL SELECT 'other' AS channel) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.channel AS channel, ((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)) AND channel = _d.channel) AS FLOAT64) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= p.period_start AND close_date <= p.period_end)) AND channel = _d.channel), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'paid_ads' AS channel UNION ALL SELECT 'organic_search' AS channel UNION ALL SELECT 'email' AS channel UNION ALL SELECT 'events' AS channel UNION ALL SELECT 'content' AS channel UNION ALL SELECT 'referral' AS channel UNION ALL SELECT 'marketplace' AS channel UNION ALL SELECT 'direct' AS channel UNION ALL SELECT 'other' AS channel) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.channel AS channel, ((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)) AND channel = _d.channel) AS DOUBLE) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= p.period_start AND close_date <= p.period_end)) AND channel = _d.channel), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'paid_ads' AS channel UNION ALL SELECT 'organic_search' AS channel UNION ALL SELECT 'email' AS channel UNION ALL SELECT 'events' AS channel UNION ALL SELECT 'content' AS channel UNION ALL SELECT 'referral' AS channel UNION ALL SELECT 'marketplace' AS channel UNION ALL SELECT 'direct' AS channel UNION ALL SELECT 'other' AS channel) _d\"}}"
  - name: gasp_staged_gasp_lead_to_opportunity_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_created_date >= p.period_start AND opportunity_created_date <= p.period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_lead_to_opportunity_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Lead-to-Opportunity Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_lead_to_opportunity_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_created_date >= p.period_start AND opportunity_created_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_created_date >= p.period_start AND opportunity_created_date <= p.period_end)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_created_date >= p.period_start AND opportunity_created_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_opportunity_to_close_rate
    source: SELECT p.period_start, p.period_end, (((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= p.period_start AND close_date <= p.period_end))), 0)))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_opportunity_to_close_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Opportunity-to-Close Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_opportunity_to_close_rate\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, (((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= p.period_start AND close_date <= p.period_end))), 0)))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, (((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS FLOAT64) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= p.period_start AND close_date <= p.period_end))), 0)))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, (((CAST((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage IN ('closed_won', 'closed_lost') AND (close_date >= p.period_start AND close_date <= p.period_end))), 0)))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_average_deal_size
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_average_deal_size: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Average Deal Size for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_average_deal_size\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS FLOAT64) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_sales_cycle
    source: SELECT p.period_start, p.period_end, ((SELECT AVG((close_date - opportunity_created_date)) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_sales_cycle: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Sales Cycle Length for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_sales_cycle\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((SELECT AVG(DATEDIFF(day, opportunity_created_date, close_date)) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((SELECT AVG(DATE_DIFF(close_date, opportunity_created_date, DAY)) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((SELECT AVG(DATEDIFF(close_date, opportunity_created_date)) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_sales_cycle_median
    source: SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (close_date - opportunity_created_date)) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_sales_cycle_median: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Sales Cycle Length, median variant for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_sales_cycle_median\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY DATEDIFF(day, opportunity_created_date, close_date)) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((SELECT APPROX_QUANTILES(DATE_DIFF(close_date, opportunity_created_date, DAY), 1000)[OFFSET(500)] FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE(DATEDIFF(close_date, opportunity_created_date), 0.5) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_services_attach_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((includes_services = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_services_attach_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Services Attach Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_services_attach_rate\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((includes_services = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((includes_services = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((includes_services = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_services_backlog
    source: SELECT p.period_start, p.period_end, (((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (revenue_type = 'services' AND opportunity_stage = 'closed_won')) - ((SELECT SUM(revenue) FROM gasp.financials WHERE period_start <= p.period_end AND revenue_type = 'services')))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_services_backlog: one row per reporting period holding the metric value, computed by the GASP compiled query (needs to_date)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Services Backlog for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_services_backlog\",\"reason\":\"to_date\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, (((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (revenue_type = 'services' AND opportunity_stage = 'closed_won')) - ((SELECT SUM(revenue) FROM gasp.financials WHERE period_start <= p.period_end AND revenue_type = 'services')))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, (((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (revenue_type = 'services' AND opportunity_stage = 'closed_won')) - ((SELECT SUM(revenue) FROM gasp.financials WHERE period_start <= p.period_end AND revenue_type = 'services')))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, (((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (revenue_type = 'services' AND opportunity_stage = 'closed_won')) - ((SELECT SUM(revenue) FROM gasp.financials WHERE period_start <= p.period_end AND revenue_type = 'services')))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_project_margin
    source: SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(project_revenue) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)) - (SELECT SUM(project_cost) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(project_revenue) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_project_margin: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Project Margin for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_project_margin","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(project_revenue) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)) - (SELECT SUM(project_cost) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT SUM(project_revenue) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(project_revenue) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)) - (SELECT SUM(project_cost) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end))) AS FLOAT64) / NULLIF((SELECT SUM(project_revenue) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(project_revenue) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)) - (SELECT SUM(project_cost) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT SUM(project_revenue) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_on_time_delivery
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND ((project_completion_date >= p.period_start AND project_completion_date <= p.period_end) AND project_completion_date <= target_date)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_on_time_delivery: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: On-Time Delivery for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_on_time_delivery","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND ((project_completion_date >= p.period_start AND project_completion_date <= p.period_end) AND project_completion_date <= target_date)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND ((project_completion_date >= p.period_start AND project_completion_date <= p.period_end) AND project_completion_date <= target_date)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND ((project_completion_date >= p.period_start AND project_completion_date <= p.period_end) AND project_completion_date <= target_date)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_on_budget_delivery
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND ((project_completion_date >= p.period_start AND project_completion_date <= p.period_end) AND hours_actual <= hours_budgeted)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_on_budget_delivery: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: On-Budget Delivery for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_on_budget_delivery","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND ((project_completion_date >= p.period_start AND project_completion_date <= p.period_end) AND hours_actual <= hours_budgeted)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND ((project_completion_date >= p.period_start AND project_completion_date <= p.period_end) AND hours_actual <= hours_budgeted)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND ((project_completion_date >= p.period_start AND project_completion_date <= p.period_end) AND hours_actual <= hours_budgeted)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_project_duration_accuracy
    source: SELECT p.period_start, p.period_end, ((SELECT AVG((CAST((target_date - project_start_date) AS DOUBLE PRECISION) / NULLIF((project_completion_date - project_start_date), 0))) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_project_duration_accuracy: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Project Duration Accuracy for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_project_duration_accuracy","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((SELECT AVG((CAST(DATEDIFF(day, project_start_date, target_date) AS DOUBLE) / NULLIF(DATEDIFF(day, project_start_date, project_completion_date), 0))) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((SELECT AVG((CAST(DATE_DIFF(target_date, project_start_date, DAY) AS FLOAT64) / NULLIF(DATE_DIFF(project_completion_date, project_start_date, DAY), 0))) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((SELECT AVG((CAST(DATEDIFF(target_date, project_start_date) AS DOUBLE) / NULLIF(DATEDIFF(project_completion_date, project_start_date), 0))) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_reference_ability
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND ((project_completion_date >= p.period_start AND project_completion_date <= p.period_end) AND referenceable = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_reference_ability: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Reference-ability for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_reference_ability","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND ((project_completion_date >= p.period_start AND project_completion_date <= p.period_end) AND referenceable = TRUE)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND ((project_completion_date >= p.period_start AND project_completion_date <= p.period_end) AND referenceable = TRUE)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND ((project_completion_date >= p.period_start AND project_completion_date <= p.period_end) AND referenceable = TRUE)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_projects_per_consultant
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT consultant_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_projects_per_consultant: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Projects per Consultant for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_projects_per_consultant","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT consultant_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT consultant_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT consultant_id) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_average_project_duration
    source: SELECT p.period_start, p.period_end, ((SELECT AVG((project_completion_date - project_start_date)) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_average_project_duration: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Average Project Duration for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_average_project_duration","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((SELECT AVG(DATEDIFF(day, project_start_date, project_completion_date)) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((SELECT AVG(DATE_DIFF(project_completion_date, project_start_date, DAY)) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((SELECT AVG(DATEDIFF(project_completion_date, project_start_date)) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_completion_date >= p.period_start AND project_completion_date <= p.period_end))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_services_win_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((revenue_type = 'services' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((revenue_type = 'services' AND opportunity_stage IN ('closed_won', 'closed_lost')) AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_services_win_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Services Win Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_services_win_rate\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((revenue_type = 'services' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((revenue_type = 'services' AND opportunity_stage IN ('closed_won', 'closed_lost')) AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((revenue_type = 'services' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((revenue_type = 'services' AND opportunity_stage IN ('closed_won', 'closed_lost')) AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((revenue_type = 'services' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((revenue_type = 'services' AND opportunity_stage IN ('closed_won', 'closed_lost')) AND (close_date >= p.period_start AND close_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_time_to_start
    source: SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (project_start_date - close_date)) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_start_date >= p.period_start AND project_start_date <= p.period_end))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_time_to_start: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Time to Start for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_time_to_start","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY DATEDIFF(day, close_date, project_start_date)) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_start_date >= p.period_start AND project_start_date <= p.period_end))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((SELECT APPROX_QUANTILES(DATE_DIFF(project_start_date, close_date, DAY), 1000)[OFFSET(500)] FROM gasp.project WHERE snapshot_date = p.period_end AND (project_start_date >= p.period_start AND project_start_date <= p.period_end))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE(DATEDIFF(project_start_date, close_date), 0.5) FROM gasp.project WHERE snapshot_date = p.period_end AND (project_start_date >= p.period_start AND project_start_date <= p.period_end))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_ticket_backlog
    source: SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT ticket_id) FROM gasp.ticket WHERE created_at < (p.period_end + INTERVAL '1 day') AND ticket_status IN ('open', 'pending'))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_ticket_backlog: one row per reporting period holding the metric value, computed by the GASP compiled query (needs to_date)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Ticket Backlog for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_ticket_backlog\",\"reason\":\"to_date\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT ticket_id) FROM gasp.ticket WHERE created_at < DATEADD(day, 1, p.period_end) AND ticket_status IN ('open', 'pending'))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT ticket_id) FROM gasp.ticket WHERE created_at < TIMESTAMP(DATE_ADD(p.period_end, INTERVAL 1 DAY)) AND ticket_status IN ('open', 'pending'))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT ticket_id) FROM gasp.ticket WHERE created_at < DATEADD(DAY, 1, p.period_end) AND ticket_status IN ('open', 'pending'))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_ticket_distribution_by_type
    source: SELECT p.period_start, p.period_end, _d.ticket_type AS ticket_type, ((CAST((SELECT COUNT(DISTINCT ticket_id) FROM gasp.ticket WHERE created_at >= p.period_start AND created_at < (p.period_end + INTERVAL '1 day') AND ticket_type = _d.ticket_type) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT ticket_id) FROM gasp.ticket WHERE created_at >= p.period_start AND created_at < (p.period_end + INTERVAL '1 day'))), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'how_to' AS ticket_type UNION ALL SELECT 'bug' AS ticket_type UNION ALL SELECT 'billing' AS ticket_type UNION ALL SELECT 'account' AS ticket_type UNION ALL SELECT 'feature_request' AS ticket_type UNION ALL SELECT 'other' AS ticket_type) _d
    description: "Staged dataset for gasp_ticket_distribution_by_type: one row per reporting period and ticket_type value holding the metric value, computed by the GASP compiled query (needs total)."
    primary_key:
      - period_start
      - ticket_type
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: ticket_type
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: ticket_type
        datatype: String
        description: Ticket category the agent or the help desk assigns
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Ticket Distribution by Type for the period and ticket_type
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_ticket_distribution_by_type\",\"reason\":\"total\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.ticket_type AS ticket_type, ((CAST((SELECT COUNT(DISTINCT ticket_id) FROM gasp.ticket WHERE created_at >= p.period_start AND created_at < DATEADD(day, 1, p.period_end) AND ticket_type = _d.ticket_type) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT ticket_id) FROM gasp.ticket WHERE created_at >= p.period_start AND created_at < DATEADD(day, 1, p.period_end))), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'how_to' AS ticket_type UNION ALL SELECT 'bug' AS ticket_type UNION ALL SELECT 'billing' AS ticket_type UNION ALL SELECT 'account' AS ticket_type UNION ALL SELECT 'feature_request' AS ticket_type UNION ALL SELECT 'other' AS ticket_type) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.ticket_type AS ticket_type, ((CAST((SELECT COUNT(DISTINCT ticket_id) FROM gasp.ticket WHERE created_at >= TIMESTAMP(p.period_start) AND created_at < TIMESTAMP(DATE_ADD(p.period_end, INTERVAL 1 DAY)) AND ticket_type = _d.ticket_type) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT ticket_id) FROM gasp.ticket WHERE created_at >= TIMESTAMP(p.period_start) AND created_at < TIMESTAMP(DATE_ADD(p.period_end, INTERVAL 1 DAY)))), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'how_to' AS ticket_type UNION ALL SELECT 'bug' AS ticket_type UNION ALL SELECT 'billing' AS ticket_type UNION ALL SELECT 'account' AS ticket_type UNION ALL SELECT 'feature_request' AS ticket_type UNION ALL SELECT 'other' AS ticket_type) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.ticket_type AS ticket_type, ((CAST((SELECT COUNT(DISTINCT ticket_id) FROM gasp.ticket WHERE created_at >= p.period_start AND created_at < DATEADD(DAY, 1, p.period_end) AND ticket_type = _d.ticket_type) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT ticket_id) FROM gasp.ticket WHERE created_at >= p.period_start AND created_at < DATEADD(DAY, 1, p.period_end))), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'how_to' AS ticket_type UNION ALL SELECT 'bug' AS ticket_type UNION ALL SELECT 'billing' AS ticket_type UNION ALL SELECT 'account' AS ticket_type UNION ALL SELECT 'feature_request' AS ticket_type UNION ALL SELECT 'other' AS ticket_type) _d\"}}"
  - name: gasp_staged_gasp_logo_retention_rate
    source: SELECT p.period_start, p.period_end, ((1 - ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_logo_retention_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Logo Retention Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_logo_retention_rate\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((1 - ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((1 - ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn')) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((1 - ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active')), 0))))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_logo_retention_rate_customer_counts
    source: SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active') - (SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_logo_retention_rate_customer_counts: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Logo Retention Rate, customer_counts variant for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_logo_retention_rate_customer_counts\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active') - (SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active') - (SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND customer_status = 'active') - (SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_logo_retention_rate_by_segment
    source: SELECT p.period_start, p.period_end, _d.segment AS segment, ((1 - ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment)) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active' AND segment = _d.segment)), 0))))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.revenue_event WHERE segment IS NOT NULL) _d
    description: "Staged dataset for gasp_logo_retention_rate_by_segment: one row per reporting period and segment value holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
      - segment
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: segment
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: segment
        datatype: String
        description: Customer segment (SMB, Mid-Market, Enterprise or the organisation's own scheme) at the time of the event or snapshot. The field behind the Segment concept; carried on revenue tables so retention and movement metrics slice by it without a join.
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Logo Retention Rate, by_segment breakdown for the period and segment
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_logo_retention_rate_by_segment\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((1 - ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment)) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active' AND segment = _d.segment)), 0))))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.revenue_event WHERE segment IS NOT NULL) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((1 - ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment)) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active' AND segment = _d.segment)), 0))))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.revenue_event WHERE segment IS NOT NULL) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((1 - ((CAST(((SELECT COUNT(DISTINCT customer_id) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn' AND segment = _d.segment)) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active' AND segment = _d.segment)), 0))))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.revenue_event WHERE segment IS NOT NULL) _d\"}}"
  - name: gasp_staged_gasp_at_risk_rate_entered_at_risk
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT customer_id) FROM gasp.lifecycle_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND state_category = 'at_risk') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_at_risk_rate_entered_at_risk: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: At-Risk Customer Rate, entered_at_risk variant for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_at_risk_rate_entered_at_risk\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT customer_id) FROM gasp.lifecycle_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND state_category = 'at_risk') AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT customer_id) FROM gasp.lifecycle_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND state_category = 'at_risk') AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT customer_id) FROM gasp.lifecycle_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND state_category = 'at_risk') AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_expansion_rate
    source: SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion')) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_expansion_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Expansion Revenue Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_expansion_rate\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion')) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion')) AS FLOAT64) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion')) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active')), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_expansion_rate_by_segment
    source: SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST(((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion' AND segment = _d.segment)) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.revenue_event WHERE segment IS NOT NULL) _d
    description: "Staged dataset for gasp_expansion_rate_by_segment: one row per reporting period and segment value holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
      - segment
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: segment
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: segment
        datatype: String
        description: Customer segment (SMB, Mid-Market, Enterprise or the organisation's own scheme) at the time of the event or snapshot. The field behind the Segment concept; carried on revenue tables so retention and movement metrics slice by it without a join.
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Expansion Revenue Rate, by_segment breakdown for the period and segment
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_expansion_rate_by_segment\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST(((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion' AND segment = _d.segment)) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.revenue_event WHERE segment IS NOT NULL) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST(((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion' AND segment = _d.segment)) AS FLOAT64) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.revenue_event WHERE segment IS NOT NULL) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.segment AS segment, ((CAST(((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion' AND segment = _d.segment)) AS DOUBLE) / NULLIF(((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_start AND subscription_status = 'active' AND segment = _d.segment)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT segment AS segment FROM gasp.revenue_event WHERE segment IS NOT NULL) _d\"}}"
  - name: gasp_staged_gasp_upsell_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT customer_id) FROM gasp.amendment_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND amendment_type = 'upgrade') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND upgrade_eligible = TRUE), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_upsell_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Upsell Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_upsell_rate\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT customer_id) FROM gasp.amendment_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND amendment_type = 'upgrade') AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND upgrade_eligible = TRUE), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT customer_id) FROM gasp.amendment_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND amendment_type = 'upgrade') AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND upgrade_eligible = TRUE), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT customer_id) FROM gasp.amendment_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND amendment_type = 'upgrade') AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND upgrade_eligible = TRUE), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_cross_sell_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT customer_id) FROM gasp.amendment_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND amendment_type = 'cross_sell') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_cross_sell_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Cross-sell Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_cross_sell_rate\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT customer_id) FROM gasp.amendment_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND amendment_type = 'cross_sell') AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT customer_id) FROM gasp.amendment_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND amendment_type = 'cross_sell') AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT customer_id) FROM gasp.amendment_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND amendment_type = 'cross_sell') AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_start AND customer_status = 'active'), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_renewal_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (renewed = TRUE AND (contract_end >= p.period_start AND contract_end <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_renewal_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Renewal Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_renewal_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (renewed = TRUE AND (contract_end >= p.period_start AND contract_end <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (renewed = TRUE AND (contract_end >= p.period_start AND contract_end <= p.period_end))) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (renewed = TRUE AND (contract_end >= p.period_start AND contract_end <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_renewal_rate_by_value
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (renewed = TRUE AND (contract_end >= p.period_start AND contract_end <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_renewal_rate_by_value: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Renewal Rate, by_value variant for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_renewal_rate_by_value","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (renewed = TRUE AND (contract_end >= p.period_start AND contract_end <= p.period_end))) AS DOUBLE) / NULLIF((SELECT SUM(renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (renewed = TRUE AND (contract_end >= p.period_start AND contract_end <= p.period_end))) AS FLOAT64) / NULLIF((SELECT SUM(renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (renewed = TRUE AND (contract_end >= p.period_start AND contract_end <= p.period_end))) AS DOUBLE) / NULLIF((SELECT SUM(renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_renewal_forecast_accuracy
    source: SELECT p.period_start, p.period_end, ((1 - (CAST(ABS(((SELECT SUM(forecast_renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)) - (SELECT SUM(renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND ((contract_end >= p.period_start AND contract_end <= p.period_end) AND renewed = TRUE)))) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND ((contract_end >= p.period_start AND contract_end <= p.period_end) AND renewed = TRUE)), 0)))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_renewal_forecast_accuracy: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Renewal Forecast Accuracy for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_renewal_forecast_accuracy","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((1 - (CAST(ABS(((SELECT SUM(forecast_renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)) - (SELECT SUM(renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND ((contract_end >= p.period_start AND contract_end <= p.period_end) AND renewed = TRUE)))) AS DOUBLE) / NULLIF((SELECT SUM(renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND ((contract_end >= p.period_start AND contract_end <= p.period_end) AND renewed = TRUE)), 0)))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((1 - (CAST(ABS(((SELECT SUM(forecast_renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)) - (SELECT SUM(renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND ((contract_end >= p.period_start AND contract_end <= p.period_end) AND renewed = TRUE)))) AS FLOAT64) / NULLIF((SELECT SUM(renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND ((contract_end >= p.period_start AND contract_end <= p.period_end) AND renewed = TRUE)), 0)))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((1 - (CAST(ABS(((SELECT SUM(forecast_renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)) - (SELECT SUM(renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND ((contract_end >= p.period_start AND contract_end <= p.period_end) AND renewed = TRUE)))) AS DOUBLE) / NULLIF((SELECT SUM(renewal_amount) FROM gasp.subscription WHERE snapshot_date = p.period_end AND ((contract_end >= p.period_start AND contract_end <= p.period_end) AND renewed = TRUE)), 0)))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_commit_accuracy
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((forecast_category = 'commit' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND forecast_category = 'commit'), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_commit_accuracy: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Commit Accuracy for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_commit_accuracy\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((forecast_category = 'commit' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND forecast_category = 'commit'), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((forecast_category = 'commit' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND forecast_category = 'commit'), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((forecast_category = 'commit' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND forecast_category = 'commit'), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_quote_volume
    source: SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT quote_id) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < (p.period_end + INTERVAL '1 day')))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_quote_volume: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Quote Volume for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_quote_volume","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT quote_id) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < DATEADD(day, 1, p.period_end)))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT quote_id) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= TIMESTAMP(p.period_start) AND quote_sent_at < TIMESTAMP(DATE_ADD(p.period_end, INTERVAL 1 DAY))))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT quote_id) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < DATEADD(DAY, 1, p.period_end)))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_quote_to_order_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT order_id) FROM gasp.order WHERE snapshot_date = p.period_end AND (order_completed_at >= p.period_start AND order_completed_at < (p.period_end + INTERVAL '1 day'))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT quote_id) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < (p.period_end + INTERVAL '1 day'))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_quote_to_order_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Quote-to-Order Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_quote_to_order_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT order_id) FROM gasp.order WHERE snapshot_date = p.period_end AND (order_completed_at >= p.period_start AND order_completed_at < DATEADD(day, 1, p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT quote_id) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < DATEADD(day, 1, p.period_end))), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT order_id) FROM gasp.order WHERE snapshot_date = p.period_end AND (order_completed_at >= TIMESTAMP(p.period_start) AND order_completed_at < TIMESTAMP(DATE_ADD(p.period_end, INTERVAL 1 DAY)))) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT quote_id) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= TIMESTAMP(p.period_start) AND quote_sent_at < TIMESTAMP(DATE_ADD(p.period_end, INTERVAL 1 DAY)))), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT order_id) FROM gasp.order WHERE snapshot_date = p.period_end AND (order_completed_at >= p.period_start AND order_completed_at < DATEADD(DAY, 1, p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT quote_id) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < DATEADD(DAY, 1, p.period_end))), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_quote_cycle_time
    source: SELECT p.period_start, p.period_end, (((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (EXTRACT(EPOCH FROM (quote_sent_at - quote_requested_at)) / 86400.0)) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < (p.period_end + INTERVAL '1 day'))) * 24)) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_quote_cycle_time: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Quote Cycle Time for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_quote_cycle_time","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, (((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (DATEDIFF(second, quote_requested_at, quote_sent_at) / 86400.0)) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < DATEADD(day, 1, p.period_end))) * 24)) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, (((SELECT APPROX_QUANTILES((TIMESTAMP_DIFF(quote_sent_at, quote_requested_at, SECOND) / 86400.0), 1000)[OFFSET(500)] FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= TIMESTAMP(p.period_start) AND quote_sent_at < TIMESTAMP(DATE_ADD(p.period_end, INTERVAL 1 DAY)))) * 24)) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, (((SELECT PERCENTILE((TIMESTAMPDIFF(SECOND, quote_requested_at, quote_sent_at) / 86400.0), 0.5) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < DATEADD(DAY, 1, p.period_end))) * 24)) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_quote_accuracy
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT quote_id) FROM gasp.quote WHERE snapshot_date = p.period_end AND ((quote_sent_at >= p.period_start AND quote_sent_at < (p.period_end + INTERVAL '1 day')) AND revision_count = 0)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT quote_id) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < (p.period_end + INTERVAL '1 day'))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_quote_accuracy: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Quote Accuracy for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_quote_accuracy","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT quote_id) FROM gasp.quote WHERE snapshot_date = p.period_end AND ((quote_sent_at >= p.period_start AND quote_sent_at < DATEADD(day, 1, p.period_end)) AND revision_count = 0)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT quote_id) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < DATEADD(day, 1, p.period_end))), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT quote_id) FROM gasp.quote WHERE snapshot_date = p.period_end AND ((quote_sent_at >= TIMESTAMP(p.period_start) AND quote_sent_at < TIMESTAMP(DATE_ADD(p.period_end, INTERVAL 1 DAY))) AND revision_count = 0)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT quote_id) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= TIMESTAMP(p.period_start) AND quote_sent_at < TIMESTAMP(DATE_ADD(p.period_end, INTERVAL 1 DAY)))), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT quote_id) FROM gasp.quote WHERE snapshot_date = p.period_end AND ((quote_sent_at >= p.period_start AND quote_sent_at < DATEADD(DAY, 1, p.period_end)) AND revision_count = 0)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT quote_id) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < DATEADD(DAY, 1, p.period_end))), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_discount_rate
    source: SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(list_price) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < (p.period_end + INTERVAL '1 day'))) - (SELECT SUM(quoted_price) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < (p.period_end + INTERVAL '1 day')))) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(list_price) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < (p.period_end + INTERVAL '1 day'))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_discount_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Discount Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_discount_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(list_price) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < DATEADD(day, 1, p.period_end))) - (SELECT SUM(quoted_price) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < DATEADD(day, 1, p.period_end)))) AS DOUBLE) / NULLIF((SELECT SUM(list_price) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < DATEADD(day, 1, p.period_end))), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(list_price) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= TIMESTAMP(p.period_start) AND quote_sent_at < TIMESTAMP(DATE_ADD(p.period_end, INTERVAL 1 DAY)))) - (SELECT SUM(quoted_price) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= TIMESTAMP(p.period_start) AND quote_sent_at < TIMESTAMP(DATE_ADD(p.period_end, INTERVAL 1 DAY))))) AS FLOAT64) / NULLIF((SELECT SUM(list_price) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= TIMESTAMP(p.period_start) AND quote_sent_at < TIMESTAMP(DATE_ADD(p.period_end, INTERVAL 1 DAY)))), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(list_price) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < DATEADD(DAY, 1, p.period_end))) - (SELECT SUM(quoted_price) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < DATEADD(DAY, 1, p.period_end)))) AS DOUBLE) / NULLIF((SELECT SUM(list_price) FROM gasp.quote WHERE snapshot_date = p.period_end AND (quote_sent_at >= p.period_start AND quote_sent_at < DATEADD(DAY, 1, p.period_end))), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_order_to_activation_time
    source: SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (activation_date - acquisition_date)) FROM gasp.customer WHERE snapshot_date = p.period_end AND (activation_date >= p.period_start AND activation_date <= p.period_end))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_order_to_activation_time: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Order-to-Activation Time for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_order_to_activation_time","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY DATEDIFF(day, acquisition_date, activation_date)) FROM gasp.customer WHERE snapshot_date = p.period_end AND (activation_date >= p.period_start AND activation_date <= p.period_end))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((SELECT APPROX_QUANTILES(DATE_DIFF(activation_date, acquisition_date, DAY), 1000)[OFFSET(500)] FROM gasp.customer WHERE snapshot_date = p.period_end AND (activation_date >= p.period_start AND activation_date <= p.period_end))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE(DATEDIFF(activation_date, acquisition_date), 0.5) FROM gasp.customer WHERE snapshot_date = p.period_end AND (activation_date >= p.period_start AND activation_date <= p.period_end))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_order_processing_time
    source: SELECT p.period_start, p.period_end, (((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (EXTRACT(EPOCH FROM (order_completed_at - order_received_at)) / 86400.0)) FROM gasp.order WHERE snapshot_date = p.period_end AND (order_completed_at >= p.period_start AND order_completed_at < (p.period_end + INTERVAL '1 day'))) * 24)) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_order_processing_time: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Order Processing Time for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_order_processing_time","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, (((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (DATEDIFF(second, order_received_at, order_completed_at) / 86400.0)) FROM gasp.order WHERE snapshot_date = p.period_end AND (order_completed_at >= p.period_start AND order_completed_at < DATEADD(day, 1, p.period_end))) * 24)) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, (((SELECT APPROX_QUANTILES((TIMESTAMP_DIFF(order_completed_at, order_received_at, SECOND) / 86400.0), 1000)[OFFSET(500)] FROM gasp.order WHERE snapshot_date = p.period_end AND (order_completed_at >= TIMESTAMP(p.period_start) AND order_completed_at < TIMESTAMP(DATE_ADD(p.period_end, INTERVAL 1 DAY)))) * 24)) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, (((SELECT PERCENTILE((TIMESTAMPDIFF(SECOND, order_received_at, order_completed_at) / 86400.0), 0.5) FROM gasp.order WHERE snapshot_date = p.period_end AND (order_completed_at >= p.period_start AND order_completed_at < DATEADD(DAY, 1, p.period_end))) * 24)) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_order_error_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT order_id) FROM gasp.order WHERE snapshot_date = p.period_end AND ((order_completed_at >= p.period_start AND order_completed_at < (p.period_end + INTERVAL '1 day')) AND has_error = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT order_id) FROM gasp.order WHERE snapshot_date = p.period_end AND (order_completed_at >= p.period_start AND order_completed_at < (p.period_end + INTERVAL '1 day'))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_order_error_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Order Error Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_order_error_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT order_id) FROM gasp.order WHERE snapshot_date = p.period_end AND ((order_completed_at >= p.period_start AND order_completed_at < DATEADD(day, 1, p.period_end)) AND has_error = TRUE)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT order_id) FROM gasp.order WHERE snapshot_date = p.period_end AND (order_completed_at >= p.period_start AND order_completed_at < DATEADD(day, 1, p.period_end))), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT order_id) FROM gasp.order WHERE snapshot_date = p.period_end AND ((order_completed_at >= TIMESTAMP(p.period_start) AND order_completed_at < TIMESTAMP(DATE_ADD(p.period_end, INTERVAL 1 DAY))) AND has_error = TRUE)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT order_id) FROM gasp.order WHERE snapshot_date = p.period_end AND (order_completed_at >= TIMESTAMP(p.period_start) AND order_completed_at < TIMESTAMP(DATE_ADD(p.period_end, INTERVAL 1 DAY)))), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT order_id) FROM gasp.order WHERE snapshot_date = p.period_end AND ((order_completed_at >= p.period_start AND order_completed_at < DATEADD(DAY, 1, p.period_end)) AND has_error = TRUE)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT order_id) FROM gasp.order WHERE snapshot_date = p.period_end AND (order_completed_at >= p.period_start AND order_completed_at < DATEADD(DAY, 1, p.period_end))), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_billing_accuracy
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND invoice_corrected = FALSE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_billing_accuracy: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Billing Accuracy for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_billing_accuracy","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND invoice_corrected = FALSE)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND invoice_corrected = FALSE)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND invoice_corrected = FALSE)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_invoice_cycle_time
    source: SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (invoice_date - billing_trigger_date)) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_invoice_cycle_time: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Invoice Cycle Time for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_invoice_cycle_time","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY DATEDIFF(day, billing_trigger_date, invoice_date)) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((SELECT APPROX_QUANTILES(DATE_DIFF(invoice_date, billing_trigger_date, DAY), 1000)[OFFSET(500)] FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE(DATEDIFF(invoice_date, billing_trigger_date), 0.5) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_billing_disputes
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND invoice_disputed = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_billing_disputes: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Billing Disputes for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_billing_disputes","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND invoice_disputed = TRUE)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND invoice_disputed = TRUE)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND invoice_disputed = TRUE)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_billing_disputes_by_payment_status
    source: SELECT p.period_start, p.period_end, _d.payment_status AS payment_status, ((CAST((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND invoice_disputed = TRUE) AND payment_status = _d.payment_status) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_status = _d.payment_status), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'paid' AS payment_status UNION ALL SELECT 'unpaid' AS payment_status UNION ALL SELECT 'partial' AS payment_status UNION ALL SELECT 'written_off' AS payment_status) _d
    description: "Staged dataset for gasp_billing_disputes_by_payment_status: one row per reporting period and payment_status value holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
      - payment_status
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: payment_status
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: payment_status
        datatype: String
        description: Payment status
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Billing Disputes, by_payment_status breakdown for the period and payment_status
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_billing_disputes_by_payment_status\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.payment_status AS payment_status, ((CAST((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND invoice_disputed = TRUE) AND payment_status = _d.payment_status) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_status = _d.payment_status), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'paid' AS payment_status UNION ALL SELECT 'unpaid' AS payment_status UNION ALL SELECT 'partial' AS payment_status UNION ALL SELECT 'written_off' AS payment_status) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.payment_status AS payment_status, ((CAST((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND invoice_disputed = TRUE) AND payment_status = _d.payment_status) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_status = _d.payment_status), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'paid' AS payment_status UNION ALL SELECT 'unpaid' AS payment_status UNION ALL SELECT 'partial' AS payment_status UNION ALL SELECT 'written_off' AS payment_status) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.payment_status AS payment_status, ((CAST((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND invoice_disputed = TRUE) AND payment_status = _d.payment_status) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_status = _d.payment_status), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'paid' AS payment_status UNION ALL SELECT 'unpaid' AS payment_status UNION ALL SELECT 'partial' AS payment_status UNION ALL SELECT 'written_off' AS payment_status) _d\"}}"
  - name: gasp_staged_gasp_credit_memo_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND credit_memo_count > 0)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_credit_memo_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Credit Memo Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_credit_memo_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND credit_memo_count > 0)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND credit_memo_count > 0)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND credit_memo_count > 0)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT invoice_id) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_dso
    source: SELECT p.period_start, p.period_end, (((CAST((SELECT SUM(accounts_receivable) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0)) * (p.period_end - p.period_start + 1))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_dso: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period_days)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Days Sales Outstanding (DSO) for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_dso","reason":"period_days","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, (((CAST((SELECT SUM(accounts_receivable) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end) AS DOUBLE) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0)) * (DATEDIFF(day, p.period_start, p.period_end) + 1))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, (((CAST((SELECT SUM(accounts_receivable) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end) AS FLOAT64) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0)) * (DATE_DIFF(p.period_end, p.period_start, DAY) + 1))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, (((CAST((SELECT SUM(accounts_receivable) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end) AS DOUBLE) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0)) * (DATEDIFF(p.period_end, p.period_start) + 1))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_collection_effectiveness_index_cei
    source: SELECT p.period_start, p.period_end, ((CAST((((SELECT SUM(accounts_receivable) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) + (SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))) - (SELECT SUM(accounts_receivable) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end)) AS DOUBLE PRECISION) / NULLIF((((SELECT SUM(accounts_receivable) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) + (SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))) - (SELECT SUM(outstanding_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (snapshot_date - invoice_date) <= 30)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_collection_effectiveness_index_cei: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start, period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Collection Effectiveness Index (CEI) for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_collection_effectiveness_index_cei","reason":"at period_start","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((((SELECT SUM(accounts_receivable) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) + (SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))) - (SELECT SUM(accounts_receivable) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end)) AS DOUBLE) / NULLIF((((SELECT SUM(accounts_receivable) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) + (SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))) - (SELECT SUM(outstanding_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND DATEDIFF(day, invoice_date, snapshot_date) <= 30)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((((SELECT SUM(accounts_receivable) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) + (SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))) - (SELECT SUM(accounts_receivable) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end)) AS FLOAT64) / NULLIF((((SELECT SUM(accounts_receivable) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) + (SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))) - (SELECT SUM(outstanding_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND DATE_DIFF(snapshot_date, invoice_date, DAY) <= 30)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((((SELECT SUM(accounts_receivable) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) + (SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))) - (SELECT SUM(accounts_receivable) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end)) AS DOUBLE) / NULLIF((((SELECT SUM(accounts_receivable) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) + (SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))) - (SELECT SUM(outstanding_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND DATEDIFF(snapshot_date, invoice_date) <= 30)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_aging_buckets
    source: SELECT p.period_start, p.period_end, _d.bucket AS bucket, ((CAST((SELECT SUM(outstanding_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND CASE WHEN (snapshot_date - invoice_date) BETWEEN 0 AND 30 THEN 'current' WHEN (snapshot_date - invoice_date) BETWEEN 31 AND 60 THEN 'days_31_60' WHEN (snapshot_date - invoice_date) BETWEEN 61 AND 90 THEN 'days_61_90' WHEN (snapshot_date - invoice_date) >= 91 THEN 'days_90_plus' END = _d.bucket) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(outstanding_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'current' AS bucket UNION ALL SELECT 'days_31_60' AS bucket UNION ALL SELECT 'days_61_90' AS bucket UNION ALL SELECT 'days_90_plus' AS bucket) _d
    description: "Staged dataset for gasp_aging_buckets: one row per reporting period and bucket value holding the metric value, computed by the GASP compiled query (needs bucket, total)."
    primary_key:
      - period_start
      - bucket
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: bucket
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: bucket
        datatype: String
        description: Bucket label of Aging Buckets
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Aging Buckets for the period and bucket
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_aging_buckets\",\"reason\":\"bucket\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.bucket AS bucket, ((CAST((SELECT SUM(outstanding_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND CASE WHEN DATEDIFF(day, invoice_date, snapshot_date) BETWEEN 0 AND 30 THEN 'current' WHEN DATEDIFF(day, invoice_date, snapshot_date) BETWEEN 31 AND 60 THEN 'days_31_60' WHEN DATEDIFF(day, invoice_date, snapshot_date) BETWEEN 61 AND 90 THEN 'days_61_90' WHEN DATEDIFF(day, invoice_date, snapshot_date) >= 91 THEN 'days_90_plus' END = _d.bucket) AS DOUBLE) / NULLIF((SELECT SUM(outstanding_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'current' AS bucket UNION ALL SELECT 'days_31_60' AS bucket UNION ALL SELECT 'days_61_90' AS bucket UNION ALL SELECT 'days_90_plus' AS bucket) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.bucket AS bucket, ((CAST((SELECT SUM(outstanding_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND CASE WHEN DATE_DIFF(snapshot_date, invoice_date, DAY) BETWEEN 0 AND 30 THEN 'current' WHEN DATE_DIFF(snapshot_date, invoice_date, DAY) BETWEEN 31 AND 60 THEN 'days_31_60' WHEN DATE_DIFF(snapshot_date, invoice_date, DAY) BETWEEN 61 AND 90 THEN 'days_61_90' WHEN DATE_DIFF(snapshot_date, invoice_date, DAY) >= 91 THEN 'days_90_plus' END = _d.bucket) AS FLOAT64) / NULLIF((SELECT SUM(outstanding_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'current' AS bucket UNION ALL SELECT 'days_31_60' AS bucket UNION ALL SELECT 'days_61_90' AS bucket UNION ALL SELECT 'days_90_plus' AS bucket) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.bucket AS bucket, ((CAST((SELECT SUM(outstanding_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND CASE WHEN DATEDIFF(snapshot_date, invoice_date) BETWEEN 0 AND 30 THEN 'current' WHEN DATEDIFF(snapshot_date, invoice_date) BETWEEN 31 AND 60 THEN 'days_31_60' WHEN DATEDIFF(snapshot_date, invoice_date) BETWEEN 61 AND 90 THEN 'days_61_90' WHEN DATEDIFF(snapshot_date, invoice_date) >= 91 THEN 'days_90_plus' END = _d.bucket) AS DOUBLE) / NULLIF((SELECT SUM(outstanding_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'current' AS bucket UNION ALL SELECT 'days_31_60' AS bucket UNION ALL SELECT 'days_61_90' AS bucket UNION ALL SELECT 'days_90_plus' AS bucket) _d\"}}"
  - name: gasp_staged_gasp_payment_method_distribution
    source: SELECT p.period_start, p.period_end, _d.payment_method AS payment_method, ((CAST((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_method = _d.payment_method) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_method IS NOT NULL)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'credit_card' AS payment_method UNION ALL SELECT 'ach' AS payment_method UNION ALL SELECT 'wire' AS payment_method UNION ALL SELECT 'check' AS payment_method UNION ALL SELECT 'other' AS payment_method) _d
    description: "Staged dataset for gasp_payment_method_distribution: one row per reporting period and payment_method value holding the metric value, computed by the GASP compiled query (needs total, period bound in filter)."
    primary_key:
      - period_start
      - payment_method
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: payment_method
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: payment_method
        datatype: String
        description: Payment method
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Payment Method Distribution for the period and payment_method
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_payment_method_distribution\",\"reason\":\"total\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.payment_method AS payment_method, ((CAST((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_method = _d.payment_method) AS DOUBLE) / NULLIF((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_method IS NOT NULL)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'credit_card' AS payment_method UNION ALL SELECT 'ach' AS payment_method UNION ALL SELECT 'wire' AS payment_method UNION ALL SELECT 'check' AS payment_method UNION ALL SELECT 'other' AS payment_method) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.payment_method AS payment_method, ((CAST((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_method = _d.payment_method) AS FLOAT64) / NULLIF((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_method IS NOT NULL)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'credit_card' AS payment_method UNION ALL SELECT 'ach' AS payment_method UNION ALL SELECT 'wire' AS payment_method UNION ALL SELECT 'check' AS payment_method UNION ALL SELECT 'other' AS payment_method) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.payment_method AS payment_method, ((CAST((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_method = _d.payment_method) AS DOUBLE) / NULLIF((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_method IS NOT NULL)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'credit_card' AS payment_method UNION ALL SELECT 'ach' AS payment_method UNION ALL SELECT 'wire' AS payment_method UNION ALL SELECT 'check' AS payment_method UNION ALL SELECT 'other' AS payment_method) _d\"}}"
  - name: gasp_staged_gasp_deferred_revenue_balance
    source: SELECT p.period_start, p.period_end, (((SELECT SUM(billed_amount) FROM gasp.revenue_schedule WHERE period_start <= p.period_end) - (SELECT SUM(recognized_revenue) FROM gasp.revenue_schedule WHERE period_start <= p.period_end))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_deferred_revenue_balance: one row per reporting period holding the metric value, computed by the GASP compiled query (needs to_date)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Deferred Revenue Balance for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_deferred_revenue_balance","reason":"to_date","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, (((SELECT SUM(billed_amount) FROM gasp.revenue_schedule WHERE period_start <= p.period_end) - (SELECT SUM(recognized_revenue) FROM gasp.revenue_schedule WHERE period_start <= p.period_end))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, (((SELECT SUM(billed_amount) FROM gasp.revenue_schedule WHERE period_start <= p.period_end) - (SELECT SUM(recognized_revenue) FROM gasp.revenue_schedule WHERE period_start <= p.period_end))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, (((SELECT SUM(billed_amount) FROM gasp.revenue_schedule WHERE period_start <= p.period_end) - (SELECT SUM(recognized_revenue) FROM gasp.revenue_schedule WHERE period_start <= p.period_end))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_renewal_notification_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND ((contract_end >= p.period_start AND contract_end <= p.period_end) AND renewal_notified_on_time = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_renewal_notification_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Renewal Notification Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_renewal_notification_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND ((contract_end >= p.period_start AND contract_end <= p.period_end) AND renewal_notified_on_time = TRUE)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND ((contract_end >= p.period_start AND contract_end <= p.period_end) AND renewal_notified_on_time = TRUE)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND ((contract_end >= p.period_start AND contract_end <= p.period_end) AND renewal_notified_on_time = TRUE)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_auto_renewal_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND ((contract_end >= p.period_start AND contract_end <= p.period_end) AND auto_renewed = TRUE)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_auto_renewal_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Auto-Renewal Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_auto_renewal_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND ((contract_end >= p.period_start AND contract_end <= p.period_end) AND auto_renewed = TRUE)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND ((contract_end >= p.period_start AND contract_end <= p.period_end) AND auto_renewed = TRUE)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND ((contract_end >= p.period_start AND contract_end <= p.period_end) AND auto_renewed = TRUE)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT subscription_id) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_renewal_processing_time
    source: SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (renewal_complete_date - renewal_trigger_date)) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_renewal_processing_time: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Renewal Processing Time for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_renewal_processing_time","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY DATEDIFF(day, renewal_trigger_date, renewal_complete_date)) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((SELECT APPROX_QUANTILES(DATE_DIFF(renewal_complete_date, renewal_trigger_date, DAY), 1000)[OFFSET(500)] FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE(DATEDIFF(renewal_complete_date, renewal_trigger_date), 0.5) FROM gasp.subscription WHERE snapshot_date = p.period_end AND (contract_end >= p.period_start AND contract_end <= p.period_end))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_daily_active_users_dau
    source: SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > (p.period_end - INTERVAL '1 day') AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_daily_active_users_dau: one row per reporting period holding the metric value, computed by the GASP compiled query (needs window)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Daily Active Users (DAU) for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_daily_active_users_dau\",\"reason\":\"window\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATEADD(day, -1, p.period_end) AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATE_SUB(p.period_end, INTERVAL 1 DAY) AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATEADD(DAY, -1, p.period_end) AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_weekly_active_users_wau
    source: SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > (p.period_end - INTERVAL '7 day') AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_weekly_active_users_wau: one row per reporting period holding the metric value, computed by the GASP compiled query (needs window)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Weekly Active Users (WAU) for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_weekly_active_users_wau\",\"reason\":\"window\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATEADD(day, -7, p.period_end) AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATE_SUB(p.period_end, INTERVAL 7 DAY) AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATEADD(DAY, -7, p.period_end) AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_monthly_active_users_mau
    source: SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > (p.period_end - INTERVAL '30 day') AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_monthly_active_users_mau: one row per reporting period holding the metric value, computed by the GASP compiled query (needs window)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Monthly Active Users (MAU) for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_monthly_active_users_mau\",\"reason\":\"window\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATEADD(day, -30, p.period_end) AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATE_SUB(p.period_end, INTERVAL 30 DAY) AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATEADD(DAY, -30, p.period_end) AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_dau_mau
    source: SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > (p.period_end - INTERVAL '1 day') AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > (p.period_end - INTERVAL '30 day') AND event_date <= p.period_end AND product_event_type = 'qualifying')), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_dau_mau: one row per reporting period holding the metric value, computed by the GASP compiled query (needs window)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: DAU/MAU Ratio (Stickiness) for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_dau_mau\",\"reason\":\"window\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATEADD(day, -1, p.period_end) AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATEADD(day, -30, p.period_end) AND event_date <= p.period_end AND product_event_type = 'qualifying')), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATE_SUB(p.period_end, INTERVAL 1 DAY) AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATE_SUB(p.period_end, INTERVAL 30 DAY) AND event_date <= p.period_end AND product_event_type = 'qualifying')), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATEADD(DAY, -1, p.period_end) AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATEADD(DAY, -30, p.period_end) AND event_date <= p.period_end AND product_event_type = 'qualifying')), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_waumau_ratio
    source: SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > (p.period_end - INTERVAL '7 day') AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > (p.period_end - INTERVAL '30 day') AND event_date <= p.period_end AND product_event_type = 'qualifying')), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_waumau_ratio: one row per reporting period holding the metric value, computed by the GASP compiled query (needs window)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: WAU/MAU Ratio for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_waumau_ratio\",\"reason\":\"window\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATEADD(day, -7, p.period_end) AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATEADD(day, -30, p.period_end) AND event_date <= p.period_end AND product_event_type = 'qualifying')), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATE_SUB(p.period_end, INTERVAL 7 DAY) AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATE_SUB(p.period_end, INTERVAL 30 DAY) AND event_date <= p.period_end AND product_event_type = 'qualifying')), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATEADD(DAY, -7, p.period_end) AND event_date <= p.period_end AND product_event_type = 'qualifying')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date > DATEADD(DAY, -30, p.period_end) AND event_date <= p.period_end AND product_event_type = 'qualifying')), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_activation_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND ((onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end) AND activation_date IS NOT NULL)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_activation_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Onboarding-to-Active Rate (Activation Rate) for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_activation_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND ((onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end) AND activation_date IS NOT NULL)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND ((onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end) AND activation_date IS NOT NULL)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND ((onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end) AND activation_date IS NOT NULL)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT customer_id) FROM gasp.customer WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_time_to_feature_adoption
    source: SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (first_use_date - signup_date)) FROM gasp.user WHERE snapshot_date = p.period_end AND (first_use_date >= p.period_start AND first_use_date <= p.period_end))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_time_to_feature_adoption: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Time to Feature Adoption for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_time_to_feature_adoption","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY DATEDIFF(day, signup_date, first_use_date)) FROM gasp.user WHERE snapshot_date = p.period_end AND (first_use_date >= p.period_start AND first_use_date <= p.period_end))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((SELECT APPROX_QUANTILES(DATE_DIFF(first_use_date, signup_date, DAY), 1000)[OFFSET(500)] FROM gasp.user WHERE snapshot_date = p.period_end AND (first_use_date >= p.period_start AND first_use_date <= p.period_end))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE(DATEDIFF(first_use_date, signup_date), 0.5) FROM gasp.user WHERE snapshot_date = p.period_end AND (first_use_date >= p.period_start AND first_use_date <= p.period_end))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_breadth_of_adoption
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(*) FROM (SELECT DISTINCT customer_id, feature_id FROM gasp.product_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND customer_id IS NOT NULL AND feature_id IS NOT NULL) _pairs) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.product_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND product_event_type = 'qualifying')), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_breadth_of_adoption: one row per reporting period holding the metric value, computed by the GASP compiled query (needs distinct pair)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Breadth of Adoption for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_breadth_of_adoption\",\"reason\":\"distinct pair\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(*) FROM (SELECT DISTINCT customer_id, feature_id FROM gasp.product_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND customer_id IS NOT NULL AND feature_id IS NOT NULL) _pairs) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.product_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND product_event_type = 'qualifying')), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(*) FROM (SELECT DISTINCT customer_id, feature_id FROM gasp.product_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND customer_id IS NOT NULL AND feature_id IS NOT NULL) _pairs) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.product_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND product_event_type = 'qualifying')), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(*) FROM (SELECT DISTINCT customer_id, feature_id FROM gasp.product_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND customer_id IS NOT NULL AND feature_id IS NOT NULL) _pairs) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT customer_id) FROM gasp.product_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND product_event_type = 'qualifying')), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_user_retention_day_n
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE ((product_event_type = 'qualifying' AND (signup_date >= p.period_start AND signup_date <= p.period_end)) AND (event_date - signup_date) = 30)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_end AND (signup_date >= p.period_start AND signup_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_user_retention_day_n: one row per reporting period holding the metric value, computed by the GASP compiled query (needs all_time, period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: User Retention (Day N) for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_user_retention_day_n\",\"reason\":\"all_time\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE ((product_event_type = 'qualifying' AND (signup_date >= p.period_start AND signup_date <= p.period_end)) AND DATEDIFF(day, signup_date, event_date) = 30)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_end AND (signup_date >= p.period_start AND signup_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE ((product_event_type = 'qualifying' AND (signup_date >= p.period_start AND signup_date <= p.period_end)) AND DATE_DIFF(event_date, signup_date, DAY) = 30)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_end AND (signup_date >= p.period_start AND signup_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE ((product_event_type = 'qualifying' AND (signup_date >= p.period_start AND signup_date <= p.period_end)) AND DATEDIFF(event_date, signup_date) = 30)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_end AND (signup_date >= p.period_start AND signup_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_cohort_retention
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE (((product_event_type = 'qualifying' AND (signup_date >= p.period_start AND signup_date <= p.period_end)) AND (event_date - signup_date) >= 49) AND (event_date - signup_date) < 56)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_end AND (signup_date >= p.period_start AND signup_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_cohort_retention: one row per reporting period holding the metric value, computed by the GASP compiled query (needs all_time, period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Cohort Retention for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_cohort_retention\",\"reason\":\"all_time\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE (((product_event_type = 'qualifying' AND (signup_date >= p.period_start AND signup_date <= p.period_end)) AND DATEDIFF(day, signup_date, event_date) >= 49) AND DATEDIFF(day, signup_date, event_date) < 56)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_end AND (signup_date >= p.period_start AND signup_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE (((product_event_type = 'qualifying' AND (signup_date >= p.period_start AND signup_date <= p.period_end)) AND DATE_DIFF(event_date, signup_date, DAY) >= 49) AND DATE_DIFF(event_date, signup_date, DAY) < 56)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_end AND (signup_date >= p.period_start AND signup_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE (((product_event_type = 'qualifying' AND (signup_date >= p.period_start AND signup_date <= p.period_end)) AND DATEDIFF(event_date, signup_date) >= 49) AND DATEDIFF(event_date, signup_date) < 56)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_end AND (signup_date >= p.period_start AND signup_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_resurrection_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND product_event_type = 'reactivation') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_start AND user_status = 'dormant'), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_resurrection_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Resurrection Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_resurrection_rate\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND product_event_type = 'reactivation') AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_start AND user_status = 'dormant'), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND product_event_type = 'reactivation') AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_start AND user_status = 'dormant'), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT user_id) FROM gasp.product_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND product_event_type = 'reactivation') AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_start AND user_status = 'dormant'), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_feature_delivery_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT feature_id) FROM gasp.feature WHERE snapshot_date = p.period_end AND ((planned_date >= p.period_start AND planned_date <= p.period_end) AND actual_date <= planned_date)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT feature_id) FROM gasp.feature WHERE snapshot_date = p.period_end AND (planned_date >= p.period_start AND planned_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_feature_delivery_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Feature Delivery Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_feature_delivery_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT feature_id) FROM gasp.feature WHERE snapshot_date = p.period_end AND ((planned_date >= p.period_start AND planned_date <= p.period_end) AND actual_date <= planned_date)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT feature_id) FROM gasp.feature WHERE snapshot_date = p.period_end AND (planned_date >= p.period_start AND planned_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT feature_id) FROM gasp.feature WHERE snapshot_date = p.period_end AND ((planned_date >= p.period_start AND planned_date <= p.period_end) AND actual_date <= planned_date)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT feature_id) FROM gasp.feature WHERE snapshot_date = p.period_end AND (planned_date >= p.period_start AND planned_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT feature_id) FROM gasp.feature WHERE snapshot_date = p.period_end AND ((planned_date >= p.period_start AND planned_date <= p.period_end) AND actual_date <= planned_date)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT feature_id) FROM gasp.feature WHERE snapshot_date = p.period_end AND (planned_date >= p.period_start AND planned_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_time_to_market
    source: SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (release_date - feature_created_date)) FROM gasp.feature WHERE snapshot_date = p.period_end AND (release_date >= p.period_start AND release_date <= p.period_end))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_time_to_market: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Time to Market for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_time_to_market","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY DATEDIFF(day, feature_created_date, release_date)) FROM gasp.feature WHERE snapshot_date = p.period_end AND (release_date >= p.period_start AND release_date <= p.period_end))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((SELECT APPROX_QUANTILES(DATE_DIFF(release_date, feature_created_date, DAY), 1000)[OFFSET(500)] FROM gasp.feature WHERE snapshot_date = p.period_end AND (release_date >= p.period_start AND release_date <= p.period_end))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE(DATEDIFF(release_date, feature_created_date), 0.5) FROM gasp.feature WHERE snapshot_date = p.period_end AND (release_date >= p.period_start AND release_date <= p.period_end))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_uptime
    source: SELECT p.period_start, p.period_end, ((1 - (CAST((SELECT SUM(downtime_minutes) FROM gasp.service_metrics WHERE period_start >= p.period_start AND period_start <= p.period_end) AS DOUBLE PRECISION) / NULLIF(((p.period_end - p.period_start + 1) * 1440), 0)))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_uptime: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period_days)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Uptime (Availability) for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_uptime","reason":"period_days","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((1 - (CAST((SELECT SUM(downtime_minutes) FROM gasp.service_metrics WHERE period_start >= p.period_start AND period_start <= p.period_end) AS DOUBLE) / NULLIF(((DATEDIFF(day, p.period_start, p.period_end) + 1) * 1440), 0)))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((1 - (CAST((SELECT SUM(downtime_minutes) FROM gasp.service_metrics WHERE period_start >= p.period_start AND period_start <= p.period_end) AS FLOAT64) / NULLIF(((DATE_DIFF(p.period_end, p.period_start, DAY) + 1) * 1440), 0)))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((1 - (CAST((SELECT SUM(downtime_minutes) FROM gasp.service_metrics WHERE period_start >= p.period_start AND period_start <= p.period_end) AS DOUBLE) / NULLIF(((DATEDIFF(p.period_end, p.period_start) + 1) * 1440), 0)))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_time_to_patch
    source: SELECT p.period_start, p.period_end, (((SELECT AVG((EXTRACT(EPOCH FROM (patched_at - discovered_at)) / 86400.0)) FROM gasp.vulnerability WHERE snapshot_date = p.period_end AND (patched_at >= p.period_start AND patched_at < (p.period_end + INTERVAL '1 day'))) * 24)) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_time_to_patch: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Time to Patch for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_time_to_patch","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, (((SELECT AVG((DATEDIFF(second, discovered_at, patched_at) / 86400.0)) FROM gasp.vulnerability WHERE snapshot_date = p.period_end AND (patched_at >= p.period_start AND patched_at < DATEADD(day, 1, p.period_end))) * 24)) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, (((SELECT AVG((TIMESTAMP_DIFF(patched_at, discovered_at, SECOND) / 86400.0)) FROM gasp.vulnerability WHERE snapshot_date = p.period_end AND (patched_at >= TIMESTAMP(p.period_start) AND patched_at < TIMESTAMP(DATE_ADD(p.period_end, INTERVAL 1 DAY)))) * 24)) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, (((SELECT AVG((TIMESTAMPDIFF(SECOND, discovered_at, patched_at) / 86400.0)) FROM gasp.vulnerability WHERE snapshot_date = p.period_end AND (patched_at >= p.period_start AND patched_at < DATEADD(DAY, 1, p.period_end))) * 24)) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_billings
    source: SELECT p.period_start, p.period_end, ((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_billings: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Billings for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_billings","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_billings_by_payment_status
    source: SELECT p.period_start, p.period_end, _d.payment_status AS payment_status, ((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_status = _d.payment_status)) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'paid' AS payment_status UNION ALL SELECT 'unpaid' AS payment_status UNION ALL SELECT 'partial' AS payment_status UNION ALL SELECT 'written_off' AS payment_status) _d
    description: "Staged dataset for gasp_billings_by_payment_status: one row per reporting period and payment_status value holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
      - payment_status
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: payment_status
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: payment_status
        datatype: String
        description: Payment status
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Billings, by_payment_status breakdown for the period and payment_status
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_billings_by_payment_status\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.payment_status AS payment_status, ((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_status = _d.payment_status)) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'paid' AS payment_status UNION ALL SELECT 'unpaid' AS payment_status UNION ALL SELECT 'partial' AS payment_status UNION ALL SELECT 'written_off' AS payment_status) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.payment_status AS payment_status, ((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_status = _d.payment_status)) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'paid' AS payment_status UNION ALL SELECT 'unpaid' AS payment_status UNION ALL SELECT 'partial' AS payment_status UNION ALL SELECT 'written_off' AS payment_status) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.payment_status AS payment_status, ((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_status = _d.payment_status)) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'paid' AS payment_status UNION ALL SELECT 'unpaid' AS payment_status UNION ALL SELECT 'partial' AS payment_status UNION ALL SELECT 'written_off' AS payment_status) _d\"}}"
  - name: gasp_staged_gasp_burn_rate
    source: SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) - (SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end)) AS DOUBLE PRECISION) / NULLIF((CAST((p.period_end - p.period_start + 1) AS DOUBLE PRECISION) / 30.4375), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_burn_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start, period_days)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Cash Burn Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_burn_rate","reason":"at period_start","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) - (SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end)) AS DOUBLE) / NULLIF((CAST((DATEDIFF(day, p.period_start, p.period_end) + 1) AS DOUBLE) / 30.4375), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) - (SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end)) AS FLOAT64) / NULLIF((CAST((DATE_DIFF(p.period_end, p.period_start, DAY) + 1) AS FLOAT64) / 30.4375), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST(((SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) - (SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end)) AS DOUBLE) / NULLIF((CAST((DATEDIFF(p.period_end, p.period_start) + 1) AS DOUBLE) / 30.4375), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_cash_runway
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end) AS DOUBLE PRECISION) / NULLIF(((CAST(((SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) - (SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end)) AS DOUBLE PRECISION) / NULLIF((CAST((p.period_end - p.period_start + 1) AS DOUBLE PRECISION) / 30.4375), 0))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_cash_runway: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start, period_days)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Cash Runway for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_cash_runway","reason":"at period_start","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end) AS DOUBLE) / NULLIF(((CAST(((SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) - (SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end)) AS DOUBLE) / NULLIF((CAST((DATEDIFF(day, p.period_start, p.period_end) + 1) AS DOUBLE) / 30.4375), 0))), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end) AS FLOAT64) / NULLIF(((CAST(((SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) - (SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end)) AS FLOAT64) / NULLIF((CAST((DATE_DIFF(p.period_end, p.period_start, DAY) + 1) AS FLOAT64) / 30.4375), 0))), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end) AS DOUBLE) / NULLIF(((CAST(((SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) - (SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end)) AS DOUBLE) / NULLIF((CAST((DATEDIFF(p.period_end, p.period_start) + 1) AS DOUBLE) / 30.4375), 0))), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_magic_number
    source: SELECT p.period_start, p.period_end, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) * 12)) - ((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = (p.period_end - INTERVAL '3 month') AND subscription_status = 'active')) * 12))) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date > ((p.period_end - INTERVAL '3 month') - INTERVAL '3 month') AND event_date <= (p.period_end - INTERVAL '3 month') AND cost_function = 'gtm'), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_magic_number: one row per reporting period holding the metric value, computed by the GASP compiled query (needs lag, window)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Magic Number for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_magic_number\",\"reason\":\"lag\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) * 12)) - ((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = DATEADD(quarter, -1, p.period_end) AND subscription_status = 'active')) * 12))) AS DOUBLE) / NULLIF((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date > DATEADD(quarter, -1, DATEADD(quarter, -1, p.period_end)) AND event_date <= DATEADD(quarter, -1, p.period_end) AND cost_function = 'gtm'), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) * 12)) - ((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = DATE_SUB(p.period_end, INTERVAL 1 QUARTER) AND subscription_status = 'active')) * 12))) AS FLOAT64) / NULLIF((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date > DATE_SUB(DATE_SUB(p.period_end, INTERVAL 1 QUARTER), INTERVAL 1 QUARTER) AND event_date <= DATE_SUB(p.period_end, INTERVAL 1 QUARTER) AND cost_function = 'gtm'), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = p.period_end AND subscription_status = 'active')) * 12)) - ((((SELECT SUM(mrr) FROM gasp.subscription WHERE snapshot_date = DATEADD(QUARTER, -1, p.period_end) AND subscription_status = 'active')) * 12))) AS DOUBLE) / NULLIF((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date > DATEADD(QUARTER, -1, DATEADD(QUARTER, -1, p.period_end)) AND event_date <= DATEADD(QUARTER, -1, p.period_end) AND cost_function = 'gtm'), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_burn_multiple
    source: SELECT p.period_start, p.period_end, ((CAST(((CAST(((SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) - (SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end)) AS DOUBLE PRECISION) / NULLIF((CAST((p.period_end - p.period_start + 1) AS DOUBLE PRECISION) / 30.4375), 0))) AS DOUBLE PRECISION) / NULLIF(((((((((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')) + ((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion'))) + ((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'reactivation'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn')))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction'))))) * 12), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_burn_multiple: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start, period_days)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Burn Multiple for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_burn_multiple\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST(((CAST(((SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) - (SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end)) AS DOUBLE) / NULLIF((CAST((DATEDIFF(day, p.period_start, p.period_end) + 1) AS DOUBLE) / 30.4375), 0))) AS DOUBLE) / NULLIF(((((((((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')) + ((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion'))) + ((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'reactivation'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn')))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction'))))) * 12), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST(((CAST(((SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) - (SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end)) AS FLOAT64) / NULLIF((CAST((DATE_DIFF(p.period_end, p.period_start, DAY) + 1) AS FLOAT64) / 30.4375), 0))) AS FLOAT64) / NULLIF(((((((((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')) + ((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion'))) + ((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'reactivation'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn')))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction'))))) * 12), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST(((CAST(((SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_start) - (SELECT SUM(cash_balance) FROM gasp.balance_sheet WHERE snapshot_date = p.period_end)) AS DOUBLE) / NULLIF((CAST((DATEDIFF(p.period_end, p.period_start) + 1) AS DOUBLE) / 30.4375), 0))) AS DOUBLE) / NULLIF(((((((((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'new')) + ((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'expansion'))) + ((SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'reactivation'))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'churn')))) - ((-(SELECT SUM(mrr_change) FROM gasp.revenue_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND event_type = 'contraction'))))) * 12), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_opex_ratio_by_cost_centre
    source: SELECT p.period_start, p.period_end, _d.cost_centre AS cost_centre, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function <> 'infrastructure' AND cost_centre = _d.cost_centre) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'marketing' AS cost_centre UNION ALL SELECT 'sales' AS cost_centre UNION ALL SELECT 'customer_success' AS cost_centre UNION ALL SELECT 'support' AS cost_centre UNION ALL SELECT 'engineering' AS cost_centre UNION ALL SELECT 'product' AS cost_centre UNION ALL SELECT 'finance' AS cost_centre UNION ALL SELECT 'people' AS cost_centre UNION ALL SELECT 'services' AS cost_centre UNION ALL SELECT 'partnerships' AS cost_centre UNION ALL SELECT 'general' AS cost_centre) _d
    description: "Staged dataset for gasp_opex_ratio_by_cost_centre: one row per reporting period and cost_centre value holding the metric value, computed by the GASP compiled query (needs total)."
    primary_key:
      - period_start
      - cost_centre
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: cost_centre
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: cost_centre
        datatype: String
        description: Department or team that incurred the cost
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Opex Ratio, by_cost_centre breakdown for the period and cost_centre
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_opex_ratio_by_cost_centre\",\"reason\":\"total\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.cost_centre AS cost_centre, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function <> 'infrastructure' AND cost_centre = _d.cost_centre) AS DOUBLE) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'marketing' AS cost_centre UNION ALL SELECT 'sales' AS cost_centre UNION ALL SELECT 'customer_success' AS cost_centre UNION ALL SELECT 'support' AS cost_centre UNION ALL SELECT 'engineering' AS cost_centre UNION ALL SELECT 'product' AS cost_centre UNION ALL SELECT 'finance' AS cost_centre UNION ALL SELECT 'people' AS cost_centre UNION ALL SELECT 'services' AS cost_centre UNION ALL SELECT 'partnerships' AS cost_centre UNION ALL SELECT 'general' AS cost_centre) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.cost_centre AS cost_centre, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function <> 'infrastructure' AND cost_centre = _d.cost_centre) AS FLOAT64) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'marketing' AS cost_centre UNION ALL SELECT 'sales' AS cost_centre UNION ALL SELECT 'customer_success' AS cost_centre UNION ALL SELECT 'support' AS cost_centre UNION ALL SELECT 'engineering' AS cost_centre UNION ALL SELECT 'product' AS cost_centre UNION ALL SELECT 'finance' AS cost_centre UNION ALL SELECT 'people' AS cost_centre UNION ALL SELECT 'services' AS cost_centre UNION ALL SELECT 'partnerships' AS cost_centre UNION ALL SELECT 'general' AS cost_centre) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.cost_centre AS cost_centre, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function <> 'infrastructure' AND cost_centre = _d.cost_centre) AS DOUBLE) / NULLIF(((SELECT SUM(revenue) FROM gasp.financials WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'marketing' AS cost_centre UNION ALL SELECT 'sales' AS cost_centre UNION ALL SELECT 'customer_success' AS cost_centre UNION ALL SELECT 'support' AS cost_centre UNION ALL SELECT 'engineering' AS cost_centre UNION ALL SELECT 'product' AS cost_centre UNION ALL SELECT 'finance' AS cost_centre UNION ALL SELECT 'people' AS cost_centre UNION ALL SELECT 'services' AS cost_centre UNION ALL SELECT 'partnerships' AS cost_centre UNION ALL SELECT 'general' AS cost_centre) _d\"}}"
  - name: gasp_staged_gasp_collection_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_date IS NOT NULL)) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_collection_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Collection Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_collection_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_date IS NOT NULL)) AS DOUBLE) / NULLIF(((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_date IS NOT NULL)) AS FLOAT64) / NULLIF(((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND ((invoice_date >= p.period_start AND invoice_date <= p.period_end) AND payment_date IS NOT NULL)) AS DOUBLE) / NULLIF(((SELECT SUM(invoice_amount) FROM gasp.invoice WHERE snapshot_date = p.period_end AND (invoice_date >= p.period_start AND invoice_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_onboarding_duration
    source: SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (onboarding_completion_date - onboarding_start_date)) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_onboarding_duration: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Onboarding Duration for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_onboarding_duration","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY DATEDIFF(day, onboarding_start_date, onboarding_completion_date)) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((SELECT APPROX_QUANTILES(DATE_DIFF(onboarding_completion_date, onboarding_start_date, DAY), 1000)[OFFSET(500)] FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((SELECT PERCENTILE(DATEDIFF(onboarding_completion_date, onboarding_start_date), 0.5) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_onboarding_completion
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_start_date >= p.period_start AND onboarding_start_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_onboarding_completion: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Onboarding Completion Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_onboarding_completion","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_start_date >= p.period_start AND onboarding_start_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_start_date >= p.period_start AND onboarding_start_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_start_date >= p.period_start AND onboarding_start_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_on_time_completion_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND ((onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end) AND onboarding_completion_date <= target_date)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_on_time_completion_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: On-Time Completion Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_on_time_completion_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND ((onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end) AND onboarding_completion_date <= target_date)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND ((onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end) AND onboarding_completion_date <= target_date)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND ((onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end) AND onboarding_completion_date <= target_date)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_onboardings_per_resource
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT resource_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_onboardings_per_resource: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Onboardings per Resource for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_onboardings_per_resource","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT resource_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT resource_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT resource_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_cost_per_onboarding
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'onboarding') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_cost_per_onboarding: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Cost per Onboarding for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_cost_per_onboarding\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'onboarding') AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'onboarding') AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'onboarding') AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_time_spent_per_onboarding
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(hours) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_time_spent_per_onboarding: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Time Spent per Onboarding for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_time_spent_per_onboarding","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(hours) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(hours) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(hours) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT onboarding_id) FROM gasp.onboarding WHERE snapshot_date = p.period_end AND (onboarding_completion_date >= p.period_start AND onboarding_completion_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_headcount_growth_rate
    source: SELECT p.period_start, p.period_end, ((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active')) - ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active'))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active')), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_headcount_growth_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Headcount Growth Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_headcount_growth_rate\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active')) - ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active'))) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active')) - ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active'))) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active')) - ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active'))) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active')), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_employee_turnover
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_date >= p.period_start AND termination_date <= p.period_end)) AS DOUBLE PRECISION) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active')) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active'))) AS DOUBLE PRECISION) / 2), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_employee_turnover: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start, period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Employee Turnover Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_employee_turnover\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_date >= p.period_start AND termination_date <= p.period_end)) AS DOUBLE) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active')) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active'))) AS DOUBLE) / 2), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_date >= p.period_start AND termination_date <= p.period_end)) AS FLOAT64) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active')) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active'))) AS FLOAT64) / 2), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_date >= p.period_start AND termination_date <= p.period_end)) AS DOUBLE) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active')) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active'))) AS DOUBLE) / 2), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_employee_turnover_by_department
    source: SELECT p.period_start, p.period_end, _d.department AS department, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_date >= p.period_start AND termination_date <= p.period_end) AND department = _d.department) AS DOUBLE PRECISION) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active' AND department = _d.department)) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active' AND department = _d.department))) AS DOUBLE PRECISION) / 2), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT department AS department FROM gasp.employee WHERE department IS NOT NULL) _d
    description: "Staged dataset for gasp_employee_turnover_by_department: one row per reporting period and department value holding the metric value, computed by the GASP compiled query (needs at period_start, period bound in filter)."
    primary_key:
      - period_start
      - department
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: department
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: department
        datatype: String
        description: Department
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Employee Turnover Rate, by_department breakdown for the period and department
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_employee_turnover_by_department\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.department AS department, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_date >= p.period_start AND termination_date <= p.period_end) AND department = _d.department) AS DOUBLE) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active' AND department = _d.department)) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active' AND department = _d.department))) AS DOUBLE) / 2), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT department AS department FROM gasp.employee WHERE department IS NOT NULL) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.department AS department, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_date >= p.period_start AND termination_date <= p.period_end) AND department = _d.department) AS FLOAT64) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active' AND department = _d.department)) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active' AND department = _d.department))) AS FLOAT64) / 2), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT department AS department FROM gasp.employee WHERE department IS NOT NULL) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.department AS department, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_date >= p.period_start AND termination_date <= p.period_end) AND department = _d.department) AS DOUBLE) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active' AND department = _d.department)) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active' AND department = _d.department))) AS DOUBLE) / 2), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT department AS department FROM gasp.employee WHERE department IS NOT NULL) _d\"}}"
  - name: gasp_staged_gasp_voluntary_turnover_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_type = 'voluntary' AND (termination_date >= p.period_start AND termination_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active')) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active'))) AS DOUBLE PRECISION) / 2), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_voluntary_turnover_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start, period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Voluntary Turnover Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_voluntary_turnover_rate\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_type = 'voluntary' AND (termination_date >= p.period_start AND termination_date <= p.period_end))) AS DOUBLE) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active')) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active'))) AS DOUBLE) / 2), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_type = 'voluntary' AND (termination_date >= p.period_start AND termination_date <= p.period_end))) AS FLOAT64) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active')) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active'))) AS FLOAT64) / 2), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_type = 'voluntary' AND (termination_date >= p.period_start AND termination_date <= p.period_end))) AS DOUBLE) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active')) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active'))) AS DOUBLE) / 2), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_voluntary_turnover_rate_by_department
    source: SELECT p.period_start, p.period_end, _d.department AS department, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_type = 'voluntary' AND (termination_date >= p.period_start AND termination_date <= p.period_end)) AND department = _d.department) AS DOUBLE PRECISION) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active' AND department = _d.department)) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active' AND department = _d.department))) AS DOUBLE PRECISION) / 2), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT department AS department FROM gasp.employee WHERE department IS NOT NULL) _d
    description: "Staged dataset for gasp_voluntary_turnover_rate_by_department: one row per reporting period and department value holding the metric value, computed by the GASP compiled query (needs at period_start, period bound in filter)."
    primary_key:
      - period_start
      - department
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: department
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: department
        datatype: String
        description: Department
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Voluntary Turnover Rate, by_department breakdown for the period and department
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_voluntary_turnover_rate_by_department\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.department AS department, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_type = 'voluntary' AND (termination_date >= p.period_start AND termination_date <= p.period_end)) AND department = _d.department) AS DOUBLE) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active' AND department = _d.department)) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active' AND department = _d.department))) AS DOUBLE) / 2), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT department AS department FROM gasp.employee WHERE department IS NOT NULL) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.department AS department, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_type = 'voluntary' AND (termination_date >= p.period_start AND termination_date <= p.period_end)) AND department = _d.department) AS FLOAT64) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active' AND department = _d.department)) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active' AND department = _d.department))) AS FLOAT64) / 2), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT department AS department FROM gasp.employee WHERE department IS NOT NULL) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.department AS department, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_type = 'voluntary' AND (termination_date >= p.period_start AND termination_date <= p.period_end)) AND department = _d.department) AS DOUBLE) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active' AND department = _d.department)) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active' AND department = _d.department))) AS DOUBLE) / 2), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT department AS department FROM gasp.employee WHERE department IS NOT NULL) _d\"}}"
  - name: gasp_staged_gasp_involuntary_turnover_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_type = 'involuntary' AND (termination_date >= p.period_start AND termination_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active')) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active'))) AS DOUBLE PRECISION) / 2), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_involuntary_turnover_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start, period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Involuntary Turnover Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_involuntary_turnover_rate\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_type = 'involuntary' AND (termination_date >= p.period_start AND termination_date <= p.period_end))) AS DOUBLE) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active')) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active'))) AS DOUBLE) / 2), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_type = 'involuntary' AND (termination_date >= p.period_start AND termination_date <= p.period_end))) AS FLOAT64) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active')) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active'))) AS FLOAT64) / 2), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_type = 'involuntary' AND (termination_date >= p.period_start AND termination_date <= p.period_end))) AS DOUBLE) / NULLIF((CAST((((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND employee_status = 'active')) + ((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND employee_status = 'active'))) AS DOUBLE) / 2), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_regrettable_turnover
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND ((termination_type = 'voluntary' AND is_high_performer = TRUE) AND (termination_date >= p.period_start AND termination_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND (is_high_performer = TRUE AND employee_status = 'active')), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_regrettable_turnover: one row per reporting period holding the metric value, computed by the GASP compiled query (needs at period_start, period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Regrettable Turnover for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_regrettable_turnover\",\"reason\":\"at period_start\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND ((termination_type = 'voluntary' AND is_high_performer = TRUE) AND (termination_date >= p.period_start AND termination_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND (is_high_performer = TRUE AND employee_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND ((termination_type = 'voluntary' AND is_high_performer = TRUE) AND (termination_date >= p.period_start AND termination_date <= p.period_end))) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND (is_high_performer = TRUE AND employee_status = 'active')), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND ((termination_type = 'voluntary' AND is_high_performer = TRUE) AND (termination_date >= p.period_start AND termination_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_start AND (is_high_performer = TRUE AND employee_status = 'active')), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_day_90_turnover
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_date IS NOT NULL AND (termination_date - hire_date) <= 90)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_day_90_turnover: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: 90-Day Turnover for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_day_90_turnover","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_date IS NOT NULL AND DATEDIFF(day, hire_date, termination_date) <= 90)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_date IS NOT NULL AND DATE_DIFF(termination_date, hire_date, DAY) <= 90)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_date IS NOT NULL AND DATEDIFF(termination_date, hire_date) <= 90)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_day_90_turnover_by_hire_source
    source: SELECT p.period_start, p.period_end, _d.hire_source AS hire_source, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_date IS NOT NULL AND (termination_date - hire_date) <= 90) AND hire_source = _d.hire_source) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end) AND hire_source = _d.hire_source), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'referral' AS hire_source UNION ALL SELECT 'inbound' AS hire_source UNION ALL SELECT 'sourced' AS hire_source UNION ALL SELECT 'agency' AS hire_source UNION ALL SELECT 'internal' AS hire_source UNION ALL SELECT 'campus' AS hire_source UNION ALL SELECT 'other' AS hire_source) _d
    description: "Staged dataset for gasp_day_90_turnover_by_hire_source: one row per reporting period and hire_source value holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
      - hire_source
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: hire_source
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: hire_source
        datatype: String
        description: Recruiting channel the employee was hired through
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: 90-Day Turnover, by_hire_source breakdown for the period and hire_source
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_day_90_turnover_by_hire_source\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.hire_source AS hire_source, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_date IS NOT NULL AND DATEDIFF(day, hire_date, termination_date) <= 90) AND hire_source = _d.hire_source) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end) AND hire_source = _d.hire_source), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'referral' AS hire_source UNION ALL SELECT 'inbound' AS hire_source UNION ALL SELECT 'sourced' AS hire_source UNION ALL SELECT 'agency' AS hire_source UNION ALL SELECT 'internal' AS hire_source UNION ALL SELECT 'campus' AS hire_source UNION ALL SELECT 'other' AS hire_source) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.hire_source AS hire_source, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_date IS NOT NULL AND DATE_DIFF(termination_date, hire_date, DAY) <= 90) AND hire_source = _d.hire_source) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end) AND hire_source = _d.hire_source), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'referral' AS hire_source UNION ALL SELECT 'inbound' AS hire_source UNION ALL SELECT 'sourced' AS hire_source UNION ALL SELECT 'agency' AS hire_source UNION ALL SELECT 'internal' AS hire_source UNION ALL SELECT 'campus' AS hire_source UNION ALL SELECT 'other' AS hire_source) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.hire_source AS hire_source, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (termination_date IS NOT NULL AND DATEDIFF(termination_date, hire_date) <= 90) AND hire_source = _d.hire_source) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end) AND hire_source = _d.hire_source), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'referral' AS hire_source UNION ALL SELECT 'inbound' AS hire_source UNION ALL SELECT 'sourced' AS hire_source UNION ALL SELECT 'agency' AS hire_source UNION ALL SELECT 'internal' AS hire_source UNION ALL SELECT 'campus' AS hire_source UNION ALL SELECT 'other' AS hire_source) _d\"}}"
  - name: gasp_staged_gasp_time_to_fill
    source: SELECT p.period_start, p.period_end, ((SELECT AVG((filled_date - requisition_opened_date)) FROM gasp.requisition WHERE snapshot_date = p.period_end AND (filled_date >= p.period_start AND filled_date <= p.period_end))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_time_to_fill: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Time to Fill for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_time_to_fill","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((SELECT AVG(DATEDIFF(day, requisition_opened_date, filled_date)) FROM gasp.requisition WHERE snapshot_date = p.period_end AND (filled_date >= p.period_start AND filled_date <= p.period_end))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((SELECT AVG(DATE_DIFF(filled_date, requisition_opened_date, DAY)) FROM gasp.requisition WHERE snapshot_date = p.period_end AND (filled_date >= p.period_start AND filled_date <= p.period_end))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((SELECT AVG(DATEDIFF(filled_date, requisition_opened_date)) FROM gasp.requisition WHERE snapshot_date = p.period_end AND (filled_date >= p.period_start AND filled_date <= p.period_end))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_time_to_hire
    source: SELECT p.period_start, p.period_end, ((SELECT AVG((hire_date - application_date)) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_time_to_hire: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Time to Hire for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_time_to_hire","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((SELECT AVG(DATEDIFF(day, application_date, hire_date)) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((SELECT AVG(DATE_DIFF(hire_date, application_date, DAY)) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((SELECT AVG(DATEDIFF(hire_date, application_date)) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_cost_per_hire
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'recruiting') AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_cost_per_hire: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Cost per Hire for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_cost_per_hire\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'recruiting') AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'recruiting') AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND cost_function = 'recruiting') AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_source_of_hire
    source: SELECT p.period_start, p.period_end, _d.hire_source AS hire_source, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end) AND hire_source = _d.hire_source) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'referral' AS hire_source UNION ALL SELECT 'inbound' AS hire_source UNION ALL SELECT 'sourced' AS hire_source UNION ALL SELECT 'agency' AS hire_source UNION ALL SELECT 'internal' AS hire_source UNION ALL SELECT 'campus' AS hire_source UNION ALL SELECT 'other' AS hire_source) _d
    description: "Staged dataset for gasp_source_of_hire: one row per reporting period and hire_source value holding the metric value, computed by the GASP compiled query (needs total, period bound in filter)."
    primary_key:
      - period_start
      - hire_source
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: hire_source
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: hire_source
        datatype: String
        description: Recruiting channel the employee was hired through
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Source of Hire for the period and hire_source
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_source_of_hire\",\"reason\":\"total\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.hire_source AS hire_source, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end) AND hire_source = _d.hire_source) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'referral' AS hire_source UNION ALL SELECT 'inbound' AS hire_source UNION ALL SELECT 'sourced' AS hire_source UNION ALL SELECT 'agency' AS hire_source UNION ALL SELECT 'internal' AS hire_source UNION ALL SELECT 'campus' AS hire_source UNION ALL SELECT 'other' AS hire_source) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.hire_source AS hire_source, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end) AND hire_source = _d.hire_source) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'referral' AS hire_source UNION ALL SELECT 'inbound' AS hire_source UNION ALL SELECT 'sourced' AS hire_source UNION ALL SELECT 'agency' AS hire_source UNION ALL SELECT 'internal' AS hire_source UNION ALL SELECT 'campus' AS hire_source UNION ALL SELECT 'other' AS hire_source) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.hire_source AS hire_source, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end) AND hire_source = _d.hire_source) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'referral' AS hire_source UNION ALL SELECT 'inbound' AS hire_source UNION ALL SELECT 'sourced' AS hire_source UNION ALL SELECT 'agency' AS hire_source UNION ALL SELECT 'internal' AS hire_source UNION ALL SELECT 'campus' AS hire_source UNION ALL SELECT 'other' AS hire_source) _d\"}}"
  - name: gasp_staged_gasp_diversity_hiring_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND ((underrepresented_group = TRUE AND hire_date >= p.period_start) AND hire_date <= p.period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_diversity_hiring_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Diversity Hiring Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_diversity_hiring_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND ((underrepresented_group = TRUE AND hire_date >= p.period_start) AND hire_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND ((underrepresented_group = TRUE AND hire_date >= p.period_start) AND hire_date <= p.period_end)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND ((underrepresented_group = TRUE AND hire_date >= p.period_start) AND hire_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT employee_id) FROM gasp.employee WHERE snapshot_date = p.period_end AND (hire_date >= p.period_start AND hire_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_visitor_to_lead_rate
    source: SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF(((SELECT SUM(unique_visitors) FROM gasp.web_traffic WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_visitor_to_lead_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Visitor-to-Lead Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_visitor_to_lead_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end))) AS DOUBLE) / NULLIF(((SELECT SUM(unique_visitors) FROM gasp.web_traffic WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end))) AS FLOAT64) / NULLIF(((SELECT SUM(unique_visitors) FROM gasp.web_traffic WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end))) AS DOUBLE) / NULLIF(((SELECT SUM(unique_visitors) FROM gasp.web_traffic WHERE period_start >= p.period_start AND period_start <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_leads
    source: SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_leads: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Leads for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_leads","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_leads_by_lead_source
    source: SELECT p.period_start, p.period_end, _d.lead_source AS lead_source, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end) AND lead_source = _d.lead_source)) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT lead_source AS lead_source FROM gasp.lead WHERE lead_source IS NOT NULL) _d
    description: "Staged dataset for gasp_leads_by_lead_source: one row per reporting period and lead_source value holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
      - lead_source
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: lead_source
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: lead_source
        datatype: String
        description: Lead source
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Leads, by_lead_source breakdown for the period and lead_source
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_leads_by_lead_source","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, _d.lead_source AS lead_source, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end) AND lead_source = _d.lead_source)) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT lead_source AS lead_source FROM gasp.lead WHERE lead_source IS NOT NULL) _d","BIGQUERY":"SELECT p.period_start, p.period_end, _d.lead_source AS lead_source, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end) AND lead_source = _d.lead_source)) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT lead_source AS lead_source FROM gasp.lead WHERE lead_source IS NOT NULL) _d","DATABRICKS":"SELECT p.period_start, p.period_end, _d.lead_source AS lead_source, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end) AND lead_source = _d.lead_source)) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT lead_source AS lead_source FROM gasp.lead WHERE lead_source IS NOT NULL) _d"}}'
  - name: gasp_staged_gasp_leads_by_lead_stage
    source: SELECT p.period_start, p.period_end, _d.lead_stage AS lead_stage, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end) AND lead_stage = _d.lead_stage)) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'lead' AS lead_stage UNION ALL SELECT 'mql' AS lead_stage UNION ALL SELECT 'sql' AS lead_stage UNION ALL SELECT 'opportunity' AS lead_stage UNION ALL SELECT 'disqualified' AS lead_stage) _d
    description: "Staged dataset for gasp_leads_by_lead_stage: one row per reporting period and lead_stage value holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
      - lead_stage
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: lead_stage
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: lead_stage
        datatype: String
        description: Lead funnel stage
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Leads, by_lead_stage breakdown for the period and lead_stage
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_leads_by_lead_stage\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.lead_stage AS lead_stage, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end) AND lead_stage = _d.lead_stage)) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'lead' AS lead_stage UNION ALL SELECT 'mql' AS lead_stage UNION ALL SELECT 'sql' AS lead_stage UNION ALL SELECT 'opportunity' AS lead_stage UNION ALL SELECT 'disqualified' AS lead_stage) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.lead_stage AS lead_stage, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end) AND lead_stage = _d.lead_stage)) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'lead' AS lead_stage UNION ALL SELECT 'mql' AS lead_stage UNION ALL SELECT 'sql' AS lead_stage UNION ALL SELECT 'opportunity' AS lead_stage UNION ALL SELECT 'disqualified' AS lead_stage) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.lead_stage AS lead_stage, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end) AND lead_stage = _d.lead_stage)) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'lead' AS lead_stage UNION ALL SELECT 'mql' AS lead_stage UNION ALL SELECT 'sql' AS lead_stage UNION ALL SELECT 'opportunity' AS lead_stage UNION ALL SELECT 'disqualified' AS lead_stage) _d\"}}"
  - name: gasp_staged_gasp_mqls
    source: SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_mqls: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Marketing Qualified Leads (MQLs) for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_mqls","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_mqls_by_lead_source
    source: SELECT p.period_start, p.period_end, _d.lead_source AS lead_source, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end) AND lead_source = _d.lead_source)) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT lead_source AS lead_source FROM gasp.lead WHERE lead_source IS NOT NULL) _d
    description: "Staged dataset for gasp_mqls_by_lead_source: one row per reporting period and lead_source value holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
      - lead_source
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: lead_source
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: lead_source
        datatype: String
        description: Lead source
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Marketing Qualified Leads (MQLs), by_lead_source breakdown for the period and lead_source
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_mqls_by_lead_source","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, _d.lead_source AS lead_source, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end) AND lead_source = _d.lead_source)) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT lead_source AS lead_source FROM gasp.lead WHERE lead_source IS NOT NULL) _d","BIGQUERY":"SELECT p.period_start, p.period_end, _d.lead_source AS lead_source, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end) AND lead_source = _d.lead_source)) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT lead_source AS lead_source FROM gasp.lead WHERE lead_source IS NOT NULL) _d","DATABRICKS":"SELECT p.period_start, p.period_end, _d.lead_source AS lead_source, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end) AND lead_source = _d.lead_source)) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT lead_source AS lead_source FROM gasp.lead WHERE lead_source IS NOT NULL) _d"}}'
  - name: gasp_staged_gasp_lead_to_mql_rate
    source: SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_lead_to_mql_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Lead-to-MQL Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_lead_to_mql_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_lead_to_mql_rate_by_lead_source
    source: SELECT p.period_start, p.period_end, _d.lead_source AS lead_source, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end) AND lead_source = _d.lead_source)) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end) AND lead_source = _d.lead_source)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT lead_source AS lead_source FROM gasp.lead WHERE lead_source IS NOT NULL) _d
    description: "Staged dataset for gasp_lead_to_mql_rate_by_lead_source: one row per reporting period and lead_source value holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
      - lead_source
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: lead_source
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: lead_source
        datatype: String
        description: Lead source
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Lead-to-MQL Rate, by_lead_source breakdown for the period and lead_source
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_lead_to_mql_rate_by_lead_source","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, _d.lead_source AS lead_source, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end) AND lead_source = _d.lead_source)) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end) AND lead_source = _d.lead_source)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT lead_source AS lead_source FROM gasp.lead WHERE lead_source IS NOT NULL) _d","BIGQUERY":"SELECT p.period_start, p.period_end, _d.lead_source AS lead_source, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end) AND lead_source = _d.lead_source)) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end) AND lead_source = _d.lead_source)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT lead_source AS lead_source FROM gasp.lead WHERE lead_source IS NOT NULL) _d","DATABRICKS":"SELECT p.period_start, p.period_end, _d.lead_source AS lead_source, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end) AND lead_source = _d.lead_source)) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end) AND lead_source = _d.lead_source)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT lead_source AS lead_source FROM gasp.lead WHERE lead_source IS NOT NULL) _d"}}'
  - name: gasp_staged_gasp_sqls
    source: SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (sql_date >= p.period_start AND sql_date <= p.period_end))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_sqls: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Sales Qualified Leads (SQLs) for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_sqls","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (sql_date >= p.period_start AND sql_date <= p.period_end))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (sql_date >= p.period_start AND sql_date <= p.period_end))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (sql_date >= p.period_start AND sql_date <= p.period_end))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_mql_to_sql_rate
    source: SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (sql_date >= p.period_start AND sql_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_mql_to_sql_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: MQL-to-SQL Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_mql_to_sql_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (sql_date >= p.period_start AND sql_date <= p.period_end))) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (sql_date >= p.period_start AND sql_date <= p.period_end))) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (sql_date >= p.period_start AND sql_date <= p.period_end))) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_mql_to_sql_rate_by_lead_source
    source: SELECT p.period_start, p.period_end, _d.lead_source AS lead_source, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (sql_date >= p.period_start AND sql_date <= p.period_end) AND lead_source = _d.lead_source)) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end) AND lead_source = _d.lead_source)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT lead_source AS lead_source FROM gasp.lead WHERE lead_source IS NOT NULL) _d
    description: "Staged dataset for gasp_mql_to_sql_rate_by_lead_source: one row per reporting period and lead_source value holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
      - lead_source
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: lead_source
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: lead_source
        datatype: String
        description: Lead source
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: MQL-to-SQL Rate, by_lead_source breakdown for the period and lead_source
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_mql_to_sql_rate_by_lead_source","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, _d.lead_source AS lead_source, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (sql_date >= p.period_start AND sql_date <= p.period_end) AND lead_source = _d.lead_source)) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end) AND lead_source = _d.lead_source)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT lead_source AS lead_source FROM gasp.lead WHERE lead_source IS NOT NULL) _d","BIGQUERY":"SELECT p.period_start, p.period_end, _d.lead_source AS lead_source, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (sql_date >= p.period_start AND sql_date <= p.period_end) AND lead_source = _d.lead_source)) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end) AND lead_source = _d.lead_source)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT lead_source AS lead_source FROM gasp.lead WHERE lead_source IS NOT NULL) _d","DATABRICKS":"SELECT p.period_start, p.period_end, _d.lead_source AS lead_source, ((CAST(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (sql_date >= p.period_start AND sql_date <= p.period_end) AND lead_source = _d.lead_source)) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end) AND lead_source = _d.lead_source)), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT DISTINCT lead_source AS lead_source FROM gasp.lead WHERE lead_source IS NOT NULL) _d"}}'
  - name: gasp_staged_gasp_sql_to_opportunity_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_created_date >= p.period_start AND opportunity_created_date <= p.period_end)) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (sql_date >= p.period_start AND sql_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_sql_to_opportunity_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: SQL-to-Opportunity Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_sql_to_opportunity_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_created_date >= p.period_start AND opportunity_created_date <= p.period_end)) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (sql_date >= p.period_start AND sql_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_created_date >= p.period_start AND opportunity_created_date <= p.period_end)) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (sql_date >= p.period_start AND sql_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_created_date >= p.period_start AND opportunity_created_date <= p.period_end)) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (sql_date >= p.period_start AND sql_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_lvr
    source: SELECT p.period_start, p.period_end, ((CAST((((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))) - ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = (p.period_end - INTERVAL '1 month') AND (mql_date >= (p.period_start - INTERVAL '1 month') AND mql_date <= (p.period_end - INTERVAL '1 month'))))) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = (p.period_end - INTERVAL '1 month') AND (mql_date >= (p.period_start - INTERVAL '1 month') AND mql_date <= (p.period_end - INTERVAL '1 month')))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_lvr: one row per reporting period holding the metric value, computed by the GASP compiled query (needs lag, period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Lead Velocity Rate (LVR) for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_lvr","reason":"lag","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))) - ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = DATEADD(month, -1, p.period_end) AND (mql_date >= DATEADD(month, -1, p.period_start) AND mql_date <= DATEADD(month, -1, p.period_end))))) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = DATEADD(month, -1, p.period_end) AND (mql_date >= DATEADD(month, -1, p.period_start) AND mql_date <= DATEADD(month, -1, p.period_end)))), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))) - ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = DATE_SUB(p.period_end, INTERVAL 1 MONTH) AND (mql_date >= DATE_SUB(p.period_start, INTERVAL 1 MONTH) AND mql_date <= DATE_SUB(p.period_end, INTERVAL 1 MONTH))))) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = DATE_SUB(p.period_end, INTERVAL 1 MONTH) AND (mql_date >= DATE_SUB(p.period_start, INTERVAL 1 MONTH) AND mql_date <= DATE_SUB(p.period_end, INTERVAL 1 MONTH)))), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))) - ((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = DATEADD(MONTH, -1, p.period_end) AND (mql_date >= DATEADD(MONTH, -1, p.period_start) AND mql_date <= DATEADD(MONTH, -1, p.period_end))))) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = DATEADD(MONTH, -1, p.period_end) AND (mql_date >= DATEADD(MONTH, -1, p.period_start) AND mql_date <= DATEADD(MONTH, -1, p.period_end)))), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_cac_by_channel
    source: SELECT p.period_start, p.period_end, _d.channel AS channel, ((CAST((SELECT SUM(ad_spend) FROM gasp.campaign WHERE period_start >= p.period_start AND period_start <= p.period_end AND channel = _d.channel) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)) AND channel = _d.channel), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'paid_ads' AS channel UNION ALL SELECT 'organic_search' AS channel UNION ALL SELECT 'email' AS channel UNION ALL SELECT 'events' AS channel UNION ALL SELECT 'content' AS channel UNION ALL SELECT 'referral' AS channel UNION ALL SELECT 'marketplace' AS channel UNION ALL SELECT 'direct' AS channel UNION ALL SELECT 'other' AS channel) _d
    description: "Staged dataset for gasp_cac_by_channel: one row per reporting period and channel value holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
      - channel
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: channel
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: channel
        datatype: String
        description: "Marketing channel: the channel a campaign runs in, and the first-touch channel of an opportunity"
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: CAC by Channel for the period and channel
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_cac_by_channel\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, _d.channel AS channel, ((CAST((SELECT SUM(ad_spend) FROM gasp.campaign WHERE period_start >= p.period_start AND period_start <= p.period_end AND channel = _d.channel) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)) AND channel = _d.channel), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'paid_ads' AS channel UNION ALL SELECT 'organic_search' AS channel UNION ALL SELECT 'email' AS channel UNION ALL SELECT 'events' AS channel UNION ALL SELECT 'content' AS channel UNION ALL SELECT 'referral' AS channel UNION ALL SELECT 'marketplace' AS channel UNION ALL SELECT 'direct' AS channel UNION ALL SELECT 'other' AS channel) _d\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, _d.channel AS channel, ((CAST((SELECT SUM(ad_spend) FROM gasp.campaign WHERE period_start >= p.period_start AND period_start <= p.period_end AND channel = _d.channel) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)) AND channel = _d.channel), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'paid_ads' AS channel UNION ALL SELECT 'organic_search' AS channel UNION ALL SELECT 'email' AS channel UNION ALL SELECT 'events' AS channel UNION ALL SELECT 'content' AS channel UNION ALL SELECT 'referral' AS channel UNION ALL SELECT 'marketplace' AS channel UNION ALL SELECT 'direct' AS channel UNION ALL SELECT 'other' AS channel) _d\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, _d.channel AS channel, ((CAST((SELECT SUM(ad_spend) FROM gasp.campaign WHERE period_start >= p.period_start AND period_start <= p.period_end AND channel = _d.channel) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND (opportunity_stage = 'closed_won' AND (close_date >= p.period_start AND close_date <= p.period_end)) AND channel = _d.channel), 0))) AS value FROM gasp.period_spine p CROSS JOIN (SELECT 'paid_ads' AS channel UNION ALL SELECT 'organic_search' AS channel UNION ALL SELECT 'email' AS channel UNION ALL SELECT 'events' AS channel UNION ALL SELECT 'content' AS channel UNION ALL SELECT 'referral' AS channel UNION ALL SELECT 'marketplace' AS channel UNION ALL SELECT 'direct' AS channel UNION ALL SELECT 'other' AS channel) _d\"}}"
  - name: gasp_staged_gasp_cpl
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (cost_function = 'gtm' AND cost_centre = 'marketing')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_cpl: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Cost per Lead (CPL) for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_cpl\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (cost_function = 'gtm' AND cost_centre = 'marketing')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (cost_function = 'gtm' AND cost_centre = 'marketing')) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (cost_function = 'gtm' AND cost_centre = 'marketing')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (lead_created_date >= p.period_start AND lead_created_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_cost_per_mql
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (cost_function = 'gtm' AND cost_centre = 'marketing')) AS DOUBLE PRECISION) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_cost_per_mql: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Cost per MQL for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_cost_per_mql\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (cost_function = 'gtm' AND cost_centre = 'marketing')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (cost_function = 'gtm' AND cost_centre = 'marketing')) AS FLOAT64) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(cost) FROM gasp.cost_event WHERE event_date >= p.period_start AND event_date <= p.period_end AND (cost_function = 'gtm' AND cost_centre = 'marketing')) AS DOUBLE) / NULLIF(((SELECT COUNT(DISTINCT lead_id) FROM gasp.lead WHERE snapshot_date = p.period_end AND (mql_date >= p.period_start AND mql_date <= p.period_end))), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_marketing_sourced_revenue
    source: SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((marketing_source = 'marketing' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_marketing_sourced_revenue: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Marketing Sourced Revenue for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_marketing_sourced_revenue\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((marketing_source = 'marketing' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((marketing_source = 'marketing' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((marketing_source = 'marketing' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_marketing_influenced_pipelinerevenue_revenue
    source: SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((marketing_influenced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_marketing_influenced_pipelinerevenue_revenue: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Marketing Influenced Pipeline/Revenue, revenue variant for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_marketing_influenced_pipelinerevenue_revenue\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((marketing_influenced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((marketing_influenced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((marketing_influenced = TRUE AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end)))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_paid_media_efficiency_roas
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((channel = 'paid_ads' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT SUM(ad_spend) FROM gasp.campaign WHERE period_start >= p.period_start AND period_start <= p.period_end AND channel = 'paid_ads'), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_paid_media_efficiency_roas: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Paid Media Efficiency (ROAS) for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_paid_media_efficiency_roas\",\"reason\":\"period bound in filter\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((channel = 'paid_ads' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT SUM(ad_spend) FROM gasp.campaign WHERE period_start >= p.period_start AND period_start <= p.period_end AND channel = 'paid_ads'), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((channel = 'paid_ads' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS FLOAT64) / NULLIF((SELECT SUM(ad_spend) FROM gasp.campaign WHERE period_start >= p.period_start AND period_start <= p.period_end AND channel = 'paid_ads'), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT SUM(opportunity_amount) FROM gasp.opportunity WHERE snapshot_date = p.period_end AND ((channel = 'paid_ads' AND opportunity_stage = 'closed_won') AND (close_date >= p.period_start AND close_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT SUM(ad_spend) FROM gasp.campaign WHERE period_start >= p.period_start AND period_start <= p.period_end AND channel = 'paid_ads'), 0))) AS value FROM gasp.period_spine p\"}}"
  - name: gasp_staged_gasp_onboarding_milestone_completion_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(onboarding_id) FROM gasp.onboarding_milestone WHERE (((milestone_due_date >= p.period_start AND milestone_due_date <= p.period_end) AND milestone_date IS NOT NULL) AND milestone_date <= p.period_end)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(onboarding_id) FROM gasp.onboarding_milestone WHERE (milestone_due_date >= p.period_start AND milestone_due_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_onboarding_milestone_completion_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs all_time, period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Onboarding Milestone Completion Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_onboarding_milestone_completion_rate","reason":"all_time","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(onboarding_id) FROM gasp.onboarding_milestone WHERE (((milestone_due_date >= p.period_start AND milestone_due_date <= p.period_end) AND milestone_date IS NOT NULL) AND milestone_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(onboarding_id) FROM gasp.onboarding_milestone WHERE (milestone_due_date >= p.period_start AND milestone_due_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(onboarding_id) FROM gasp.onboarding_milestone WHERE (((milestone_due_date >= p.period_start AND milestone_due_date <= p.period_end) AND milestone_date IS NOT NULL) AND milestone_date <= p.period_end)) AS FLOAT64) / NULLIF((SELECT COUNT(onboarding_id) FROM gasp.onboarding_milestone WHERE (milestone_due_date >= p.period_start AND milestone_due_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(onboarding_id) FROM gasp.onboarding_milestone WHERE (((milestone_due_date >= p.period_start AND milestone_due_date <= p.period_end) AND milestone_date IS NOT NULL) AND milestone_date <= p.period_end)) AS DOUBLE) / NULLIF((SELECT COUNT(onboarding_id) FROM gasp.onboarding_milestone WHERE (milestone_due_date >= p.period_start AND milestone_due_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_project_milestone_completion_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_milestone_id) FROM gasp.project_milestone WHERE snapshot_date = p.period_end AND ((actual_date >= p.period_start AND actual_date <= p.period_end) AND actual_date <= planned_date)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT project_milestone_id) FROM gasp.project_milestone WHERE snapshot_date = p.period_end AND (actual_date >= p.period_start AND actual_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_project_milestone_completion_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Project Milestone Completion Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_project_milestone_completion_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_milestone_id) FROM gasp.project_milestone WHERE snapshot_date = p.period_end AND ((actual_date >= p.period_start AND actual_date <= p.period_end) AND actual_date <= planned_date)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT project_milestone_id) FROM gasp.project_milestone WHERE snapshot_date = p.period_end AND (actual_date >= p.period_start AND actual_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_milestone_id) FROM gasp.project_milestone WHERE snapshot_date = p.period_end AND ((actual_date >= p.period_start AND actual_date <= p.period_end) AND actual_date <= planned_date)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT project_milestone_id) FROM gasp.project_milestone WHERE snapshot_date = p.period_end AND (actual_date >= p.period_start AND actual_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT project_milestone_id) FROM gasp.project_milestone WHERE snapshot_date = p.period_end AND ((actual_date >= p.period_start AND actual_date <= p.period_end) AND actual_date <= planned_date)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT project_milestone_id) FROM gasp.project_milestone WHERE snapshot_date = p.period_end AND (actual_date >= p.period_start AND actual_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_product_activation_rate
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_end AND ((signup_date >= p.period_start AND signup_date <= p.period_end) AND activation_date IS NOT NULL)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_end AND (signup_date >= p.period_start AND signup_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_product_activation_rate: one row per reporting period holding the metric value, computed by the GASP compiled query (needs period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Activation Rate for the period
    custom_extensions:
      - vendor_name: GASP
        data: '{"staged":true,"for":"gasp_product_activation_rate","reason":"period bound in filter","source_dialect":"postgres","sources":{"SNOWFLAKE":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_end AND ((signup_date >= p.period_start AND signup_date <= p.period_end) AND activation_date IS NOT NULL)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_end AND (signup_date >= p.period_start AND signup_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","BIGQUERY":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_end AND ((signup_date >= p.period_start AND signup_date <= p.period_end) AND activation_date IS NOT NULL)) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_end AND (signup_date >= p.period_start AND signup_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p","DATABRICKS":"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_end AND ((signup_date >= p.period_start AND signup_date <= p.period_end) AND activation_date IS NOT NULL)) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM gasp.user WHERE snapshot_date = p.period_end AND (signup_date >= p.period_start AND signup_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p"}}'
  - name: gasp_staged_gasp_trial_to_paid_conversion_rate_by_start_date
    source: SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT trial_id) FROM gasp.trial WHERE (trial_status = 'converted' AND (trial_start_date >= p.period_start AND trial_start_date <= p.period_end))) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT trial_id) FROM gasp.trial WHERE (trial_start_date >= p.period_start AND trial_start_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p
    description: "Staged dataset for gasp_trial_to_paid_conversion_rate_by_start_date: one row per reporting period holding the metric value, computed by the GASP compiled query (needs all_time, period bound in filter)."
    primary_key:
      - period_start
    fields:
      - name: period_start
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_start
        dimension:
          is_time: true
        datatype: Date
        description: First day of the reporting period
      - name: period_end
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: period_end
        datatype: Date
        description: Last day of the reporting period
      - name: value
        expression:
          dialects:
            - dialect: OSSIE_SQL_2026
              expression: value
        datatype: Decimal
        description: Trial-to-Paid Conversion Rate, by_start_date variant for the period
    custom_extensions:
      - vendor_name: GASP
        data: "{\"staged\":true,\"for\":\"gasp_trial_to_paid_conversion_rate_by_start_date\",\"reason\":\"all_time\",\"source_dialect\":\"postgres\",\"sources\":{\"SNOWFLAKE\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT trial_id) FROM gasp.trial WHERE (trial_status = 'converted' AND (trial_start_date >= p.period_start AND trial_start_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT trial_id) FROM gasp.trial WHERE (trial_start_date >= p.period_start AND trial_start_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"BIGQUERY\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT trial_id) FROM gasp.trial WHERE (trial_status = 'converted' AND (trial_start_date >= p.period_start AND trial_start_date <= p.period_end))) AS FLOAT64) / NULLIF((SELECT COUNT(DISTINCT trial_id) FROM gasp.trial WHERE (trial_start_date >= p.period_start AND trial_start_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\",\"DATABRICKS\":\"SELECT p.period_start, p.period_end, ((CAST((SELECT COUNT(DISTINCT trial_id) FROM gasp.trial WHERE (trial_status = 'converted' AND (trial_start_date >= p.period_start AND trial_start_date <= p.period_end))) AS DOUBLE) / NULLIF((SELECT COUNT(DISTINCT trial_id) FROM gasp.trial WHERE (trial_start_date >= p.period_start AND trial_start_date <= p.period_end)), 0))) AS value FROM gasp.period_spine p\"}}"
relationships:
  - name: revenue_event_customer_id
    from: revenue_event
    to: customer
    from_columns:
      - customer_id
      - event_date
    to_columns:
      - customer_id
      - snapshot_date
  - name: revenue_event_subscription_id
    from: revenue_event
    to: subscription
    from_columns:
      - subscription_id
      - event_date
    to_columns:
      - subscription_id
      - snapshot_date
  - name: cost_event_customer_id
    from: cost_event
    to: customer
    from_columns:
      - customer_id
      - event_date
    to_columns:
      - customer_id
      - snapshot_date
  - name: cost_event_partner_id
    from: cost_event
    to: partner
    from_columns:
      - partner_id
      - event_date
    to_columns:
      - partner_id
      - snapshot_date
  - name: cost_event_project_id
    from: cost_event
    to: project
    from_columns:
      - project_id
      - event_date
    to_columns:
      - project_id
      - snapshot_date
  - name: contract_event_customer_id
    from: contract_event
    to: customer
    from_columns:
      - customer_id
      - event_date
    to_columns:
      - customer_id
      - snapshot_date
  - name: contract_event_subscription_id
    from: contract_event
    to: subscription
    from_columns:
      - subscription_id
      - event_date
    to_columns:
      - subscription_id
      - snapshot_date
  - name: amendment_event_customer_id
    from: amendment_event
    to: customer
    from_columns:
      - customer_id
      - event_date
    to_columns:
      - customer_id
      - snapshot_date
  - name: amendment_event_subscription_id
    from: amendment_event
    to: subscription
    from_columns:
      - subscription_id
      - event_date
    to_columns:
      - subscription_id
      - snapshot_date
  - name: lifecycle_event_customer_id
    from: lifecycle_event
    to: customer
    from_columns:
      - customer_id
      - event_date
    to_columns:
      - customer_id
      - snapshot_date
  - name: trial_customer_id
    from: trial
    to: customer
    from_columns:
      - customer_id
      - trial_end_date
    to_columns:
      - customer_id
      - snapshot_date
  - name: contact_customer_id
    from: contact
    to: customer
    from_columns:
      - customer_id
      - snapshot_date
    to_columns:
      - customer_id
      - snapshot_date
  - name: license_product_id
    from: license
    to: product
    from_columns:
      - product_id
      - snapshot_date
    to_columns:
      - product_id
      - snapshot_date
  - name: license_subscription_id
    from: license
    to: subscription
    from_columns:
      - subscription_id
      - snapshot_date
    to_columns:
      - subscription_id
      - snapshot_date
  - name: subscription_customer_id
    from: subscription
    to: customer
    from_columns:
      - customer_id
      - snapshot_date
    to_columns:
      - customer_id
      - snapshot_date
  - name: subscription_plan_id
    from: subscription
    to: plan
    from_columns:
      - plan_id
      - snapshot_date
    to_columns:
      - plan_id
      - snapshot_date
  - name: opportunity_customer_id
    from: opportunity
    to: customer
    from_columns:
      - customer_id
      - snapshot_date
    to_columns:
      - customer_id
      - snapshot_date
  - name: opportunity_lead_id
    from: opportunity
    to: lead
    from_columns:
      - lead_id
      - snapshot_date
    to_columns:
      - lead_id
      - snapshot_date
  - name: opportunity_partner_id
    from: opportunity
    to: partner
    from_columns:
      - partner_id
      - snapshot_date
    to_columns:
      - partner_id
      - snapshot_date
  - name: opportunity_rep_id
    from: opportunity
    to: sales_rep
    from_columns:
      - rep_id
    to_columns:
      - rep_id
  - name: user_customer_id
    from: user
    to: customer
    from_columns:
      - customer_id
      - snapshot_date
    to_columns:
      - customer_id
      - snapshot_date
  - name: project_consultant_id
    from: project
    to: consultant
    from_columns:
      - consultant_id
    to_columns:
      - consultant_id
  - name: project_customer_id
    from: project
    to: customer
    from_columns:
      - customer_id
      - snapshot_date
    to_columns:
      - customer_id
      - snapshot_date
  - name: invoice_customer_id
    from: invoice
    to: customer
    from_columns:
      - customer_id
      - snapshot_date
    to_columns:
      - customer_id
      - snapshot_date
  - name: ticket_customer_id
    from: ticket
    to: customer
    from_columns:
      - customer_id
      - created_at
    to_columns:
      - customer_id
      - snapshot_date
  - name: product_event_customer_id
    from: product_event
    to: customer
    from_columns:
      - customer_id
      - event_date
    to_columns:
      - customer_id
      - snapshot_date
  - name: product_event_feature_id
    from: product_event
    to: feature
    from_columns:
      - feature_id
      - event_date
    to_columns:
      - feature_id
      - snapshot_date
  - name: product_event_user_id
    from: product_event
    to: user
    from_columns:
      - user_id
      - event_date
    to_columns:
      - user_id
      - snapshot_date
  - name: survey_response_customer_id
    from: survey_response
    to: customer
    from_columns:
      - customer_id
      - survey_date
    to_columns:
      - customer_id
      - snapshot_date
  - name: survey_response_employee_id
    from: survey_response
    to: employee
    from_columns:
      - employee_id
      - survey_date
    to_columns:
      - employee_id
      - snapshot_date
  - name: survey_response_lead_id
    from: survey_response
    to: lead
    from_columns:
      - lead_id
      - survey_date
    to_columns:
      - lead_id
      - snapshot_date
  - name: survey_response_partner_id
    from: survey_response
    to: partner
    from_columns:
      - partner_id
      - survey_date
    to_columns:
      - partner_id
      - snapshot_date
  - name: survey_response_project_id
    from: survey_response
    to: project
    from_columns:
      - project_id
      - survey_date
    to_columns:
      - project_id
      - snapshot_date
  - name: deployment_incident_id
    from: deployment
    to: incident
    from_columns:
      - incident_id
    to_columns:
      - incident_id
  - name: feature_release_id
    from: feature
    to: release
    from_columns:
      - release_id
    to_columns:
      - release_id
  - name: project_milestone_project_id
    from: project_milestone
    to: project
    from_columns:
      - project_id
      - snapshot_date
    to_columns:
      - project_id
      - snapshot_date
  - name: time_entry_consultant_id
    from: time_entry
    to: consultant
    from_columns:
      - consultant_id
    to_columns:
      - consultant_id
  - name: time_entry_project_id
    from: time_entry
    to: project
    from_columns:
      - project_id
      - entry_date
    to_columns:
      - project_id
      - snapshot_date
  - name: deliverable_project_id
    from: deliverable
    to: project
    from_columns:
      - project_id
      - snapshot_date
    to_columns:
      - project_id
      - snapshot_date
  - name: onboarding_customer_id
    from: onboarding
    to: customer
    from_columns:
      - customer_id
      - snapshot_date
    to_columns:
      - customer_id
      - snapshot_date
  - name: order_quote_id
    from: order
    to: quote
    from_columns:
      - quote_id
      - snapshot_date
    to_columns:
      - quote_id
      - snapshot_date
  - name: revenue_schedule_customer_id
    from: revenue_schedule
    to: customer
    from_columns:
      - customer_id
      - period_start
    to_columns:
      - customer_id
      - snapshot_date
  - name: partner_activity_partner_id
    from: partner_activity
    to: partner
    from_columns:
      - partner_id
      - activity_date
    to_columns:
      - partner_id
      - snapshot_date
  - name: deal_registration_opportunity_id
    from: deal_registration
    to: opportunity
    from_columns:
      - opportunity_id
      - snapshot_date
    to_columns:
      - opportunity_id
      - snapshot_date
  - name: deal_registration_partner_id
    from: deal_registration
    to: partner
    from_columns:
      - partner_id
      - snapshot_date
    to_columns:
      - partner_id
      - snapshot_date
metrics:
  - name: gasp_mrr
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN subscription.subscription_status = 'active' THEN subscription.mrr ELSE 0 END)
    description: MRR (Monthly Recurring Revenue). The total predictable revenue from active subscriptions, normalized to a monthly value.
    datatype: Decimal
    ai_context:
      synonyms:
        - MRR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/mrr-monthly-recurring-revenue. Reads the subscription snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"mrr\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.mrr where field.subscription_status = 'active') at period_end\"}"
  - name: gasp_mrr_by_plan
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN subscription.subscription_status = 'active' THEN subscription.mrr ELSE 0 END)
    description: MRR (Monthly Recurring Revenue), by_plan breakdown. The total predictable revenue from active subscriptions, normalized to a monthly value.
    datatype: Decimal
    ai_context:
      synonyms:
        - MRR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/mrr-monthly-recurring-revenue. Broken down by plan.plan_name: report one value per plan_name, joining each dataset the expression reads to plan on plan_id (the model's relationship) and grouping on plan.plan_name. Reads the subscription snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"mrr\",\"gasp_version\":\"1\",\"variant\":\"by_plan\",\"unit\":\"currency\",\"formula\":\"sum(field.mrr where field.subscription_status = 'active') at period_end\",\"gasp_breakdown\":\"plan.plan_name\"}"
  - name: gasp_mrr_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN subscription.subscription_status = 'active' THEN subscription.mrr ELSE 0 END)
    description: MRR (Monthly Recurring Revenue), by_segment breakdown. The total predictable revenue from active subscriptions, normalized to a monthly value.
    datatype: Decimal
    ai_context:
      synonyms:
        - MRR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/mrr-monthly-recurring-revenue. Broken down by segment: report one value per segment by grouping on the segment field of each dataset the expression reads. Reads the subscription snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"mrr\",\"gasp_version\":\"1\",\"variant\":\"by_segment\",\"unit\":\"currency\",\"formula\":\"sum(field.mrr where field.subscription_status = 'active') at period_end\",\"gasp_breakdown\":\"segment\"}"
  - name: gasp_arr
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: ((SUM(CASE WHEN subscription.subscription_status = 'active' THEN subscription.mrr ELSE 0 END)) * 12)
    description: ARR (Annual Recurring Revenue). The annualized value of recurring revenue. ARR represents the yearly run rate of subscription revenue.
    datatype: Decimal
    ai_context:
      synonyms:
        - ARR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/arr-annual-recurring-revenue. Reads the subscription snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"arr","gasp_version":"1","unit":"currency","formula":"metric.mrr * 12"}'
  - name: gasp_arr_o
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_arr_o.value)
    description: ARR (Annual Recurring Revenue), Operating form. The annualized value of recurring revenue. ARR represents the yearly run rate of subscription revenue.
    datatype: Decimal
    ai_context:
      synonyms:
        - ARR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/arr-annual-recurring-revenue. Staged (cohort): gasp_staged_gasp_arr_o holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"arr\",\"gasp_version\":\"1\",\"form\":\"O\",\"unit\":\"currency\",\"formula\":\"(metric.mrr - window(sum(field.mrr_change where field.expansion_classification in ('pricing_adjustment', 'recontracting')), 12 month)) * 12 over cohort(field.customer_id, period_end)\",\"staged\":true}"
  - name: gasp_arr_m
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: ((SUM(CASE WHEN subscription.subscription_status = 'active' THEN subscription.mrr ELSE 0 END)) * 12)
    description: ARR (Annual Recurring Revenue), Market form. The annualized value of recurring revenue. ARR represents the yearly run rate of subscription revenue.
    datatype: Decimal
    ai_context:
      synonyms:
        - ARR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/arr-annual-recurring-revenue. Reads the subscription snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"arr","gasp_version":"1","form":"M","unit":"currency","formula":"metric.mrr * 12"}'
  - name: gasp_arr_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: ((SUM(CASE WHEN subscription.subscription_status = 'active' THEN subscription.mrr ELSE 0 END)) * 12)
    description: ARR (Annual Recurring Revenue), by_segment breakdown. The annualized value of recurring revenue. ARR represents the yearly run rate of subscription revenue.
    datatype: Decimal
    ai_context:
      synonyms:
        - ARR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/arr-annual-recurring-revenue. Broken down by segment: report one value per segment by grouping on the segment field of each dataset the expression reads. Reads the subscription snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"arr","gasp_version":"1","variant":"by_segment","unit":"currency","formula":"metric.mrr * 12","gasp_breakdown":"segment"}'
  - name: gasp_arpa
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST((SUM(CASE WHEN subscription.subscription_status = 'active' THEN subscription.mrr ELSE 0 END)) AS DECIMAL) / NULLIF((COUNT(DISTINCT CASE WHEN customer.customer_status = 'active' THEN customer.customer_id END)), 0))
    description: ARPA (Average Revenue Per Account). Average monthly recurring revenue per customer.
    datatype: Decimal
    ai_context:
      synonyms:
        - ARPA
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/arpa-average-revenue-per-account. Reads the customer and subscription snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"arpa","gasp_version":"1","unit":"currency","formula":"metric.mrr / metric.total_customers"}'
  - name: gasp_arpa_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST((SUM(CASE WHEN subscription.subscription_status = 'active' THEN subscription.mrr ELSE 0 END)) AS DECIMAL) / NULLIF((COUNT(DISTINCT CASE WHEN customer.customer_status = 'active' THEN customer.customer_id END)), 0))
    description: ARPA (Average Revenue Per Account), by_segment breakdown. Average monthly recurring revenue per customer.
    datatype: Decimal
    ai_context:
      synonyms:
        - ARPA
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/arpa-average-revenue-per-account. Broken down by segment: report one value per segment by grouping on the segment field of each dataset the expression reads. Reads the customer and subscription snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"arpa","gasp_version":"1","variant":"by_segment","unit":"currency","formula":"metric.mrr / metric.total_customers","gasp_breakdown":"segment"}'
  - name: gasp_total_customers
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT CASE WHEN customer.customer_status = 'active' THEN customer.customer_id END)
    description: Total Customers. The number of active customers at the end of the period.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/total-customers. Reads the customer snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"total_customers\",\"gasp_version\":\"1\",\"unit\":\"count\",\"formula\":\"count_distinct(field.customer_id where field.customer_status = 'active') at period_end\"}"
  - name: gasp_total_customers_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT CASE WHEN customer.customer_status = 'active' THEN customer.customer_id END)
    description: Total Customers, by_segment breakdown. The number of active customers at the end of the period.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/total-customers. Broken down by segment: report one value per segment by grouping on the segment field of each dataset the expression reads. Reads the customer snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"total_customers\",\"gasp_version\":\"1\",\"variant\":\"by_segment\",\"unit\":\"count\",\"formula\":\"count_distinct(field.customer_id where field.customer_status = 'active') at period_end\",\"gasp_breakdown\":\"segment\"}"
  - name: gasp_new_customers
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT CASE WHEN revenue_event.event_type = 'new' THEN revenue_event.customer_id END)
    description: "New Customers. The number of customers acquired in the period: customers whose first paid subscription started in the period."
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/new-customers."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"new_customers\",\"gasp_version\":\"1\",\"unit\":\"count\",\"formula\":\"count_distinct(field.customer_id where field.event_type = 'new')\"}"
  - name: gasp_new_customers_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT CASE WHEN revenue_event.event_type = 'new' THEN revenue_event.customer_id END)
    description: "New Customers, by_segment breakdown. The number of customers acquired in the period: customers whose first paid subscription started in the period."
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/new-customers. Broken down by segment: report one value per segment by grouping on the segment field of each dataset the expression reads."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"new_customers\",\"gasp_version\":\"1\",\"variant\":\"by_segment\",\"unit\":\"count\",\"formula\":\"count_distinct(field.customer_id where field.event_type = 'new')\",\"gasp_breakdown\":\"segment\"}"
  - name: gasp_churned_customers
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT CASE WHEN revenue_event.event_type = 'churn' THEN revenue_event.customer_id END)
    description: "Churned Customers. The number of customers lost in the period: customers whose last active subscription ended."
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/churned-customers."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"churned_customers\",\"gasp_version\":\"1\",\"unit\":\"count\",\"formula\":\"count_distinct(field.customer_id where field.event_type = 'churn')\"}"
  - name: gasp_churned_customers_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT CASE WHEN revenue_event.event_type = 'churn' THEN revenue_event.customer_id END)
    description: "Churned Customers, by_segment breakdown. The number of customers lost in the period: customers whose last active subscription ended."
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/churned-customers. Broken down by segment: report one value per segment by grouping on the segment field of each dataset the expression reads."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"churned_customers\",\"gasp_version\":\"1\",\"variant\":\"by_segment\",\"unit\":\"count\",\"formula\":\"count_distinct(field.customer_id where field.event_type = 'churn')\",\"gasp_breakdown\":\"segment\"}"
  - name: gasp_mrr_growth_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_mrr_growth_rate.value)
    description: MRR Growth Rate. The month-over-month percentage change in MRR.
    datatype: Decimal
    ai_context:
      synonyms:
        - MRR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/mrr-growth-rate. Staged (lag): gasp_staged_gasp_mrr_growth_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"mrr_growth_rate","gasp_version":"1","unit":"percent","formula":"(metric.mrr - lag(metric.mrr, 1 month)) / lag(metric.mrr, 1 month)","staged":true}'
  - name: gasp_new_mrr
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN revenue_event.event_type = 'new' THEN revenue_event.mrr_change ELSE 0 END)
    description: New MRR. MRR generated from brand new customers acquired in the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/new-mrr."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"new_mrr\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.mrr_change where field.event_type = 'new')\"}"
  - name: gasp_new_mrr_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN revenue_event.event_type = 'new' THEN revenue_event.mrr_change ELSE 0 END)
    description: New MRR, by_segment breakdown. MRR generated from brand new customers acquired in the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/new-mrr. Broken down by segment: report one value per segment by grouping on the segment field of each dataset the expression reads."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"new_mrr\",\"gasp_version\":\"1\",\"variant\":\"by_segment\",\"unit\":\"currency\",\"formula\":\"sum(field.mrr_change where field.event_type = 'new')\",\"gasp_breakdown\":\"segment\"}"
  - name: gasp_expansion_mrr
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN revenue_event.event_type = 'expansion' THEN revenue_event.mrr_change ELSE 0 END)
    description: Expansion MRR. Additional MRR from existing customers through upgrades, add-ons, seat increases or price increases.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/expansion-mrr."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"expansion_mrr\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.mrr_change where field.event_type = 'expansion')\"}"
  - name: gasp_expansion_mrr_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN revenue_event.event_type = 'expansion' THEN revenue_event.mrr_change ELSE 0 END)
    description: Expansion MRR, by_segment breakdown. Additional MRR from existing customers through upgrades, add-ons, seat increases or price increases.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/expansion-mrr. Broken down by segment: report one value per segment by grouping on the segment field of each dataset the expression reads."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"expansion_mrr\",\"gasp_version\":\"1\",\"variant\":\"by_segment\",\"unit\":\"currency\",\"formula\":\"sum(field.mrr_change where field.event_type = 'expansion')\",\"gasp_breakdown\":\"segment\"}"
  - name: gasp_churned_mrr
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (-SUM(CASE WHEN revenue_event.event_type = 'churn' THEN revenue_event.mrr_change ELSE 0 END))
    description: Churned MRR. MRR lost from customers who cancelled their subscriptions.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/churned-mrr."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"churned_mrr\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"-sum(field.mrr_change where field.event_type = 'churn')\"}"
  - name: gasp_churned_mrr_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (-SUM(CASE WHEN revenue_event.event_type = 'churn' THEN revenue_event.mrr_change ELSE 0 END))
    description: Churned MRR, by_segment breakdown. MRR lost from customers who cancelled their subscriptions.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/churned-mrr. Broken down by segment: report one value per segment by grouping on the segment field of each dataset the expression reads."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"churned_mrr\",\"gasp_version\":\"1\",\"variant\":\"by_segment\",\"unit\":\"currency\",\"formula\":\"-sum(field.mrr_change where field.event_type = 'churn')\",\"gasp_breakdown\":\"segment\"}"
  - name: gasp_contraction_mrr
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (-SUM(CASE WHEN revenue_event.event_type = 'contraction' THEN revenue_event.mrr_change ELSE 0 END))
    description: Contraction MRR. MRR reduction from existing customers who downgraded but didn't churn.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/contraction-mrr."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"contraction_mrr\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"-sum(field.mrr_change where field.event_type = 'contraction')\"}"
  - name: gasp_contraction_mrr_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (-SUM(CASE WHEN revenue_event.event_type = 'contraction' THEN revenue_event.mrr_change ELSE 0 END))
    description: Contraction MRR, by_segment breakdown. MRR reduction from existing customers who downgraded but didn't churn.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/contraction-mrr. Broken down by segment: report one value per segment by grouping on the segment field of each dataset the expression reads."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"contraction_mrr\",\"gasp_version\":\"1\",\"variant\":\"by_segment\",\"unit\":\"currency\",\"formula\":\"-sum(field.mrr_change where field.event_type = 'contraction')\",\"gasp_breakdown\":\"segment\"}"
  - name: gasp_reactivation_mrr
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN revenue_event.event_type = 'reactivation' THEN revenue_event.mrr_change ELSE 0 END)
    description: Reactivation MRR. MRR regained from customers who had churned and signed up again in the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/reactivation-mrr."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"reactivation_mrr\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.mrr_change where field.event_type = 'reactivation')\"}"
  - name: gasp_reactivation_mrr_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN revenue_event.event_type = 'reactivation' THEN revenue_event.mrr_change ELSE 0 END)
    description: Reactivation MRR, by_segment breakdown. MRR regained from customers who had churned and signed up again in the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/reactivation-mrr. Broken down by segment: report one value per segment by grouping on the segment field of each dataset the expression reads."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"reactivation_mrr\",\"gasp_version\":\"1\",\"variant\":\"by_segment\",\"unit\":\"currency\",\"formula\":\"sum(field.mrr_change where field.event_type = 'reactivation')\",\"gasp_breakdown\":\"segment\"}"
  - name: gasp_carry_mrr
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_carry_mrr.value)
    description: "Carry MRR. The part of beginning MRR that existing customers kept paying in the period: beginning MRR less churned and contraction MRR, before any expansion."
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/carry-mrr. Staged (at period_start): gasp_staged_gasp_carry_mrr holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"carry_mrr","gasp_version":"1","unit":"currency","formula":"metric.mrr at period_start - metric.churned_mrr - metric.contraction_mrr","staged":true}'
  - name: gasp_net_new_mrr
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (((((SUM(CASE WHEN revenue_event.event_type = 'new' THEN revenue_event.mrr_change ELSE 0 END)) + (SUM(CASE WHEN revenue_event.event_type = 'expansion' THEN revenue_event.mrr_change ELSE 0 END))) + (SUM(CASE WHEN revenue_event.event_type = 'reactivation' THEN revenue_event.mrr_change ELSE 0 END))) - ((-SUM(CASE WHEN revenue_event.event_type = 'churn' THEN revenue_event.mrr_change ELSE 0 END)))) - ((-SUM(CASE WHEN revenue_event.event_type = 'contraction' THEN revenue_event.mrr_change ELSE 0 END))))
    description: Net New MRR. The net change in MRR after accounting for all movements.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/net-new-mrr."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"net_new_mrr","gasp_version":"1","unit":"currency","formula":"metric.new_mrr + metric.expansion_mrr + metric.reactivation_mrr - metric.churned_mrr - metric.contraction_mrr"}'
  - name: gasp_nrr
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_nrr.value)
    description: Net Revenue Retention (NRR). The percentage of revenue retained from existing customers over a period, including expansion, contraction and churn. Also known as Net Dollar Retention (NDR).
    datatype: Decimal
    ai_context:
      synonyms:
        - NRR
        - NDR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/net-revenue-retention-nrr. Staged (cohort): gasp_staged_gasp_nrr holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"nrr","gasp_version":"1","unit":"percent","formula":"(metric.mrr at period_start + metric.expansion_mrr - metric.contraction_mrr - metric.churned_mrr) / metric.mrr at period_start over cohort(field.customer_id, period_start)","staged":true}'
  - name: gasp_nrr_o
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_nrr_o.value)
    description: Net Revenue Retention (NRR), Operating form. The percentage of revenue retained from existing customers over a period, including expansion, contraction and churn. Also known as Net Dollar Retention (NDR).
    datatype: Decimal
    ai_context:
      synonyms:
        - NRR
        - NDR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/net-revenue-retention-nrr. Staged (cohort): gasp_staged_gasp_nrr_o holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"nrr\",\"gasp_version\":\"1\",\"form\":\"O\",\"unit\":\"percent\",\"formula\":\"(metric.mrr at period_start + sum(field.mrr_change where field.event_type = 'expansion' and field.expansion_classification in ('same_product', 'usage_realisation')) - metric.contraction_mrr - metric.churned_mrr) / metric.mrr at period_start over cohort(field.customer_id, period_start)\",\"staged\":true}"
  - name: gasp_nrr_m
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_nrr_m.value)
    description: Net Revenue Retention (NRR), Market form. The percentage of revenue retained from existing customers over a period, including expansion, contraction and churn. Also known as Net Dollar Retention (NDR).
    datatype: Decimal
    ai_context:
      synonyms:
        - NRR
        - NDR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/net-revenue-retention-nrr. Staged (cohort): gasp_staged_gasp_nrr_m holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"nrr\",\"gasp_version\":\"1\",\"form\":\"M\",\"unit\":\"percent\",\"formula\":\"(metric.mrr at period_start + sum(field.mrr_change where field.event_type in ('expansion', 'reactivation') and field.expansion_classification in ('same_product', 'new_module', 'new_buying_centre', 'pricing_adjustment', 'recontracting', 'usage_realisation')) - metric.contraction_mrr - metric.churned_mrr) / metric.mrr at period_start over cohort(field.customer_id, period_start)\",\"staged\":true}"
  - name: gasp_nrr_adjusted
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_nrr_adjusted.value)
    description: Net Revenue Retention (NRR), adjusted variant. The percentage of revenue retained from existing customers over a period, including expansion, contraction and churn. Also known as Net Dollar Retention (NDR).
    datatype: Decimal
    ai_context:
      synonyms:
        - NRR
        - NDR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/net-revenue-retention-nrr. Staged (cohort): gasp_staged_gasp_nrr_adjusted holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"nrr\",\"gasp_version\":\"1\",\"variant\":\"adjusted\",\"unit\":\"percent\",\"formula\":\"(sum(field.mrr_start) + sum(field.mrr_change where field.event_type in ('expansion', 'contraction', 'churn') and field.change_nature = 'permanent')) / sum(field.mrr_start) over cohort(field.customer_id, period_start)\",\"staged\":true}"
  - name: gasp_nrr_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_nrr_by_segment.value)
    description: Net Revenue Retention (NRR), by_segment breakdown. The percentage of revenue retained from existing customers over a period, including expansion, contraction and churn. Also known as Net Dollar Retention (NDR).
    datatype: Decimal
    ai_context:
      synonyms:
        - NRR
        - NDR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/net-revenue-retention-nrr. Broken down by segment: report one value per segment. Staged (cohort): gasp_staged_gasp_nrr_by_segment holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"nrr","gasp_version":"1","variant":"by_segment","unit":"percent","formula":"(metric.mrr at period_start + metric.expansion_mrr - metric.contraction_mrr - metric.churned_mrr) / metric.mrr at period_start over cohort(field.customer_id, period_start)","gasp_breakdown":"segment","staged":true}'
  - name: gasp_grr
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_grr.value)
    description: Gross Revenue Retention (GRR). The percentage of revenue retained from existing customers, excluding expansion revenue. Also known as Gross Dollar Retention.
    datatype: Decimal
    ai_context:
      synonyms:
        - GRR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/gross-revenue-retention-grr. Staged (cohort): gasp_staged_gasp_grr holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"grr","gasp_version":"1","unit":"percent","formula":"(metric.mrr at period_start - metric.contraction_mrr - metric.churned_mrr) / metric.mrr at period_start over cohort(field.customer_id, period_start)","staged":true}'
  - name: gasp_grr_per_customer
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_grr_per_customer.value)
    description: Gross Revenue Retention (GRR), per_customer variant. The percentage of revenue retained from existing customers, excluding expansion revenue. Also known as Gross Dollar Retention.
    datatype: Decimal
    ai_context:
      synonyms:
        - GRR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/gross-revenue-retention-grr. Staged (cohort): gasp_staged_gasp_grr_per_customer holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"grr","gasp_version":"1","variant":"per_customer","unit":"percent","formula":"sum(min(field.mrr_end, field.mrr_start)) / sum(field.mrr_start) over cohort(field.customer_id, period_start)","staged":true}'
  - name: gasp_grr_adjusted
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_grr_adjusted.value)
    description: Gross Revenue Retention (GRR), adjusted variant. The percentage of revenue retained from existing customers, excluding expansion revenue. Also known as Gross Dollar Retention.
    datatype: Decimal
    ai_context:
      synonyms:
        - GRR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/gross-revenue-retention-grr. Staged (cohort): gasp_staged_gasp_grr_adjusted holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"grr\",\"gasp_version\":\"1\",\"variant\":\"adjusted\",\"unit\":\"percent\",\"formula\":\"(sum(field.mrr_start) + sum(field.mrr_change where field.event_type in ('contraction', 'churn') and field.change_nature = 'permanent')) / sum(field.mrr_start) over cohort(field.customer_id, period_start)\",\"staged\":true}"
  - name: gasp_grr_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_grr_by_segment.value)
    description: Gross Revenue Retention (GRR), by_segment breakdown. The percentage of revenue retained from existing customers, excluding expansion revenue. Also known as Gross Dollar Retention.
    datatype: Decimal
    ai_context:
      synonyms:
        - GRR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/gross-revenue-retention-grr. Broken down by segment: report one value per segment. Staged (cohort): gasp_staged_gasp_grr_by_segment holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"grr","gasp_version":"1","variant":"by_segment","unit":"percent","formula":"(metric.mrr at period_start - metric.contraction_mrr - metric.churned_mrr) / metric.mrr at period_start over cohort(field.customer_id, period_start)","gasp_breakdown":"segment","staged":true}'
  - name: gasp_logo_churn_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_logo_churn_rate.value)
    description: Logo Churn Rate (Customer Churn). The percentage of customers lost in a period. Also called customer churn or logo churn.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/logo-churn-rate-customer-churn. Staged (at period_start): gasp_staged_gasp_logo_churn_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"logo_churn_rate","gasp_version":"1","unit":"percent","formula":"metric.churned_customers / metric.total_customers at period_start","staged":true}'
  - name: gasp_logo_churn_rate_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_logo_churn_rate_by_segment.value)
    description: Logo Churn Rate (Customer Churn), by_segment breakdown. The percentage of customers lost in a period. Also called customer churn or logo churn.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/logo-churn-rate-customer-churn. Broken down by segment: report one value per segment. Staged (at period_start): gasp_staged_gasp_logo_churn_rate_by_segment holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"logo_churn_rate","gasp_version":"1","variant":"by_segment","unit":"percent","formula":"metric.churned_customers / metric.total_customers at period_start","gasp_breakdown":"segment","staged":true}'
  - name: gasp_revenue_churn_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_revenue_churn_rate.value)
    description: Revenue Churn Rate. The percentage of MRR lost to churn and contraction in a period. Also called MRR Churn Rate.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/revenue-churn-rate. Staged (at period_start): gasp_staged_gasp_revenue_churn_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"revenue_churn_rate","gasp_version":"1","unit":"percent","formula":"(metric.churned_mrr + metric.contraction_mrr) / metric.mrr at period_start","staged":true}'
  - name: gasp_revenue_churn_rate_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_revenue_churn_rate_by_segment.value)
    description: Revenue Churn Rate, by_segment breakdown. The percentage of MRR lost to churn and contraction in a period. Also called MRR Churn Rate.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/revenue-churn-rate. Broken down by segment: report one value per segment. Staged (at period_start): gasp_staged_gasp_revenue_churn_rate_by_segment holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"revenue_churn_rate","gasp_version":"1","variant":"by_segment","unit":"percent","formula":"(metric.churned_mrr + metric.contraction_mrr) / metric.mrr at period_start","gasp_breakdown":"segment","staged":true}'
  - name: gasp_nps
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: ((CAST((COUNT(CASE WHEN (survey_response.survey_type = 'customer' AND survey_response.nps_score >= 9) THEN survey_response.nps_score END) - COUNT(CASE WHEN (survey_response.survey_type = 'customer' AND survey_response.nps_score <= 6) THEN survey_response.nps_score END)) AS DECIMAL) / NULLIF(COUNT(CASE WHEN survey_response.survey_type = 'customer' THEN survey_response.nps_score END), 0)) * 100)
    description: NPS (Net Promoter Score). A measure of customer loyalty based on likelihood to recommend.
    datatype: Decimal
    ai_context:
      synonyms:
        - NPS
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/nps-net-promoter-score."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"nps\",\"gasp_version\":\"1\",\"unit\":\"score\",\"formula\":\"(count(field.nps_score where field.survey_type = 'customer' and field.nps_score >= 9) - count(field.nps_score where field.survey_type = 'customer' and field.nps_score <= 6)) / count(field.nps_score where field.survey_type = 'customer') * 100\"}"
  - name: gasp_cac
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(CASE WHEN cost_event.cost_function = 'gtm' THEN cost_event.cost ELSE 0 END) AS DECIMAL) / NULLIF((COUNT(DISTINCT CASE WHEN revenue_event.event_type = 'new' THEN revenue_event.customer_id END)), 0))
    description: CAC (Customer Acquisition Cost). The total cost to acquire a new customer.
    datatype: Decimal
    ai_context:
      synonyms:
        - CAC
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/cac-customer-acquisition-cost."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"cac\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.cost where field.cost_function = 'gtm') / metric.new_customers\"}"
  - name: gasp_cac_o
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST((SUM(CASE WHEN cost_event.cost_function = 'gtm' THEN cost_event.cost ELSE 0 END) + SUM(CASE WHEN cost_event.cost_function IN ('implementation', 'onboarding') THEN cost_event.cost ELSE 0 END)) AS DECIMAL) / NULLIF((COUNT(DISTINCT CASE WHEN revenue_event.event_type = 'new' THEN revenue_event.customer_id END)), 0))
    description: CAC (Customer Acquisition Cost), Operating form. The total cost to acquire a new customer.
    datatype: Decimal
    ai_context:
      synonyms:
        - CAC
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/cac-customer-acquisition-cost."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"cac\",\"gasp_version\":\"1\",\"form\":\"O\",\"unit\":\"currency\",\"formula\":\"(sum(field.cost where field.cost_function = 'gtm') + sum(field.cost where field.cost_function in ('implementation', 'onboarding'))) / metric.new_customers\"}"
  - name: gasp_cac_m
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(CASE WHEN cost_event.cost_function = 'gtm' THEN cost_event.cost ELSE 0 END) AS DECIMAL) / NULLIF((COUNT(DISTINCT CASE WHEN revenue_event.event_type = 'new' THEN revenue_event.customer_id END)), 0))
    description: CAC (Customer Acquisition Cost), Market form. The total cost to acquire a new customer.
    datatype: Decimal
    ai_context:
      synonyms:
        - CAC
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/cac-customer-acquisition-cost."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"cac\",\"gasp_version\":\"1\",\"form\":\"M\",\"unit\":\"currency\",\"formula\":\"sum(field.cost where field.cost_function = 'gtm') / metric.new_customers\"}"
  - name: gasp_cac_by_cost_centre
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_cac_by_cost_centre.value)
    description: CAC (Customer Acquisition Cost), by_cost_centre breakdown. The total cost to acquire a new customer.
    datatype: Decimal
    ai_context:
      synonyms:
        - CAC
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/cac-customer-acquisition-cost. Broken down by cost_centre: report one value per cost_centre. Staged (total): gasp_staged_gasp_cac_by_cost_centre holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"cac\",\"gasp_version\":\"1\",\"variant\":\"by_cost_centre\",\"unit\":\"currency\",\"formula\":\"sum(field.cost where field.cost_function = 'gtm') / metric.new_customers\",\"gasp_breakdown\":\"cost_centre\",\"staged\":true}"
  - name: gasp_ltv
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_ltv.value)
    description: LTV (Customer Lifetime Value). The gross profit expected from a customer over their lifetime. Also known as CLV (Customer Lifetime Value) or CLTV.
    datatype: Decimal
    ai_context:
      synonyms:
        - LTV
        - CLV
        - CLTV
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/ltv-customer-lifetime-value. Staged (at period_start): gasp_staged_gasp_ltv holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"ltv","gasp_version":"1","unit":"currency","formula":"metric.arpa * metric.gross_margin / metric.revenue_churn_rate","staged":true}'
  - name: gasp_ltv_o
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_ltv_o.value)
    description: LTV (Customer Lifetime Value), Operating form. The gross profit expected from a customer over their lifetime. Also known as CLV (Customer Lifetime Value) or CLTV.
    datatype: Decimal
    ai_context:
      synonyms:
        - LTV
        - CLV
        - CLTV
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/ltv-customer-lifetime-value. Staged (at period_start): gasp_staged_gasp_ltv_o holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"ltv","gasp_version":"1","form":"O","unit":"currency","formula":"metric.arpa * metric.gross_margin.O / metric.revenue_churn_rate","staged":true}'
  - name: gasp_ltv_m
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_ltv_m.value)
    description: LTV (Customer Lifetime Value), Market form. The gross profit expected from a customer over their lifetime. Also known as CLV (Customer Lifetime Value) or CLTV.
    datatype: Decimal
    ai_context:
      synonyms:
        - LTV
        - CLV
        - CLTV
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/ltv-customer-lifetime-value. Staged (at period_start): gasp_staged_gasp_ltv_m holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"ltv","gasp_version":"1","form":"M","unit":"currency","formula":"metric.arpa * metric.gross_margin / metric.revenue_churn_rate","staged":true}'
  - name: gasp_ltv_cac_ratio
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_ltv_cac_ratio.value)
    description: LTV:CAC Ratio. The ratio of customer lifetime value to acquisition cost. Measures the return on investment from sales and marketing spend.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/ltvcac-ratio. Staged (at period_start): gasp_staged_gasp_ltv_cac_ratio holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"ltv_cac_ratio","gasp_version":"1","unit":"ratio","formula":"metric.ltv / metric.cac","staged":true}'
  - name: gasp_ltv_cac_ratio_o
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_ltv_cac_ratio_o.value)
    description: LTV:CAC Ratio, Operating form. The ratio of customer lifetime value to acquisition cost. Measures the return on investment from sales and marketing spend.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/ltvcac-ratio. Staged (at period_start): gasp_staged_gasp_ltv_cac_ratio_o holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"ltv_cac_ratio","gasp_version":"1","form":"O","unit":"ratio","formula":"metric.ltv.O / metric.cac.O","staged":true}'
  - name: gasp_ltv_cac_ratio_m
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_ltv_cac_ratio_m.value)
    description: LTV:CAC Ratio, Market form. The ratio of customer lifetime value to acquisition cost. Measures the return on investment from sales and marketing spend.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/ltvcac-ratio. Staged (at period_start): gasp_staged_gasp_ltv_cac_ratio_m holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"ltv_cac_ratio","gasp_version":"1","form":"M","unit":"ratio","formula":"metric.ltv.M / metric.cac.M","staged":true}'
  - name: gasp_cac_payback
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(((CAST(SUM(CASE WHEN cost_event.cost_function = 'gtm' THEN cost_event.cost ELSE 0 END) AS DECIMAL) / NULLIF((COUNT(DISTINCT CASE WHEN revenue_event.event_type = 'new' THEN revenue_event.customer_id END)), 0))) AS DECIMAL) / NULLIF((((CAST((SUM(CASE WHEN subscription.subscription_status = 'active' THEN subscription.mrr ELSE 0 END)) AS DECIMAL) / NULLIF((COUNT(DISTINCT CASE WHEN customer.customer_status = 'active' THEN customer.customer_id END)), 0))) * ((CAST((SUM(financials.revenue) - SUM(CASE WHEN cost_event.cost_function = 'infrastructure' THEN cost_event.cost ELSE 0 END)) AS DECIMAL) / NULLIF(SUM(financials.revenue), 0)))), 0))
    description: CAC Payback Period. The number of months required to recover the cost of acquiring a customer. Also called "Months to Recover CAC" or "Time to Recover CAC."
    datatype: Decimal
    ai_context:
      synonyms:
        - CAC
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/cac-payback-period. Reads the customer and subscription snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"cac_payback","gasp_version":"1","unit":"months","formula":"metric.cac / (metric.arpa * metric.gross_margin)"}'
  - name: gasp_cac_payback_o
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(((CAST((SUM(CASE WHEN cost_event.cost_function = 'gtm' THEN cost_event.cost ELSE 0 END) + SUM(CASE WHEN cost_event.cost_function IN ('implementation', 'onboarding') THEN cost_event.cost ELSE 0 END)) AS DECIMAL) / NULLIF((COUNT(DISTINCT CASE WHEN revenue_event.event_type = 'new' THEN revenue_event.customer_id END)), 0))) AS DECIMAL) / NULLIF((((CAST((SUM(CASE WHEN subscription.subscription_status = 'active' THEN subscription.mrr ELSE 0 END)) AS DECIMAL) / NULLIF((COUNT(DISTINCT CASE WHEN customer.customer_status = 'active' THEN customer.customer_id END)), 0))) * ((CAST(((SUM(financials.revenue) - SUM(CASE WHEN cost_event.cost_function = 'infrastructure' THEN cost_event.cost ELSE 0 END)) - SUM(CASE WHEN cost_event.cost_function IN ('support', 'success_engineering', 'implementation', 'onboarding') THEN cost_event.cost ELSE 0 END)) AS DECIMAL) / NULLIF(SUM(financials.revenue), 0)))), 0))
    description: CAC Payback Period, Operating form. The number of months required to recover the cost of acquiring a customer. Also called "Months to Recover CAC" or "Time to Recover CAC."
    datatype: Decimal
    ai_context:
      synonyms:
        - CAC
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/cac-payback-period. Reads the customer and subscription snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"cac_payback","gasp_version":"1","form":"O","unit":"months","formula":"metric.cac.O / (metric.arpa * metric.gross_margin.O)"}'
  - name: gasp_cac_payback_m
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(((CAST(SUM(CASE WHEN cost_event.cost_function = 'gtm' THEN cost_event.cost ELSE 0 END) AS DECIMAL) / NULLIF((COUNT(DISTINCT CASE WHEN revenue_event.event_type = 'new' THEN revenue_event.customer_id END)), 0))) AS DECIMAL) / NULLIF((((CAST((SUM(CASE WHEN subscription.subscription_status = 'active' THEN subscription.mrr ELSE 0 END)) AS DECIMAL) / NULLIF((COUNT(DISTINCT CASE WHEN customer.customer_status = 'active' THEN customer.customer_id END)), 0))) * ((CAST((SUM(financials.revenue) - SUM(CASE WHEN cost_event.cost_function = 'infrastructure' THEN cost_event.cost ELSE 0 END)) AS DECIMAL) / NULLIF(SUM(financials.revenue), 0)))), 0))
    description: CAC Payback Period, Market form. The number of months required to recover the cost of acquiring a customer. Also called "Months to Recover CAC" or "Time to Recover CAC."
    datatype: Decimal
    ai_context:
      synonyms:
        - CAC
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/cac-payback-period. Reads the customer and subscription snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"cac_payback","gasp_version":"1","form":"M","unit":"months","formula":"metric.cac.M / (metric.arpa * metric.gross_margin.M)"}'
  - name: gasp_gross_margin
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST((SUM(financials.revenue) - SUM(CASE WHEN cost_event.cost_function = 'infrastructure' THEN cost_event.cost ELSE 0 END)) AS DECIMAL) / NULLIF(SUM(financials.revenue), 0))
    description: Gross Margin. Revenue minus cost of goods sold (COGS), as a percentage of revenue. Measures profitability after direct delivery costs.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/gross-margin."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"gross_margin\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"(sum(field.revenue) - sum(field.cost where field.cost_function = 'infrastructure')) / sum(field.revenue)\"}"
  - name: gasp_gross_margin_o
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(((SUM(financials.revenue) - SUM(CASE WHEN cost_event.cost_function = 'infrastructure' THEN cost_event.cost ELSE 0 END)) - SUM(CASE WHEN cost_event.cost_function IN ('support', 'success_engineering', 'implementation', 'onboarding') THEN cost_event.cost ELSE 0 END)) AS DECIMAL) / NULLIF(SUM(financials.revenue), 0))
    description: Gross Margin, Operating form. Revenue minus cost of goods sold (COGS), as a percentage of revenue. Measures profitability after direct delivery costs.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/gross-margin."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"gross_margin\",\"gasp_version\":\"1\",\"form\":\"O\",\"unit\":\"percent\",\"formula\":\"(sum(field.revenue) - sum(field.cost where field.cost_function = 'infrastructure') - sum(field.cost where field.cost_function in ('support', 'success_engineering', 'implementation', 'onboarding'))) / sum(field.revenue)\"}"
  - name: gasp_gross_margin_m
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST((SUM(financials.revenue) - SUM(CASE WHEN cost_event.cost_function = 'infrastructure' THEN cost_event.cost ELSE 0 END)) AS DECIMAL) / NULLIF(SUM(financials.revenue), 0))
    description: Gross Margin, Market form. Revenue minus cost of goods sold (COGS), as a percentage of revenue. Measures profitability after direct delivery costs.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/gross-margin."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"gross_margin\",\"gasp_version\":\"1\",\"form\":\"M\",\"unit\":\"percent\",\"formula\":\"(sum(field.revenue) - sum(field.cost where field.cost_function = 'infrastructure')) / sum(field.revenue)\"}"
  - name: gasp_rule_of_40
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_rule_of_40.value)
    description: Rule of 40. A heuristic that balances growth and profitability. A healthy SaaS company's growth rate plus profit margin should equal 40% or more.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/core/rule-of-40. Staged (lag): gasp_staged_gasp_rule_of_40 holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"rule_of_40","gasp_version":"1","unit":"percent","formula":"(metric.arr - lag(metric.arr, 1 year)) / lag(metric.arr, 1 year) + metric.ebitda_margin","staged":true}'
  - name: gasp_total_active_partners
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT CASE WHEN partner.partner_status = 'active' THEN partner.partner_id END)
    description: Total Active Partners. Number of partners actively engaged in the program.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/total-active-partners. Reads the partner snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"total_active_partners\",\"gasp_version\":\"1\",\"unit\":\"count\",\"formula\":\"count_distinct(field.partner_id where field.partner_status = 'active')\"}"
  - name: gasp_partner_tier_distribution
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_partner_tier_distribution.value)
    description: Partner Tier Distribution. Breakdown of partners by program tier.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/partner-tier-distribution. Broken down by partner_tier: report one value per partner_tier. Staged (total): gasp_staged_gasp_partner_tier_distribution holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"partner_tier_distribution","gasp_version":"1","unit":"percent","formula":"count_distinct(field.partner_id) / total(count_distinct(field.partner_id))","gasp_breakdown":"partner_tier","staged":true}'
  - name: gasp_partner_activation_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_partner_activation_rate.value)
    description: Partner Activation Rate. Percentage of recruited partners who become productive.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/partner-activation-rate. Staged (period bound in filter): gasp_staged_gasp_partner_activation_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"partner_activation_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.partner_id where in_period(field.partner_recruited_date) and field.partner_status = 'active') at period_end / count_distinct(field.partner_id where in_period(field.partner_recruited_date)) at period_end\",\"staged\":true}"
  - name: gasp_partner_churn_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_partner_churn_rate.value)
    description: Partner Churn Rate. Percentage of partners who leave or become inactive.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/partner-churn-rate. Staged (at period_start): gasp_staged_gasp_partner_churn_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"partner_churn_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.partner_id where in_period(field.partner_churn_date)) / count_distinct(field.partner_id where field.partner_status = 'active') at period_start\",\"staged\":true}"
  - name: gasp_partner_churn_rate_by_partner_tier
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_partner_churn_rate_by_partner_tier.value)
    description: Partner Churn Rate, by_partner_tier breakdown. Percentage of partners who leave or become inactive.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/partner-churn-rate. Broken down by partner_tier: report one value per partner_tier. Staged (at period_start): gasp_staged_gasp_partner_churn_rate_by_partner_tier holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"partner_churn_rate\",\"gasp_version\":\"1\",\"variant\":\"by_partner_tier\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.partner_id where in_period(field.partner_churn_date)) / count_distinct(field.partner_id where field.partner_status = 'active') at period_start\",\"gasp_breakdown\":\"partner_tier\",\"staged\":true}"
  - name: gasp_partner_sourced_revenue
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_partner_sourced_revenue.value)
    description: Partner-Sourced Revenue. Revenue from deals originated by partners.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/partner-sourced-revenue. Staged (period bound in filter): gasp_staged_gasp_partner_sourced_revenue holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"partner_sourced_revenue\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.opportunity_amount where field.partner_sourced = true and field.opportunity_stage = 'closed_won' and in_period(field.close_date))\",\"staged\":true}"
  - name: gasp_partner_influenced_revenue
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_partner_influenced_revenue.value)
    description: Partner-Influenced Revenue. Revenue from deals where partners were involved (but may not have originated).
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/partner-influenced-revenue. Staged (period bound in filter): gasp_staged_gasp_partner_influenced_revenue holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"partner_influenced_revenue\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.opportunity_amount where field.partner_id is not null and field.opportunity_stage = 'closed_won' and in_period(field.close_date))\",\"staged\":true}"
  - name: gasp_channel_revenue_percentage
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_channel_revenue_percentage.value)
    description: Channel Revenue Percentage. Partner-sourced revenue as a percentage of total recognised (GAAP) revenue.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/channel-revenue-percentage. Staged (period bound in filter): gasp_staged_gasp_channel_revenue_percentage holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"channel_revenue_percentage","gasp_version":"1","unit":"percent","formula":"metric.partner_sourced_revenue / metric.revenue_gaap","staged":true}'
  - name: gasp_partner_revenue_growth
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_partner_revenue_growth.value)
    description: Partner Revenue Growth. Year-over-year growth in partner-sourced revenue.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/partner-revenue-growth. Staged (lag): gasp_staged_gasp_partner_revenue_growth holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"partner_revenue_growth","gasp_version":"1","unit":"percent","formula":"(metric.partner_sourced_revenue - lag(metric.partner_sourced_revenue, 1 year)) / lag(metric.partner_sourced_revenue, 1 year)","staged":true}'
  - name: gasp_average_partner_revenue
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_average_partner_revenue.value)
    description: Average Partner Revenue. Average revenue per active partner.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/average-partner-revenue. Staged (period bound in filter): gasp_staged_gasp_average_partner_revenue holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"average_partner_revenue","gasp_version":"1","unit":"currency","formula":"metric.partner_influenced_revenue / metric.total_active_partners","staged":true}'
  - name: gasp_partner_deal_registration_volume
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_partner_deal_registration_volume.value)
    description: Partner Deal Registration Volume. Number of deals registered by partners.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/partner-deal-registration-volume. Staged (period bound in filter): gasp_staged_gasp_partner_deal_registration_volume holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"partner_deal_registration_volume","gasp_version":"1","unit":"count","formula":"count_distinct(field.registration_id where in_period(field.registration_date))","staged":true}'
  - name: gasp_deal_registration_to_close_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_deal_registration_to_close_rate.value)
    description: Deal Registration-to-Close Rate. Percentage of registered deals that close.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/deal-registration-to-close-rate. Staged (period bound in filter): gasp_staged_gasp_deal_registration_to_close_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"deal_registration_to_close_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.registration_id where field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / count_distinct(field.registration_id where in_period(field.registration_date))\",\"staged\":true}"
  - name: gasp_partner_win_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_partner_win_rate.value)
    description: Partner Win Rate. Win rate on partner-involved opportunities.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/partner-win-rate. Staged (period bound in filter): gasp_staged_gasp_partner_win_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"partner_win_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count(field.opportunity_id where field.partner_id is not null and field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / count(field.opportunity_id where field.partner_id is not null and field.opportunity_stage in ('closed_won', 'closed_lost') and in_period(field.close_date))\",\"staged\":true}"
  - name: gasp_partner_deal_size
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_partner_deal_size.value)
    description: Partner Deal Size. Average deal size for partner-sourced deals.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/partner-deal-size. Staged (period bound in filter): gasp_staged_gasp_partner_deal_size holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"partner_deal_size\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"metric.partner_sourced_revenue / count(field.opportunity_id where field.partner_sourced = true and field.opportunity_stage = 'closed_won' and in_period(field.close_date))\",\"staged\":true}"
  - name: gasp_partner_sales_cycle
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_partner_sales_cycle.value)
    description: Partner Sales Cycle. Median sales cycle for registered partner deals that closed won in the period, from registration to close.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/partner-sales-cycle. Staged (period bound in filter): gasp_staged_gasp_partner_sales_cycle holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"partner_sales_cycle\",\"gasp_version\":\"1\",\"unit\":\"days\",\"formula\":\"median(field.close_date - field.registration_date where field.opportunity_stage = 'closed_won' and in_period(field.close_date))\",\"staged\":true}"
  - name: gasp_certification_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN partner.certification_status = 'certified' THEN partner.partner_id END) AS DECIMAL) / NULLIF((COUNT(DISTINCT CASE WHEN partner.partner_status = 'active' THEN partner.partner_id END)), 0))
    description: Certification Rate. Percentage of partners with current certifications.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/certification-rate. Reads the partner snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"certification_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.partner_id where field.certification_status = 'certified') / metric.total_active_partners\"}"
  - name: gasp_training_completion
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN partner.training_completed = TRUE THEN partner.partner_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT partner.partner_id), 0))
    description: Training Completion. Percentage of partners completing required training.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/training-completion. Reads the partner snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"training_completion","gasp_version":"1","unit":"percent","formula":"count_distinct(field.partner_id where field.training_completed = true) / count_distinct(field.partner_id)"}'
  - name: gasp_joint_marketing_activities
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(CASE WHEN partner_activity.partner_activity_type IN ('webinar', 'event', 'content', 'campaign') THEN partner_activity.activity_id END)
    description: Joint Marketing Activities. Number of co-marketing activities with partners.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/joint-marketing-activities."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"joint_marketing_activities\",\"gasp_version\":\"1\",\"unit\":\"count\",\"formula\":\"count(field.activity_id where field.partner_activity_type in ('webinar', 'event', 'content', 'campaign'))\"}"
  - name: gasp_partner_nps
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: ((CAST((COUNT(CASE WHEN (survey_response.survey_type = 'partner' AND survey_response.nps_score >= 9) THEN survey_response.nps_score END) - COUNT(CASE WHEN (survey_response.survey_type = 'partner' AND survey_response.nps_score <= 6) THEN survey_response.nps_score END)) AS DECIMAL) / NULLIF(COUNT(CASE WHEN survey_response.survey_type = 'partner' THEN survey_response.nps_score END), 0)) * 100)
    description: Partner NPS. Net Promoter Score from partner satisfaction surveys.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/partner-nps."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"partner_nps\",\"gasp_version\":\"1\",\"unit\":\"score\",\"formula\":\"(count(field.nps_score where field.survey_type = 'partner' and field.nps_score >= 9) - count(field.nps_score where field.survey_type = 'partner' and field.nps_score <= 6)) / count(field.nps_score where field.survey_type = 'partner') * 100\"}"
  - name: gasp_partner_margin_commission
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_partner_margin_commission.value)
    description: Partner Margin / Commission. Compensation paid to partners.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/partner-margin-commission. Staged (period bound in filter): gasp_staged_gasp_partner_margin_commission holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"partner_margin_commission\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"sum(field.cost where field.cost_function = 'partner_commission') / metric.partner_sourced_revenue\",\"staged\":true}"
  - name: gasp_cost_of_partner_acquisition
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_cost_of_partner_acquisition.value)
    description: Cost of Partner Acquisition. Cost to recruit and onboard a new partner.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/cost-of-partner-acquisition. Staged (period bound in filter): gasp_staged_gasp_cost_of_partner_acquisition holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"cost_of_partner_acquisition\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.cost where field.cost_function = 'partner_program') / count_distinct(field.partner_id where in_period(field.partner_recruited_date))\",\"staged\":true}"
  - name: gasp_partner_lifetime_value
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_partner_lifetime_value.value)
    description: Partner Lifetime Value. Expected revenue from a partner over its lifetime.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/partner-lifetime-value. Staged (at period_start): gasp_staged_gasp_partner_lifetime_value holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"partner_lifetime_value","gasp_version":"1","unit":"currency","formula":"metric.average_partner_revenue / metric.partner_churn_rate","staged":true}'
  - name: gasp_partner_roi
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_partner_roi.value)
    description: Partner ROI. Return on investment in partner program.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/partner-roi. Staged (period bound in filter): gasp_staged_gasp_partner_roi holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"partner_roi\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"(metric.partner_sourced_revenue - sum(field.cost where field.cost_function = 'partner_program')) / sum(field.cost where field.cost_function = 'partner_program')\",\"staged\":true}"
  - name: gasp_marketplace_revenue
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_marketplace_revenue.value)
    description: Marketplace Revenue. Revenue transacted through marketplace (AWS, Azure, etc.).
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/marketplace-revenue. Staged (period bound in filter): gasp_staged_gasp_marketplace_revenue holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"marketplace_revenue\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.opportunity_amount where field.channel = 'marketplace' and field.opportunity_stage = 'closed_won' and in_period(field.close_date))\",\"staged\":true}"
  - name: gasp_marketplace_as_of_revenue
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_marketplace_as_of_revenue.value)
    description: Marketplace as % of Revenue. Marketplace contribution to total revenue.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/partnerships/marketplace-as-of-revenue. Staged (period bound in filter): gasp_staged_gasp_marketplace_as_of_revenue holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"marketplace_as_of_revenue","gasp_version":"1","unit":"percent","formula":"metric.marketplace_revenue / metric.revenue_gaap","staged":true}'
  - name: gasp_pipeline_value
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN opportunity.opportunity_stage NOT IN ('closed_won', 'closed_lost') THEN (opportunity.opportunity_amount * opportunity.stage_probability) ELSE 0 END)
    description: Pipeline Value. Total value of open sales opportunities, weighted by stage probability unless stated as unweighted.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/sales/pipeline-value. Reads the opportunity snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"pipeline_value\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.opportunity_amount * field.stage_probability where field.opportunity_stage not in ('closed_won', 'closed_lost'))\"}"
  - name: gasp_pipeline_value_unweighted
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN opportunity.opportunity_stage NOT IN ('closed_won', 'closed_lost') THEN opportunity.opportunity_amount ELSE 0 END)
    description: Pipeline Value, unweighted variant. Total value of open sales opportunities, weighted by stage probability unless stated as unweighted.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/sales/pipeline-value. Reads the opportunity snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"pipeline_value\",\"gasp_version\":\"1\",\"variant\":\"unweighted\",\"unit\":\"currency\",\"formula\":\"sum(field.opportunity_amount where field.opportunity_stage not in ('closed_won', 'closed_lost'))\"}"
  - name: gasp_pipeline_coverage
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(CASE WHEN opportunity.opportunity_stage NOT IN ('closed_won', 'closed_lost') THEN opportunity.opportunity_amount ELSE 0 END) AS DECIMAL) / NULLIF(SUM(sales_rep.quota), 0))
    description: Pipeline Coverage Ratio. The ratio of unweighted pipeline value to quota for the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/sales/pipeline-coverage-ratio. Reads the opportunity snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"pipeline_coverage\",\"gasp_version\":\"1\",\"unit\":\"ratio\",\"formula\":\"sum(field.opportunity_amount where field.opportunity_stage not in ('closed_won', 'closed_lost')) / sum(field.quota)\"}"
  - name: gasp_pipeline_velocity
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_pipeline_velocity.value)
    description: Pipeline Velocity. The speed at which pipeline converts to revenue. Also called Sales Velocity or Deal Velocity.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/sales/pipeline-velocity. Staged (period bound in filter): gasp_staged_gasp_pipeline_velocity holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"pipeline_velocity\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"count(field.opportunity_id where field.opportunity_stage not in ('closed_won', 'closed_lost')) * metric.win_rate * metric.average_deal_size / metric.sales_cycle\",\"staged\":true}"
  - name: gasp_win_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_win_rate.value)
    description: Win Rate. The percentage of qualified opportunities closed in the period that were won.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/sales/win-rate. Staged (period bound in filter): gasp_staged_gasp_win_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"win_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count(field.opportunity_id where field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / count(field.opportunity_id where field.opportunity_stage in ('closed_won', 'closed_lost') and in_period(field.close_date))\",\"staged\":true}"
  - name: gasp_win_rate_by_channel
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_win_rate_by_channel.value)
    description: Win Rate, by_channel breakdown. The percentage of qualified opportunities closed in the period that were won.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/sales/win-rate. Broken down by channel: report one value per channel. Staged (period bound in filter): gasp_staged_gasp_win_rate_by_channel holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"win_rate\",\"gasp_version\":\"1\",\"variant\":\"by_channel\",\"unit\":\"percent\",\"formula\":\"count(field.opportunity_id where field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / count(field.opportunity_id where field.opportunity_stage in ('closed_won', 'closed_lost') and in_period(field.close_date))\",\"gasp_breakdown\":\"channel\",\"staged\":true}"
  - name: gasp_lead_to_opportunity_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_lead_to_opportunity_rate.value)
    description: Lead-to-Opportunity Rate. The percentage of leads that become qualified opportunities.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/sales/lead-to-opportunity-rate. Staged (period bound in filter): gasp_staged_gasp_lead_to_opportunity_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"lead_to_opportunity_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.opportunity_id where in_period(field.opportunity_created_date)) / count_distinct(field.lead_id where in_period(field.lead_created_date))","staged":true}'
  - name: gasp_opportunity_to_close_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_opportunity_to_close_rate.value)
    description: Opportunity-to-Close Rate. The percentage of qualified opportunities that close as won. Also called Close Rate.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/sales/opportunity-to-close-rate. Staged (period bound in filter): gasp_staged_gasp_opportunity_to_close_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"opportunity_to_close_rate","gasp_version":"1","unit":"percent","formula":"metric.win_rate","staged":true}'
  - name: gasp_acv
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: AVG(CASE WHEN contract_event.contract_event_type = 'new_contract' THEN contract_event.acv END)
    description: ACV (Annual Contract Value). The annualized value of a contract, normalizing multi-year deals to a single year. Aggregated, it is the average ACV of new contracts signed in the period.
    datatype: Decimal
    ai_context:
      synonyms:
        - ACV
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/sales/acv-annual-contract-value."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"acv\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"avg(field.acv where field.contract_event_type = 'new_contract')\"}"
  - name: gasp_average_deal_size
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_average_deal_size.value)
    description: Average Deal Size. The average total value of deals won in the period (total contract value, not annualized).
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/sales/average-deal-size. Staged (period bound in filter): gasp_staged_gasp_average_deal_size holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"average_deal_size\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.opportunity_amount where field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / count(field.opportunity_id where field.opportunity_stage = 'closed_won' and in_period(field.close_date))\",\"staged\":true}"
  - name: gasp_sales_cycle
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_sales_cycle.value)
    description: Sales Cycle Length. The average time from opportunity creation to close.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/sales/sales-cycle-length. Staged (period bound in filter): gasp_staged_gasp_sales_cycle holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"sales_cycle\",\"gasp_version\":\"1\",\"unit\":\"days\",\"formula\":\"avg(field.close_date - field.opportunity_created_date where field.opportunity_stage = 'closed_won' and in_period(field.close_date))\",\"staged\":true}"
  - name: gasp_sales_cycle_median
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_sales_cycle_median.value)
    description: Sales Cycle Length, median variant. The average time from opportunity creation to close.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/sales/sales-cycle-length. Staged (period bound in filter): gasp_staged_gasp_sales_cycle_median holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"sales_cycle\",\"gasp_version\":\"1\",\"variant\":\"median\",\"unit\":\"days\",\"formula\":\"median(field.close_date - field.opportunity_created_date where field.opportunity_stage = 'closed_won' and in_period(field.close_date))\",\"staged\":true}"
  - name: gasp_quota_attainment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(sales_rep.closed_revenue) AS DECIMAL) / NULLIF(SUM(sales_rep.quota), 0))
    description: Quota Attainment. The percentage of quota achieved by a rep or team.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/sales/quota-attainment."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"quota_attainment","gasp_version":"1","unit":"percent","formula":"sum(field.closed_revenue) / sum(field.quota)"}'
  - name: gasp_quota_attainment_mean_of_reps
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: AVG((CAST(sales_rep.closed_revenue AS DECIMAL) / NULLIF(sales_rep.quota, 0)))
    description: Quota Attainment, mean_of_reps variant. The percentage of quota achieved by a rep or team.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/sales/quota-attainment."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"quota_attainment","gasp_version":"1","variant":"mean_of_reps","unit":"percent","formula":"avg(field.closed_revenue / field.quota)"}'
  - name: gasp_revenue_per_rep
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(sales_rep.closed_revenue) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN sales_rep.quota > 0 THEN sales_rep.rep_id END), 0))
    description: Revenue per Rep. New revenue closed in the period divided by the number of quota-carrying reps.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/sales/revenue-per-rep."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"revenue_per_rep","gasp_version":"1","unit":"currency","formula":"sum(field.closed_revenue) / count_distinct(field.rep_id where field.quota > 0)"}'
  - name: gasp_ramp_time
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(AVG(DATEDIFF(day, sales_rep.hire_date, sales_rep.ramped_date)) AS DECIMAL) / 30.4375)
    description: Ramp Time. Time for a new sales rep to reach full productivity (carrying full quota).
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/sales/ramp-time."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"ramp_time","gasp_version":"1","unit":"months","formula":"(avg(field.ramped_date - field.hire_date)) / 30.4375"}'
  - name: gasp_services_revenue
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN financials.revenue_type = 'services' THEN financials.revenue ELSE 0 END)
    description: Services Revenue. Revenue from professional services (implementation, consulting, training).
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/services-revenue."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"services_revenue\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.revenue where field.revenue_type = 'services')\"}"
  - name: gasp_services_as_of_total_revenue
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST((SUM(CASE WHEN financials.revenue_type = 'services' THEN financials.revenue ELSE 0 END)) AS DECIMAL) / NULLIF(SUM(financials.revenue), 0))
    description: Services as % of Total Revenue. Professional services contribution to total revenue.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/services-as-of-total-revenue."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"services_as_of_total_revenue","gasp_version":"1","unit":"percent","formula":"metric.services_revenue / sum(field.revenue)"}'
  - name: gasp_services_attach_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_services_attach_rate.value)
    description: Services Attach Rate. Percentage of product deals that include services.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/services-attach-rate. Staged (period bound in filter): gasp_staged_gasp_services_attach_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"services_attach_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.opportunity_id where field.includes_services = true and field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / count_distinct(field.opportunity_id where field.opportunity_stage = 'closed_won' and in_period(field.close_date))\",\"staged\":true}"
  - name: gasp_average_services_deal_size
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(CASE WHEN opportunity.revenue_type = 'services' THEN opportunity.opportunity_amount ELSE 0 END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN opportunity.revenue_type = 'services' THEN opportunity.opportunity_id END), 0))
    description: Average Services Deal Size. Average value of services engagements.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/average-services-deal-size. Reads the opportunity snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"average_services_deal_size\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.opportunity_amount where field.revenue_type = 'services') / count_distinct(field.opportunity_id where field.revenue_type = 'services')\"}"
  - name: gasp_services_backlog
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_services_backlog.value)
    description: Services Backlog. Contracted services not yet delivered.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/services-backlog. Staged (to_date): gasp_staged_gasp_services_backlog holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"services_backlog\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.opportunity_amount where field.revenue_type = 'services' and field.opportunity_stage = 'closed_won') to_date - metric.services_revenue to_date\",\"staged\":true}"
  - name: gasp_services_gross_margin
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(((SUM(CASE WHEN financials.revenue_type = 'services' THEN financials.revenue ELSE 0 END)) - SUM(CASE WHEN cost_event.cost_function = 'services_delivery' THEN cost_event.cost ELSE 0 END)) AS DECIMAL) / NULLIF((SUM(CASE WHEN financials.revenue_type = 'services' THEN financials.revenue ELSE 0 END)), 0))
    description: Services Gross Margin. Services revenue minus direct delivery costs.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/services-gross-margin."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"services_gross_margin\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"(metric.services_revenue - sum(field.cost where field.cost_function = 'services_delivery')) / metric.services_revenue\"}"
  - name: gasp_project_margin
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_project_margin.value)
    description: Project Margin. Gross margin on individual projects.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/project-margin. Staged (period bound in filter): gasp_staged_gasp_project_margin holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"project_margin","gasp_version":"1","unit":"percent","formula":"(sum(field.project_revenue where in_period(field.project_completion_date)) - sum(field.project_cost where in_period(field.project_completion_date))) / sum(field.project_revenue where in_period(field.project_completion_date))","staged":true}'
  - name: gasp_realization_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(time_entry.billed_revenue) AS DECIMAL) / NULLIF(SUM((time_entry.billed_hours * time_entry.standard_rate)), 0))
    description: Realization Rate. Actual revenue realized vs potential revenue at standard rates.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/realization-rate."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"realization_rate","gasp_version":"1","unit":"percent","formula":"sum(field.billed_revenue) / sum(field.billed_hours * field.standard_rate)"}'
  - name: gasp_write_off_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(time_entry.written_off_hours) AS DECIMAL) / NULLIF(SUM(time_entry.billed_hours), 0))
    description: Write-off Rate. Percentage of billable hours written off (not billed to client).
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/write-off-rate."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"write_off_rate","gasp_version":"1","unit":"percent","formula":"sum(field.written_off_hours) / sum(field.billed_hours)"}'
  - name: gasp_billable_utilization
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(CASE WHEN time_entry.time_entry_type = 'billable' THEN time_entry.hours ELSE 0 END) AS DECIMAL) / NULLIF(SUM(consultant.available_hours), 0))
    description: Billable Utilization. Percentage of available time spent on billable work.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/billable-utilization."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"billable_utilization\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"sum(field.hours where field.time_entry_type = 'billable') / sum(field.available_hours)\"}"
  - name: gasp_total_utilization
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(CASE WHEN time_entry.time_entry_type IN ('billable', 'training', 'pre_sales', 'internal') THEN time_entry.hours ELSE 0 END) AS DECIMAL) / NULLIF(SUM(consultant.available_hours), 0))
    description: Total Utilization. Percentage of time spent on all productive work (billable + non-billable).
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/total-utilization."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"total_utilization\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"sum(field.hours where field.time_entry_type in ('billable', 'training', 'pre_sales', 'internal')) / sum(field.available_hours)\"}"
  - name: gasp_bench_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN project.project_id IS NULL THEN project.consultant_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT consultant.consultant_id), 0))
    description: Bench Rate. Percentage of team without billable assignment.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/bench-rate. Reads the project snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"bench_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.consultant_id where field.project_id is null) / count_distinct(field.consultant_id)"}'
  - name: gasp_capacity
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(consultant.available_hours)
    description: Capacity. Total billable hours available in period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/capacity."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"capacity","gasp_version":"1","unit":"hours","formula":"sum(field.available_hours)"}'
  - name: gasp_capacity_utilization
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(project.hours_budgeted) AS DECIMAL) / NULLIF((SUM(consultant.available_hours)), 0))
    description: Capacity Utilization. Billable hours sold vs available. Hours booked are the budgeted hours on sold projects.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/capacity-utilization. Reads the project snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"capacity_utilization","gasp_version":"1","unit":"percent","formula":"sum(field.hours_budgeted) / metric.capacity"}'
  - name: gasp_on_time_delivery
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_on_time_delivery.value)
    description: On-Time Delivery. Percentage of projects delivered by committed date.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/on-time-delivery. Staged (period bound in filter): gasp_staged_gasp_on_time_delivery holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"on_time_delivery","gasp_version":"1","unit":"percent","formula":"count_distinct(field.project_id where in_period(field.project_completion_date) and field.project_completion_date <= field.target_date) / count_distinct(field.project_id where in_period(field.project_completion_date))","staged":true}'
  - name: gasp_on_budget_delivery
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_on_budget_delivery.value)
    description: On-Budget Delivery. Percentage of projects completed in the period within their budgeted hours.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/on-budget-delivery. Staged (period bound in filter): gasp_staged_gasp_on_budget_delivery holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"on_budget_delivery","gasp_version":"1","unit":"percent","formula":"count_distinct(field.project_id where in_period(field.project_completion_date) and field.hours_actual <= field.hours_budgeted) / count_distinct(field.project_id where in_period(field.project_completion_date))","staged":true}'
  - name: gasp_scope_change_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN project.scope_changed = TRUE THEN project.project_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT project.project_id), 0))
    description: Scope Change Rate. Percentage of projects with scope changes.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/scope-change-rate. Reads the project snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"scope_change_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.project_id where field.scope_changed = true) / count_distinct(field.project_id)"}'
  - name: gasp_project_duration_accuracy
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_project_duration_accuracy.value)
    description: Project Duration Accuracy. Actual duration vs estimated duration.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/project-duration-accuracy. Staged (period bound in filter): gasp_staged_gasp_project_duration_accuracy holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"project_duration_accuracy","gasp_version":"1","unit":"percent","formula":"avg((field.target_date - field.project_start_date) / (field.project_completion_date - field.project_start_date) where in_period(field.project_completion_date))","staged":true}'
  - name: gasp_project_csat
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(CASE WHEN (survey_response.survey_type = 'project' AND survey_response.satisfaction_score >= 4) THEN survey_response.satisfaction_score END) AS DECIMAL) / NULLIF(COUNT(CASE WHEN survey_response.survey_type = 'project' THEN survey_response.satisfaction_score END), 0))
    description: Project CSAT. Customer satisfaction with services engagement.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/project-csat."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"project_csat\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count(field.satisfaction_score where field.survey_type = 'project' and field.satisfaction_score >= 4) / count(field.satisfaction_score where field.survey_type = 'project')\"}"
  - name: gasp_project_nps
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: ((CAST((COUNT(CASE WHEN (survey_response.survey_type = 'project' AND survey_response.nps_score >= 9) THEN survey_response.nps_score END) - COUNT(CASE WHEN (survey_response.survey_type = 'project' AND survey_response.nps_score <= 6) THEN survey_response.nps_score END)) AS DECIMAL) / NULLIF(COUNT(CASE WHEN survey_response.survey_type = 'project' THEN survey_response.nps_score END), 0)) * 100)
    description: Project NPS. Net Promoter Score for services experience.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/project-nps."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"project_nps\",\"gasp_version\":\"1\",\"unit\":\"score\",\"formula\":\"(count(field.nps_score where field.survey_type = 'project' and field.nps_score >= 9) - count(field.nps_score where field.survey_type = 'project' and field.nps_score <= 6)) / count(field.nps_score where field.survey_type = 'project') * 100\"}"
  - name: gasp_rework_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN deliverable.reworked = TRUE THEN deliverable.deliverable_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT deliverable.deliverable_id), 0))
    description: Rework Rate. Percentage of deliverables requiring rework.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/rework-rate. Reads the deliverable snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"rework_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.deliverable_id where field.reworked = true) / count_distinct(field.deliverable_id)"}'
  - name: gasp_reference_ability
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_reference_ability.value)
    description: Reference-ability. Percentage of completed projects that become referenceable.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/reference-ability. Staged (period bound in filter): gasp_staged_gasp_reference_ability holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"reference_ability","gasp_version":"1","unit":"percent","formula":"count_distinct(field.project_id where in_period(field.project_completion_date) and field.referenceable = true) / count_distinct(field.project_id where in_period(field.project_completion_date))","staged":true}'
  - name: gasp_revenue_per_consultant
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST((SUM(CASE WHEN financials.revenue_type = 'services' THEN financials.revenue ELSE 0 END)) AS DECIMAL) / NULLIF(COUNT(DISTINCT consultant.consultant_id), 0))
    description: Revenue per Consultant. Services revenue per delivery resource.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/revenue-per-consultant."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"revenue_per_consultant","gasp_version":"1","unit":"currency","formula":"metric.services_revenue / count_distinct(field.consultant_id)"}'
  - name: gasp_projects_per_consultant
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_projects_per_consultant.value)
    description: Projects per Consultant. Average projects completed per consultant in the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/projects-per-consultant. Staged (period bound in filter): gasp_staged_gasp_projects_per_consultant holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"projects_per_consultant","gasp_version":"1","unit":"ratio","formula":"count_distinct(field.project_id where in_period(field.project_completion_date)) / count_distinct(field.consultant_id where in_period(field.project_completion_date))","staged":true}'
  - name: gasp_average_project_duration
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_average_project_duration.value)
    description: Average Project Duration. Average length, in days, of projects completed in the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/average-project-duration. Staged (period bound in filter): gasp_staged_gasp_average_project_duration holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"average_project_duration","gasp_version":"1","unit":"days","formula":"avg(field.project_completion_date - field.project_start_date where in_period(field.project_completion_date))","staged":true}'
  - name: gasp_services_pipeline
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN (opportunity.revenue_type = 'services' AND opportunity.opportunity_stage NOT IN ('closed_won', 'closed_lost')) THEN opportunity.opportunity_amount ELSE 0 END)
    description: Services Pipeline. Value of services opportunities in pipeline.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/services-pipeline. Reads the opportunity snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"services_pipeline\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.opportunity_amount where field.revenue_type = 'services' and field.opportunity_stage not in ('closed_won', 'closed_lost')) at period_end\"}"
  - name: gasp_services_win_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_services_win_rate.value)
    description: Services Win Rate. Percentage of services opportunities won.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/services-win-rate. Staged (period bound in filter): gasp_staged_gasp_services_win_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"services_win_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.opportunity_id where field.revenue_type = 'services' and field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / count_distinct(field.opportunity_id where field.revenue_type = 'services' and field.opportunity_stage in ('closed_won', 'closed_lost') and in_period(field.close_date))\",\"staged\":true}"
  - name: gasp_time_to_start
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_time_to_start.value)
    description: Time to Start. Time from services sold to project kickoff.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/time-to-start. Staged (period bound in filter): gasp_staged_gasp_time_to_start holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"time_to_start","gasp_version":"1","unit":"days","formula":"median(field.project_start_date - field.close_date where in_period(field.project_start_date))","staged":true}'
  - name: gasp_ticket_volume
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT ticket.ticket_id)
    description: Ticket Volume. Total number of support tickets received in a period.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/ticket-volume."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"ticket_volume","gasp_version":"1","unit":"count","formula":"count_distinct(field.ticket_id)"}'
  - name: gasp_ticket_volume_by_ticket_type
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT ticket.ticket_id)
    description: Ticket Volume, by_ticket_type breakdown. Total number of support tickets received in a period.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/ticket-volume. Broken down by ticket_type: report one value per ticket_type by grouping on the ticket_type field of each dataset the expression reads."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"ticket_volume","gasp_version":"1","variant":"by_ticket_type","unit":"count","formula":"count_distinct(field.ticket_id)","gasp_breakdown":"ticket_type"}'
  - name: gasp_tickets_per_customer
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST((COUNT(DISTINCT ticket.ticket_id)) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN customer.customer_status = 'active' THEN customer.customer_id END), 0))
    description: Tickets per Customer. Average tickets created per active customer.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/tickets-per-customer. Reads the customer snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"tickets_per_customer\",\"gasp_version\":\"1\",\"unit\":\"ratio\",\"formula\":\"metric.ticket_volume / count_distinct(field.customer_id where field.customer_status = 'active') at period_end\"}"
  - name: gasp_ticket_backlog
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_ticket_backlog.value)
    description: Ticket Backlog. Number of tickets open or pending at the end of the period.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/ticket-backlog. Staged (to_date): gasp_staged_gasp_ticket_backlog holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"ticket_backlog\",\"gasp_version\":\"1\",\"unit\":\"count\",\"formula\":\"count_distinct(field.ticket_id where field.ticket_status in ('open', 'pending')) at period_end\",\"staged\":true}"
  - name: gasp_ticket_distribution_by_type
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_ticket_distribution_by_type.value)
    description: Ticket Distribution by Type. Breakdown of tickets by category.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/ticket-distribution-by-type. Broken down by ticket_type: report one value per ticket_type. Staged (total): gasp_staged_gasp_ticket_distribution_by_type holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"ticket_distribution_by_type","gasp_version":"1","unit":"percent","formula":"count_distinct(field.ticket_id) / total(metric.ticket_volume)","gasp_breakdown":"ticket_type","staged":true}'
  - name: gasp_frt
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (MEDIAN((DATEDIFF(second, ticket.created_at, ticket.first_response_at) / 86400.0)) * 1440)
    description: First Response Time (FRT). Time from ticket creation to first human response.
    datatype: Decimal
    ai_context:
      synonyms:
        - FRT
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/first-response-time-frt."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"frt","gasp_version":"1","unit":"minutes","formula":"(median(field.first_response_at - field.created_at)) * 1440"}'
  - name: gasp_first_response_sla_adherence
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN ticket.first_response_at <= ticket.first_response_due_at THEN ticket.ticket_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT ticket.ticket_id), 0))
    description: First Response SLA Adherence. Percentage of tickets meeting FRT SLA target.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/first-response-sla-adherence."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"first_response_sla_adherence","gasp_version":"1","unit":"percent","formula":"count_distinct(field.ticket_id where field.first_response_at <= field.first_response_due_at) / count_distinct(field.ticket_id)"}'
  - name: gasp_resolution_time_time_to_resolution
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (MEDIAN((DATEDIFF(second, ticket.created_at, ticket.resolved_at) / 86400.0)) * 24)
    description: Resolution Time (Time to Resolution). Time from ticket creation to final resolution.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/resolution-time-time-to-resolution."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"resolution_time_time_to_resolution","gasp_version":"1","unit":"hours","formula":"(median(field.resolved_at - field.created_at)) * 24"}'
  - name: gasp_resolution_time_time_to_resolution_by_ticket_type
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (MEDIAN((DATEDIFF(second, ticket.created_at, ticket.resolved_at) / 86400.0)) * 24)
    description: Resolution Time (Time to Resolution), by_ticket_type breakdown. Time from ticket creation to final resolution.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/resolution-time-time-to-resolution. Broken down by ticket_type: report one value per ticket_type by grouping on the ticket_type field of each dataset the expression reads."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"resolution_time_time_to_resolution","gasp_version":"1","variant":"by_ticket_type","unit":"hours","formula":"(median(field.resolved_at - field.created_at)) * 24","gasp_breakdown":"ticket_type"}'
  - name: gasp_first_contact_resolution_fcr
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN ticket.resolved_first_contact = TRUE THEN ticket.ticket_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT ticket.ticket_id), 0))
    description: First Contact Resolution (FCR). Percentage of tickets resolved in a single interaction.
    datatype: Decimal
    ai_context:
      synonyms:
        - FCR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/first-contact-resolution-fcr."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"first_contact_resolution_fcr","gasp_version":"1","unit":"percent","formula":"count_distinct(field.ticket_id where field.resolved_first_contact = true) / count_distinct(field.ticket_id)"}'
  - name: gasp_resolution_sla_adherence
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN ticket.resolved_at <= ticket.resolution_due_at THEN ticket.ticket_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT ticket.ticket_id), 0))
    description: Resolution SLA Adherence. Percentage of tickets resolved within SLA timeframe.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/resolution-sla-adherence."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"resolution_sla_adherence","gasp_version":"1","unit":"percent","formula":"count_distinct(field.ticket_id where field.resolved_at <= field.resolution_due_at) / count_distinct(field.ticket_id)"}'
  - name: gasp_reopen_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN ticket.reopened = TRUE THEN ticket.ticket_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN ticket.ticket_status = 'resolved' THEN ticket.ticket_id END), 0))
    description: Reopen Rate. Percentage of resolved tickets that are reopened.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/reopen-rate."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"reopen_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.ticket_id where field.reopened = true) / count_distinct(field.ticket_id where field.ticket_status = 'resolved')\"}"
  - name: gasp_csat
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(CASE WHEN (survey_response.survey_type = 'customer' AND survey_response.satisfaction_score >= 4) THEN survey_response.satisfaction_score END) AS DECIMAL) / NULLIF(COUNT(CASE WHEN survey_response.survey_type = 'customer' THEN survey_response.satisfaction_score END), 0))
    description: Customer Satisfaction Score (CSAT). Customer rating of support interaction.
    datatype: Decimal
    ai_context:
      synonyms:
        - CSAT
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/customer-satisfaction-score-csat."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"csat\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count(field.satisfaction_score where field.survey_type = 'customer' and field.satisfaction_score >= 4) / count(field.satisfaction_score where field.survey_type = 'customer')\"}"
  - name: gasp_customer_effort_score_ces
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: AVG(survey_response.ces_score)
    description: Customer Effort Score (CES). How easy it was for the customer to get help.
    datatype: Decimal
    ai_context:
      synonyms:
        - CES
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/customer-effort-score-ces."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"customer_effort_score_ces","gasp_version":"1","unit":"score","formula":"avg(field.ces_score)"}'
  - name: gasp_customer_effort_score_ces_percent
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(CASE WHEN survey_response.ces_score >= 5 THEN survey_response.ces_score END) AS DECIMAL) / NULLIF(COUNT(survey_response.ces_score), 0))
    description: Customer Effort Score (CES), percent variant. How easy it was for the customer to get help.
    datatype: Decimal
    ai_context:
      synonyms:
        - CES
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/customer-effort-score-ces."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"customer_effort_score_ces","gasp_version":"1","variant":"percent","unit":"score","formula":"count(field.ces_score where field.ces_score >= 5) / count(field.ces_score)"}'
  - name: gasp_tickets_per_agent
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT ticket.ticket_id) AS DECIMAL) / NULLIF(COUNT(DISTINCT ticket.agent_id), 0))
    description: Tickets per Agent. Average tickets handled per support agent.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/tickets-per-agent."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"tickets_per_agent","gasp_version":"1","unit":"ratio","formula":"count_distinct(field.ticket_id) / count_distinct(field.agent_id)"}'
  - name: gasp_cost_per_ticket
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(CASE WHEN cost_event.cost_function = 'support' THEN cost_event.cost ELSE 0 END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN ticket.ticket_status = 'resolved' THEN ticket.ticket_id END), 0))
    description: Cost per Ticket. Total support cost divided by tickets resolved.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/cost-per-ticket."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"cost_per_ticket\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.cost where field.cost_function = 'support') / count_distinct(field.ticket_id where field.ticket_status = 'resolved')\"}"
  - name: gasp_self_service_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(kb_article.deflections) AS DECIMAL) / NULLIF((SUM(kb_article.deflections) + (COUNT(DISTINCT ticket.ticket_id))), 0))
    description: Self-Service Rate (Ticket Deflection). Percentage of support needs resolved through self-service.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/self-service-rate-ticket-deflection."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"self_service_rate","gasp_version":"1","unit":"percent","formula":"sum(field.deflections) / (sum(field.deflections) + metric.ticket_volume)"}'
  - name: gasp_logo_retention_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_logo_retention_rate.value)
    description: Logo Retention Rate. The percentage of customers retained over a period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/logo-retention-rate. Staged (at period_start): gasp_staged_gasp_logo_retention_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"logo_retention_rate","gasp_version":"1","unit":"percent","formula":"1 - metric.logo_churn_rate","staged":true}'
  - name: gasp_logo_retention_rate_customer_counts
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_logo_retention_rate_customer_counts.value)
    description: Logo Retention Rate, customer_counts variant. The percentage of customers retained over a period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/logo-retention-rate. Staged (at period_start): gasp_staged_gasp_logo_retention_rate_customer_counts holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"logo_retention_rate\",\"gasp_version\":\"1\",\"variant\":\"customer_counts\",\"unit\":\"percent\",\"formula\":\"(count_distinct(field.customer_id where field.customer_status = 'active') at period_end - count_distinct(field.customer_id where field.event_type = 'new')) / count_distinct(field.customer_id where field.customer_status = 'active') at period_start\",\"staged\":true}"
  - name: gasp_logo_retention_rate_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_logo_retention_rate_by_segment.value)
    description: Logo Retention Rate, by_segment breakdown. The percentage of customers retained over a period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/logo-retention-rate. Broken down by segment: report one value per segment. Staged (at period_start): gasp_staged_gasp_logo_retention_rate_by_segment holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"logo_retention_rate","gasp_version":"1","variant":"by_segment","unit":"percent","formula":"1 - metric.logo_churn_rate","gasp_breakdown":"segment","staged":true}'
  - name: gasp_health_score
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: AVG(CASE WHEN customer.customer_status = 'active' THEN customer.composite_score END)
    description: Customer Health Score. A composite score predicting likelihood of retention or churn.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/customer-health-score. Reads the customer snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"health_score\",\"gasp_version\":\"1\",\"unit\":\"score\",\"formula\":\"avg(field.composite_score where field.customer_status = 'active') at period_end\"}"
  - name: gasp_health_score_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: AVG(CASE WHEN customer.customer_status = 'active' THEN customer.composite_score END)
    description: Customer Health Score, by_segment breakdown. A composite score predicting likelihood of retention or churn.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/customer-health-score. Broken down by segment: report one value per segment by grouping on the segment field of each dataset the expression reads. Reads the customer snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"health_score\",\"gasp_version\":\"1\",\"variant\":\"by_segment\",\"unit\":\"score\",\"formula\":\"avg(field.composite_score where field.customer_status = 'active') at period_end\",\"gasp_breakdown\":\"segment\"}"
  - name: gasp_health_score_coverage
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN customer.composite_score IS NOT NULL THEN customer.customer_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN customer.customer_status = 'active' THEN customer.customer_id END), 0))
    description: Health Score Coverage. The percentage of active customers that have a health score.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/health-score-coverage. Reads the customer snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"health_score_coverage\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.customer_id where field.composite_score is not null) / count_distinct(field.customer_id where field.customer_status = 'active')\"}"
  - name: gasp_health_score_coverage_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN customer.composite_score IS NOT NULL THEN customer.customer_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN customer.customer_status = 'active' THEN customer.customer_id END), 0))
    description: Health Score Coverage, by_segment breakdown. The percentage of active customers that have a health score.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/health-score-coverage. Broken down by segment: report one value per segment by grouping on the segment field of each dataset the expression reads. Reads the customer snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"health_score_coverage\",\"gasp_version\":\"1\",\"variant\":\"by_segment\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.customer_id where field.composite_score is not null) / count_distinct(field.customer_id where field.customer_status = 'active')\",\"gasp_breakdown\":\"segment\"}"
  - name: gasp_at_risk_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN customer.composite_score < 40 THEN customer.customer_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN customer.composite_score IS NOT NULL THEN customer.customer_id END), 0))
    description: At-Risk Customer Rate. The percentage of customers flagged as at-risk.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/at-risk-customer-rate. Reads the customer snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"at_risk_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.customer_id where field.composite_score < 40) / count_distinct(field.customer_id where field.composite_score is not null)"}'
  - name: gasp_at_risk_rate_entered_at_risk
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_at_risk_rate_entered_at_risk.value)
    description: At-Risk Customer Rate, entered_at_risk variant. The percentage of customers flagged as at-risk.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/at-risk-customer-rate. Staged (at period_start): gasp_staged_gasp_at_risk_rate_entered_at_risk holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"at_risk_rate\",\"gasp_version\":\"1\",\"variant\":\"entered_at_risk\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.customer_id where field.state_category = 'at_risk') / count_distinct(field.customer_id where field.customer_status = 'active') at period_start\",\"staged\":true}"
  - name: gasp_at_risk_rate_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN customer.composite_score < 40 THEN customer.customer_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN customer.composite_score IS NOT NULL THEN customer.customer_id END), 0))
    description: At-Risk Customer Rate, by_segment breakdown. The percentage of customers flagged as at-risk.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/at-risk-customer-rate. Broken down by segment: report one value per segment by grouping on the segment field of each dataset the expression reads. Reads the customer snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"at_risk_rate","gasp_version":"1","variant":"by_segment","unit":"percent","formula":"count_distinct(field.customer_id where field.composite_score < 40) / count_distinct(field.customer_id where field.composite_score is not null)","gasp_breakdown":"segment"}'
  - name: gasp_qbr_completion
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN customer.qbr_completed = TRUE THEN customer.customer_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN customer.qbr_due = TRUE THEN customer.customer_id END), 0))
    description: Quarterly Business Review (QBR) Completion Rate. The percentage of eligible accounts that completed a QBR.
    datatype: Decimal
    ai_context:
      synonyms:
        - QBR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/quarterly-business-review-qbr-completion-rate. Reads the customer snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"qbr_completion","gasp_version":"1","unit":"percent","formula":"count_distinct(field.customer_id where field.qbr_completed = true) / count_distinct(field.customer_id where field.qbr_due = true)"}'
  - name: gasp_executive_sponsor_coverage
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN (contact.contact_role = 'executive_sponsor' AND contact.contact_engaged = TRUE) THEN contact.customer_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN customer.customer_status = 'active' THEN customer.customer_id END), 0))
    description: Executive Sponsor Coverage. The percentage of active accounts with an engaged contact whose role is executive sponsor.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/executive-sponsor-coverage. Reads the contact and customer snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"executive_sponsor_coverage\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.customer_id where field.contact_role = 'executive_sponsor' and field.contact_engaged = true) / count_distinct(field.customer_id where field.customer_status = 'active')\"}"
  - name: gasp_contact_coverage
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN contact.contact_engaged = TRUE THEN contact.contact_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN customer.customer_status = 'active' THEN customer.customer_id END), 0))
    description: Contact Coverage. Average number of engaged contacts per active account.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/contact-coverage. Reads the contact and customer snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"contact_coverage\",\"gasp_version\":\"1\",\"unit\":\"ratio\",\"formula\":\"count_distinct(field.contact_id where field.contact_engaged = true) / count_distinct(field.customer_id where field.customer_status = 'active')\"}"
  - name: gasp_expansion_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_expansion_rate.value)
    description: Expansion Revenue Rate. Expansion MRR as a percentage of beginning MRR.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/expansion-revenue-rate. Staged (at period_start): gasp_staged_gasp_expansion_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"expansion_rate","gasp_version":"1","unit":"percent","formula":"metric.expansion_mrr / metric.mrr at period_start","staged":true}'
  - name: gasp_expansion_rate_by_segment
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_expansion_rate_by_segment.value)
    description: Expansion Revenue Rate, by_segment breakdown. Expansion MRR as a percentage of beginning MRR.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/expansion-revenue-rate. Broken down by segment: report one value per segment. Staged (at period_start): gasp_staged_gasp_expansion_rate_by_segment holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"expansion_rate","gasp_version":"1","variant":"by_segment","unit":"percent","formula":"metric.expansion_mrr / metric.mrr at period_start","gasp_breakdown":"segment","staged":true}'
  - name: gasp_license_utilization
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(CASE WHEN license.license_status = 'active' THEN license.seats_assigned ELSE 0 END) AS DECIMAL) / NULLIF(SUM(CASE WHEN license.license_status = 'active' THEN license.seats_purchased ELSE 0 END), 0))
    description: License Utilization. The share of purchased seats that are assigned to a user, across active licenses at period end.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/license-utilization. Reads the license snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"license_utilization\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"sum(field.seats_assigned where field.license_status = 'active') / sum(field.seats_purchased where field.license_status = 'active')\"}"
  - name: gasp_license_utilization_by_product
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(CASE WHEN license.license_status = 'active' THEN license.seats_assigned ELSE 0 END) AS DECIMAL) / NULLIF(SUM(CASE WHEN license.license_status = 'active' THEN license.seats_purchased ELSE 0 END), 0))
    description: License Utilization, by_product breakdown. The share of purchased seats that are assigned to a user, across active licenses at period end.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/license-utilization. Broken down by product.product_name: report one value per product_name, joining each dataset the expression reads to product on product_id (the model's relationship) and grouping on product.product_name. Reads the license snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"license_utilization\",\"gasp_version\":\"1\",\"variant\":\"by_product\",\"unit\":\"percent\",\"formula\":\"sum(field.seats_assigned where field.license_status = 'active') / sum(field.seats_purchased where field.license_status = 'active')\",\"gasp_breakdown\":\"product.product_name\"}"
  - name: gasp_upsell_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_upsell_rate.value)
    description: Upsell Rate. The percentage of customers eligible for an upgrade at period start who upgraded in the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/upsell-rate. Staged (at period_start): gasp_staged_gasp_upsell_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"upsell_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.customer_id where field.amendment_type = 'upgrade') / count_distinct(field.customer_id where field.upgrade_eligible = true) at period_start\",\"staged\":true}"
  - name: gasp_cross_sell_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_cross_sell_rate.value)
    description: Cross-sell Rate. The percentage of customers active at period start who bought an additional product in the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/cross-sell-rate. Staged (at period_start): gasp_staged_gasp_cross_sell_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"cross_sell_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.customer_id where field.amendment_type = 'cross_sell') / count_distinct(field.customer_id where field.customer_status = 'active') at period_start\",\"staged\":true}"
  - name: gasp_renewal_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_renewal_rate.value)
    description: Renewal Rate. The percentage of subscriptions whose term ended in the period that renewed.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/renewal-rate. Staged (period bound in filter): gasp_staged_gasp_renewal_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"renewal_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.subscription_id where field.renewed = true and in_period(field.contract_end)) / count_distinct(field.subscription_id where in_period(field.contract_end))","staged":true}'
  - name: gasp_renewal_rate_by_value
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_renewal_rate_by_value.value)
    description: Renewal Rate, by_value variant. The percentage of subscriptions whose term ended in the period that renewed.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/renewal-rate. Staged (period bound in filter): gasp_staged_gasp_renewal_rate_by_value holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"renewal_rate","gasp_version":"1","variant":"by_value","unit":"percent","formula":"sum(field.renewal_amount where field.renewed = true and in_period(field.contract_end)) / sum(field.renewal_amount where in_period(field.contract_end))","staged":true}'
  - name: gasp_renewal_forecast_accuracy
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_renewal_forecast_accuracy.value)
    description: Renewal Forecast Accuracy. How closely the forecast renewal value matched the value actually renewed, for contracts ending in the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/renewal-forecast-accuracy. Staged (period bound in filter): gasp_staged_gasp_renewal_forecast_accuracy holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"renewal_forecast_accuracy","gasp_version":"1","unit":"percent","formula":"1 - abs(sum(field.forecast_renewal_amount where in_period(field.contract_end)) - sum(field.renewal_amount where in_period(field.contract_end) and field.renewed = true)) / sum(field.renewal_amount where in_period(field.contract_end) and field.renewed = true)","staged":true}'
  - name: gasp_days_to_renewal
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: AVG(DATEDIFF(day, subscription.snapshot_date, subscription.contract_end))
    description: Days to Renewal. Average number of days until upcoming renewals.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/days-to-renewal. Reads the subscription snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"days_to_renewal","gasp_version":"1","unit":"days","formula":"avg(field.contract_end - field.snapshot_date)"}'
  - name: gasp_accounts_per_csm
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT customer.customer_id) AS DECIMAL) / NULLIF(COUNT(DISTINCT customer.csm_id), 0))
    description: Accounts per CSM. The number of accounts assigned to each Customer Success Manager.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/accounts-per-csm. Reads the customer snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"accounts_per_csm","gasp_version":"1","unit":"ratio","formula":"count_distinct(field.customer_id) / count_distinct(field.csm_id)"}'
  - name: gasp_arr_per_csm
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST((((SUM(CASE WHEN subscription.subscription_status = 'active' THEN subscription.mrr ELSE 0 END)) * 12)) AS DECIMAL) / NULLIF(COUNT(DISTINCT customer.csm_id), 0))
    description: ARR per CSM. Total ARR managed by each CSM.
    datatype: Decimal
    ai_context:
      synonyms:
        - ARR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/customer-success/arr-per-csm. Reads the customer and subscription snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"arr_per_csm","gasp_version":"1","unit":"currency","formula":"metric.arr / count_distinct(field.csm_id)"}'
  - name: gasp_pipeline_hygiene_score
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(((((CAST(COUNT(DISTINCT CASE WHEN opportunity.required_fields_complete = TRUE THEN opportunity.opportunity_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT opportunity.opportunity_id), 0)) + (CAST(COUNT(DISTINCT CASE WHEN opportunity.updated_within_sla = TRUE THEN opportunity.opportunity_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT opportunity.opportunity_id), 0))) + (CAST(COUNT(DISTINCT CASE WHEN opportunity.close_date_valid = TRUE THEN opportunity.opportunity_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT opportunity.opportunity_id), 0))) + (CAST(COUNT(DISTINCT CASE WHEN opportunity.stage_accurate = TRUE THEN opportunity.opportunity_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT opportunity.opportunity_id), 0))) AS DECIMAL) / 4)
    description: Pipeline Hygiene Score. Quality assessment of pipeline data and process adherence across open opportunities.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/pipeline-hygiene-score. Reads the opportunity snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"pipeline_hygiene_score","gasp_version":"1","unit":"percent","formula":"(count_distinct(field.opportunity_id where field.required_fields_complete = true) / count_distinct(field.opportunity_id) + count_distinct(field.opportunity_id where field.updated_within_sla = true) / count_distinct(field.opportunity_id) + count_distinct(field.opportunity_id where field.close_date_valid = true) / count_distinct(field.opportunity_id) + count_distinct(field.opportunity_id where field.stage_accurate = true) / count_distinct(field.opportunity_id)) / 4"}'
  - name: gasp_forecast_accuracy
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (1 - (CAST(ABS((SUM(forecast.forecasted_revenue) - SUM(forecast.actual_revenue))) AS DECIMAL) / NULLIF(SUM(forecast.actual_revenue), 0)))
    description: Forecast Accuracy. How closely forecasted revenue matched actual revenue.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/forecast-accuracy."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"forecast_accuracy","gasp_version":"1","unit":"percent","formula":"1 - abs(sum(field.forecasted_revenue) - sum(field.actual_revenue)) / sum(field.actual_revenue)"}'
  - name: gasp_commit_accuracy
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_commit_accuracy.value)
    description: Commit Accuracy. Percentage of committed deals that close.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/commit-accuracy. Staged (period bound in filter): gasp_staged_gasp_commit_accuracy holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"commit_accuracy\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.opportunity_id where field.forecast_category = 'commit' and field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / count_distinct(field.opportunity_id where field.forecast_category = 'commit')\",\"staged\":true}"
  - name: gasp_stage_conversion_rates
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN opportunity.advanced_to_next_stage = TRUE THEN opportunity.opportunity_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT opportunity.opportunity_id), 0))
    description: Stage Conversion Rates. Conversion rate between each pipeline stage.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/stage-conversion-rates. Reads the opportunity snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"stage_conversion_rates","gasp_version":"1","unit":"percent","formula":"count_distinct(field.opportunity_id where field.advanced_to_next_stage = true) / count_distinct(field.opportunity_id)"}'
  - name: gasp_quote_volume
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_quote_volume.value)
    description: Quote Volume. Number of quotes sent in a period.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/quote-volume. Staged (period bound in filter): gasp_staged_gasp_quote_volume holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"quote_volume","gasp_version":"1","unit":"count","formula":"count_distinct(field.quote_id where in_period(field.quote_sent_at))","staged":true}'
  - name: gasp_quote_to_order_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_quote_to_order_rate.value)
    description: Quote-to-Order Rate. Percentage of quotes that convert to orders.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/quote-to-order-rate. Staged (period bound in filter): gasp_staged_gasp_quote_to_order_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"quote_to_order_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.order_id where in_period(field.order_completed_at)) / count_distinct(field.quote_id where in_period(field.quote_sent_at))","staged":true}'
  - name: gasp_quote_cycle_time
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_quote_cycle_time.value)
    description: Quote Cycle Time. Time from quote request to quote delivery.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/quote-cycle-time. Staged (period bound in filter): gasp_staged_gasp_quote_cycle_time holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"quote_cycle_time","gasp_version":"1","unit":"hours","formula":"(median(field.quote_sent_at - field.quote_requested_at where in_period(field.quote_sent_at))) * 24","staged":true}'
  - name: gasp_quote_accuracy
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_quote_accuracy.value)
    description: Quote Accuracy. Percentage of quotes requiring no revision.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/quote-accuracy. Staged (period bound in filter): gasp_staged_gasp_quote_accuracy holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"quote_accuracy","gasp_version":"1","unit":"percent","formula":"count_distinct(field.quote_id where in_period(field.quote_sent_at) and field.revision_count = 0) / count_distinct(field.quote_id where in_period(field.quote_sent_at))","staged":true}'
  - name: gasp_discount_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_discount_rate.value)
    description: Discount Rate. Discount off list price across quotes sent in the period, weighted by list price.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/discount-rate. Staged (period bound in filter): gasp_staged_gasp_discount_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"discount_rate","gasp_version":"1","unit":"percent","formula":"(sum(field.list_price where in_period(field.quote_sent_at)) - sum(field.quoted_price where in_period(field.quote_sent_at))) / sum(field.list_price where in_period(field.quote_sent_at))","staged":true}'
  - name: gasp_order_to_activation_time
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_order_to_activation_time.value)
    description: Order-to-Activation Time. Time from signed order to customer activation/provisioning.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/order-to-activation-time. Staged (period bound in filter): gasp_staged_gasp_order_to_activation_time holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"order_to_activation_time","gasp_version":"1","unit":"days","formula":"median(field.activation_date - field.acquisition_date where in_period(field.activation_date))","staged":true}'
  - name: gasp_order_processing_time
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_order_processing_time.value)
    description: Order Processing Time. Time to process an order through internal systems.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/order-processing-time. Staged (period bound in filter): gasp_staged_gasp_order_processing_time holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"order_processing_time","gasp_version":"1","unit":"hours","formula":"(median(field.order_completed_at - field.order_received_at where in_period(field.order_completed_at))) * 24","staged":true}'
  - name: gasp_order_error_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_order_error_rate.value)
    description: Order Error Rate. Percentage of orders with processing errors.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/order-error-rate. Staged (period bound in filter): gasp_staged_gasp_order_error_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"order_error_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.order_id where in_period(field.order_completed_at) and field.has_error = true) / count_distinct(field.order_id where in_period(field.order_completed_at))","staged":true}'
  - name: gasp_billing_accuracy
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_billing_accuracy.value)
    description: Billing Accuracy. Percentage of invoices generated correctly on first attempt.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/billing-accuracy. Staged (period bound in filter): gasp_staged_gasp_billing_accuracy holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"billing_accuracy","gasp_version":"1","unit":"percent","formula":"count_distinct(field.invoice_id where in_period(field.invoice_date) and field.invoice_corrected = false) / count_distinct(field.invoice_id where in_period(field.invoice_date))","staged":true}'
  - name: gasp_invoice_cycle_time
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_invoice_cycle_time.value)
    description: Invoice Cycle Time. Time from billing event to invoice delivery.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/invoice-cycle-time. Staged (period bound in filter): gasp_staged_gasp_invoice_cycle_time holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"invoice_cycle_time","gasp_version":"1","unit":"days","formula":"median(field.invoice_date - field.billing_trigger_date where in_period(field.invoice_date))","staged":true}'
  - name: gasp_billing_disputes
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_billing_disputes.value)
    description: Billing Disputes. Percentage of invoices disputed by customers.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/billing-disputes. Staged (period bound in filter): gasp_staged_gasp_billing_disputes holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"billing_disputes","gasp_version":"1","unit":"percent","formula":"count_distinct(field.invoice_id where in_period(field.invoice_date) and field.invoice_disputed = true) / count_distinct(field.invoice_id where in_period(field.invoice_date))","staged":true}'
  - name: gasp_billing_disputes_by_payment_status
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_billing_disputes_by_payment_status.value)
    description: Billing Disputes, by_payment_status breakdown. Percentage of invoices disputed by customers.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/billing-disputes. Broken down by payment_status: report one value per payment_status. Staged (period bound in filter): gasp_staged_gasp_billing_disputes_by_payment_status holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"billing_disputes","gasp_version":"1","variant":"by_payment_status","unit":"percent","formula":"count_distinct(field.invoice_id where in_period(field.invoice_date) and field.invoice_disputed = true) / count_distinct(field.invoice_id where in_period(field.invoice_date))","gasp_breakdown":"payment_status","staged":true}'
  - name: gasp_credit_memo_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_credit_memo_rate.value)
    description: Credit Memo Rate. Percentage of invoices requiring credit memos.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/credit-memo-rate. Staged (period bound in filter): gasp_staged_gasp_credit_memo_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"credit_memo_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.invoice_id where in_period(field.invoice_date) and field.credit_memo_count > 0) / count_distinct(field.invoice_id where in_period(field.invoice_date))","staged":true}'
  - name: gasp_dso
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_dso.value)
    description: Days Sales Outstanding (DSO). Average days to collect payment after invoicing.
    datatype: Decimal
    ai_context:
      synonyms:
        - DSO
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/days-sales-outstanding-dso. Staged (period_days): gasp_staged_gasp_dso holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"dso","gasp_version":"1","unit":"days","formula":"sum(field.accounts_receivable) at period_end / metric.revenue_gaap * period_days","staged":true}'
  - name: gasp_collection_effectiveness_index_cei
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_collection_effectiveness_index_cei.value)
    description: Collection Effectiveness Index (CEI). The share of collectible receivables actually collected in the period. Billings stand in for credit sales. Current AR is receivables aged 30 days or less.
    datatype: Decimal
    ai_context:
      synonyms:
        - CEI
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/collection-effectiveness-index-cei. Staged (at period_start): gasp_staged_gasp_collection_effectiveness_index_cei holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"collection_effectiveness_index_cei","gasp_version":"1","unit":"percent","formula":"(sum(field.accounts_receivable) at period_start + sum(field.invoice_amount where in_period(field.invoice_date)) - sum(field.accounts_receivable) at period_end) / (sum(field.accounts_receivable) at period_start + sum(field.invoice_amount where in_period(field.invoice_date)) - sum(field.outstanding_amount where (field.snapshot_date - field.invoice_date) <= 30) at period_end)","staged":true}'
  - name: gasp_aging_buckets
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_aging_buckets.value)
    description: Aging Buckets. Distribution of receivables by age.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/aging-buckets. Broken down by bucket: report one value per bucket. Staged (bucket): gasp_staged_gasp_aging_buckets holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"aging_buckets","gasp_version":"1","unit":"percent","formula":"sum(field.outstanding_amount) / total(sum(field.outstanding_amount))","gasp_breakdown":"bucket","staged":true}'
  - name: gasp_accounts_receivable_balance
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN invoice.outstanding_amount > 0 THEN invoice.outstanding_amount ELSE 0 END)
    description: Accounts Receivable Balance. Total amount outstanding on open invoices at period end.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/accounts-receivable-balance. Reads the invoice snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"accounts_receivable_balance","gasp_version":"1","unit":"currency","formula":"sum(field.outstanding_amount where field.outstanding_amount > 0) at period_end"}'
  - name: gasp_accounts_receivable_balance_by_payment_status
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN invoice.outstanding_amount > 0 THEN invoice.outstanding_amount ELSE 0 END)
    description: Accounts Receivable Balance, by_payment_status breakdown. Total amount outstanding on open invoices at period end.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/accounts-receivable-balance. Broken down by payment_status: report one value per payment_status by grouping on the payment_status field of each dataset the expression reads. Reads the invoice snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"accounts_receivable_balance","gasp_version":"1","variant":"by_payment_status","unit":"currency","formula":"sum(field.outstanding_amount where field.outstanding_amount > 0) at period_end","gasp_breakdown":"payment_status"}'
  - name: gasp_bad_debt_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(financials.bad_debt_expense) AS DECIMAL) / NULLIF((SUM(financials.revenue)), 0))
    description: Bad Debt Rate. Percentage of revenue written off as uncollectable.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/bad-debt-rate."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"bad_debt_rate","gasp_version":"1","unit":"percent","formula":"sum(field.bad_debt_expense) / metric.revenue_gaap"}'
  - name: gasp_payment_method_distribution
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_payment_method_distribution.value)
    description: Payment Method Distribution. Breakdown of payments by method.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/payment-method-distribution. Broken down by payment_method: report one value per payment_method. Staged (total): gasp_staged_gasp_payment_method_distribution holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"payment_method_distribution","gasp_version":"1","unit":"percent","formula":"sum(field.invoice_amount where in_period(field.invoice_date)) / total(sum(field.invoice_amount where in_period(field.invoice_date) and field.payment_method is not null))","gasp_breakdown":"payment_method","staged":true}'
  - name: gasp_recognized_vs_billed
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(revenue_schedule.recognized_revenue) AS DECIMAL) / NULLIF(SUM(revenue_schedule.billed_amount), 0))
    description: Recognized vs Billed. Ratio of recognized revenue to billed revenue.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/recognized-vs-billed."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"recognized_vs_billed","gasp_version":"1","unit":"ratio","formula":"sum(field.recognized_revenue) / sum(field.billed_amount)"}'
  - name: gasp_deferred_revenue_balance
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_deferred_revenue_balance.value)
    description: Deferred Revenue Balance. Revenue billed but not yet recognized. A balance of cumulative billings less cumulative recognized revenue, independent of when cash is received.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/deferred-revenue-balance. Staged (to_date): gasp_staged_gasp_deferred_revenue_balance holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"deferred_revenue_balance","gasp_version":"1","unit":"currency","formula":"sum(field.billed_amount) to_date - sum(field.recognized_revenue) to_date","staged":true}'
  - name: gasp_unbilled_revenue
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(GREATEST((revenue_schedule.recognized_revenue - revenue_schedule.billed_amount), 0))
    description: Unbilled Revenue. Revenue recognized but not yet invoiced.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/unbilled-revenue."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"unbilled_revenue","gasp_version":"1","unit":"currency","formula":"sum(max(field.recognized_revenue - field.billed_amount, 0))"}'
  - name: gasp_revenue_recognition_accuracy
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(CASE WHEN revenue_schedule.recognition_correct = TRUE THEN revenue_schedule.recognized_revenue ELSE 0 END) AS DECIMAL) / NULLIF(SUM(revenue_schedule.recognized_revenue), 0))
    description: Revenue Recognition Accuracy. Percentage of revenue correctly recognized per ASC 606.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/revenue-recognition-accuracy."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"revenue_recognition_accuracy","gasp_version":"1","unit":"percent","formula":"sum(field.recognized_revenue where field.recognition_correct = true) / sum(field.recognized_revenue)"}'
  - name: gasp_renewal_notification_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_renewal_notification_rate.value)
    description: Renewal Notification Rate. Percentage of renewals where customer was notified on time.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/renewal-notification-rate. Staged (period bound in filter): gasp_staged_gasp_renewal_notification_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"renewal_notification_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.subscription_id where in_period(field.contract_end) and field.renewal_notified_on_time = true) / count_distinct(field.subscription_id where in_period(field.contract_end))","staged":true}'
  - name: gasp_auto_renewal_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_auto_renewal_rate.value)
    description: Auto-Renewal Rate. Percentage of renewals processed automatically.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/auto-renewal-rate. Staged (period bound in filter): gasp_staged_gasp_auto_renewal_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"auto_renewal_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.subscription_id where in_period(field.contract_end) and field.auto_renewed = true) / count_distinct(field.subscription_id where in_period(field.contract_end))","staged":true}'
  - name: gasp_renewal_processing_time
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_renewal_processing_time.value)
    description: Renewal Processing Time. Time to process a renewal from trigger to completion.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/renewal-processing-time. Staged (period bound in filter): gasp_staged_gasp_renewal_processing_time holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"renewal_processing_time","gasp_version":"1","unit":"days","formula":"median(field.renewal_complete_date - field.renewal_trigger_date where in_period(field.contract_end))","staged":true}'
  - name: gasp_system_sync_accuracy
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(CASE WHEN crm_record.sync_status = 'matched' THEN crm_record.sync_status END) AS DECIMAL) / NULLIF(COUNT(crm_record.sync_status), 0))
    description: System Sync Accuracy. Data consistency across RevOps systems (CRM, billing, ERP).
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/system-sync-accuracy. Reads the crm_record snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"system_sync_accuracy\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count(field.sync_status where field.sync_status = 'matched') / count(field.sync_status)\"}"
  - name: gasp_data_completeness
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(crm_record.populated_field_count) AS DECIMAL) / NULLIF(SUM(crm_record.required_field_count), 0))
    description: Data Completeness. Percentage of required fields populated in RevOps systems.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/revops/data-completeness. Reads the crm_record snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"data_completeness","gasp_version":"1","unit":"percent","formula":"sum(field.populated_field_count) / sum(field.required_field_count)"}'
  - name: gasp_daily_active_users_dau
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_daily_active_users_dau.value)
    description: Daily Active Users (DAU). Unique users who performed a meaningful action in the product on a given day.
    datatype: Integer
    ai_context:
      synonyms:
        - DAU
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/daily-active-users-dau. Staged (window): gasp_staged_gasp_daily_active_users_dau holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"daily_active_users_dau\",\"gasp_version\":\"1\",\"unit\":\"count\",\"formula\":\"window(count_distinct(field.user_id where field.product_event_type = 'qualifying'), 1 day)\",\"staged\":true}"
  - name: gasp_weekly_active_users_wau
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_weekly_active_users_wau.value)
    description: Weekly Active Users (WAU). Unique users who performed a meaningful action in the product within a 7-day period.
    datatype: Integer
    ai_context:
      synonyms:
        - WAU
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/weekly-active-users-wau. Staged (window): gasp_staged_gasp_weekly_active_users_wau holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"weekly_active_users_wau\",\"gasp_version\":\"1\",\"unit\":\"count\",\"formula\":\"window(count_distinct(field.user_id where field.product_event_type = 'qualifying'), 7 day)\",\"staged\":true}"
  - name: gasp_monthly_active_users_mau
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_monthly_active_users_mau.value)
    description: Monthly Active Users (MAU). Unique users who performed a meaningful action in the product within a 30-day period.
    datatype: Integer
    ai_context:
      synonyms:
        - MAU
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/monthly-active-users-mau. Staged (window): gasp_staged_gasp_monthly_active_users_mau holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"monthly_active_users_mau\",\"gasp_version\":\"1\",\"unit\":\"count\",\"formula\":\"window(count_distinct(field.user_id where field.product_event_type = 'qualifying'), 30 day)\",\"staged\":true}"
  - name: gasp_dau_mau
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_dau_mau.value)
    description: DAU/MAU Ratio (Stickiness). The ratio of daily to monthly active users, indicating how often users return.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/daumau-ratio-stickiness. Staged (window): gasp_staged_gasp_dau_mau holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"dau_mau","gasp_version":"1","unit":"percent","formula":"metric.daily_active_users_dau / metric.monthly_active_users_mau","staged":true}'
  - name: gasp_waumau_ratio
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_waumau_ratio.value)
    description: WAU/MAU Ratio. Weekly to monthly active user ratio.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/waumau-ratio. Staged (window): gasp_staged_gasp_waumau_ratio holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"waumau_ratio","gasp_version":"1","unit":"percent","formula":"metric.weekly_active_users_wau / metric.monthly_active_users_mau","staged":true}'
  - name: gasp_active_accounts
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT CASE WHEN product_event.product_event_type = 'qualifying' THEN product_event.customer_id END)
    description: Active Accounts. Customer accounts with at least one active user in the period.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/active-accounts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"active_accounts\",\"gasp_version\":\"1\",\"unit\":\"count\",\"formula\":\"count_distinct(field.customer_id where field.product_event_type = 'qualifying')\"}"
  - name: gasp_activation_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_activation_rate.value)
    description: Onboarding-to-Active Rate (Activation Rate). Percentage of onboarded customers who become actively engaged.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/onboarding/onboarding-to-active-rate-activation-rate. Staged (period bound in filter): gasp_staged_gasp_activation_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"activation_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.customer_id where in_period(field.onboarding_completion_date) and field.activation_date is not null) / count_distinct(field.customer_id where in_period(field.onboarding_completion_date))","staged":true}'
  - name: gasp_feature_adoption
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN product_event.feature_id IS NOT NULL THEN product_event.user_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN product_event.product_event_type = 'qualifying' THEN product_event.user_id END), 0))
    description: Feature Adoption Rate. Percentage of active users who used a specific feature in the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/feature-adoption-rate."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"feature_adoption\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.user_id where field.feature_id is not null) / count_distinct(field.user_id where field.product_event_type = 'qualifying')\"}"
  - name: gasp_core_feature_adoption
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN user.core_features_adopted = TRUE THEN user.user_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN product_event.product_event_type = 'qualifying' THEN product_event.user_id END), 0))
    description: Core Feature Adoption. Percentage of users using the core features that define the product.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/core-feature-adoption. Reads the user snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"core_feature_adoption\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.user_id where field.core_features_adopted = true) / count_distinct(field.user_id where field.product_event_type = 'qualifying')\"}"
  - name: gasp_feature_depth
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(product_event.usage_count) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN product_event.usage_count > 0 THEN product_event.user_id END), 0))
    description: "Feature Depth. How intensively users engage with features: average feature actions per user who used a feature in the period."
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/feature-depth."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"feature_depth","gasp_version":"1","unit":"ratio","formula":"sum(field.usage_count) / count_distinct(field.user_id where field.usage_count > 0)"}'
  - name: gasp_time_to_feature_adoption
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_time_to_feature_adoption.value)
    description: Time to Feature Adoption. Median time from signup to a user's first use of a specific feature, for users whose first use falls in the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/time-to-feature-adoption. Staged (period bound in filter): gasp_staged_gasp_time_to_feature_adoption holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"time_to_feature_adoption","gasp_version":"1","unit":"days","formula":"median(field.first_use_date - field.signup_date where in_period(field.first_use_date))","staged":true}'
  - name: gasp_breadth_of_adoption
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_breadth_of_adoption.value)
    description: Breadth of Adoption. Average number of features used per account.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/breadth-of-adoption. Staged (distinct pair): gasp_staged_gasp_breadth_of_adoption holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"breadth_of_adoption","gasp_version":"1","unit":"ratio","formula":"count_distinct(field.customer_id, field.feature_id) / metric.active_accounts","staged":true}'
  - name: gasp_session_frequency
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT product_event.session_id) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN product_event.product_event_type = 'qualifying' THEN product_event.user_id END), 0))
    description: Session Frequency. Average number of sessions per user per period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/session-frequency."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"session_frequency\",\"gasp_version\":\"1\",\"unit\":\"ratio\",\"formula\":\"count_distinct(field.session_id) / count_distinct(field.user_id where field.product_event_type = 'qualifying')\"}"
  - name: gasp_session_duration
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: AVG(product_event.session_duration)
    description: Session Duration. Average time spent per session.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/session-duration."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"session_duration","gasp_version":"1","unit":"minutes","formula":"avg(field.session_duration)"}'
  - name: gasp_time_in_product
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(product_event.session_duration) AS DECIMAL) / NULLIF(COUNT(DISTINCT user.user_id), 0))
    description: Time in Product. Total time spent in product per user per period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/time-in-product. Reads the user snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"time_in_product","gasp_version":"1","unit":"minutes","formula":"sum(field.session_duration) / count_distinct(field.user_id)"}'
  - name: gasp_actions_per_session
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(product_event.usage_count) AS DECIMAL) / NULLIF(COUNT(DISTINCT product_event.session_id), 0))
    description: Actions per Session. Average number of meaningful actions per session.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/actions-per-session."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"actions_per_session","gasp_version":"1","unit":"ratio","formula":"sum(field.usage_count) / count_distinct(field.session_id)"}'
  - name: gasp_pqas
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT CASE WHEN customer.criteria_met = TRUE THEN customer.customer_id END)
    description: Product Qualified Accounts (PQAs). Accounts that have demonstrated product engagement indicating sales-readiness.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/product-qualified-accounts-pqas. Reads the customer snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"pqas","gasp_version":"1","unit":"count","formula":"count_distinct(field.customer_id where field.criteria_met = true) at period_end"}'
  - name: gasp_user_retention_day_n
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_user_retention_day_n.value)
    description: User Retention (Day N). Percentage of users who return on day N after signup.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/user-retention-day-n. Staged (all_time): gasp_staged_gasp_user_retention_day_n holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"user_retention_day_n\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"all_time(count_distinct(field.user_id where field.product_event_type = 'qualifying' and in_period(field.signup_date) and (field.event_date - field.signup_date) = 30)) / count_distinct(field.user_id where in_period(field.signup_date))\",\"staged\":true}"
  - name: gasp_cohort_retention
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_cohort_retention.value)
    description: Cohort Retention. Retention tracked by signup cohort over time. The canonical formula reports week 8 for the period's signup cohort.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/cohort-retention. Staged (all_time): gasp_staged_gasp_cohort_retention holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"cohort_retention\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"all_time(count_distinct(field.user_id where field.product_event_type = 'qualifying' and in_period(field.signup_date) and (field.event_date - field.signup_date) >= 49 and (field.event_date - field.signup_date) < 56)) / count_distinct(field.user_id where in_period(field.signup_date))\",\"staged\":true}"
  - name: gasp_resurrection_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_resurrection_rate.value)
    description: Resurrection Rate. Percentage of users dormant at period start who returned in the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/resurrection-rate. Staged (at period_start): gasp_staged_gasp_resurrection_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"resurrection_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.user_id where field.product_event_type = 'reactivation') / count_distinct(field.user_id where field.user_status = 'dormant') at period_start\",\"staged\":true}"
  - name: gasp_release_frequency
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT release.release_id)
    description: Release Frequency. How often new releases are shipped to customers.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/release-frequency."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"release_frequency","gasp_version":"1","unit":"count","formula":"count_distinct(field.release_id)"}'
  - name: gasp_feature_delivery_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_feature_delivery_rate.value)
    description: Feature Delivery Rate. Percentage of planned features delivered on schedule.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/feature-delivery-rate. Staged (period bound in filter): gasp_staged_gasp_feature_delivery_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"feature_delivery_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.feature_id where in_period(field.planned_date) and field.actual_date <= field.planned_date) / count_distinct(field.feature_id where in_period(field.planned_date))","staged":true}'
  - name: gasp_roadmap_completion
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN roadmap_item.roadmap_item_completed = TRUE THEN roadmap_item.roadmap_item_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT roadmap_item.roadmap_item_id), 0))
    description: Roadmap Completion. Percentage of roadmap items completed in the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/roadmap-completion. Reads the roadmap_item snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"roadmap_completion","gasp_version":"1","unit":"percent","formula":"count_distinct(field.roadmap_item_id where field.roadmap_item_completed = true) / count_distinct(field.roadmap_item_id)"}'
  - name: gasp_time_to_market
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_time_to_market.value)
    description: Time to Market. Time from feature concept to production release.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/time-to-market. Staged (period bound in filter): gasp_staged_gasp_time_to_market holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"time_to_market","gasp_version":"1","unit":"days","formula":"median(field.release_date - field.feature_created_date where in_period(field.release_date))","staged":true}'
  - name: gasp_error_rate_user_facing
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(CASE WHEN product_event.product_event_type = 'error' THEN product_event.event_id END) AS DECIMAL) / NULLIF(COUNT(CASE WHEN product_event.product_event_type IN ('action', 'error') THEN product_event.event_id END), 0))
    description: Error Rate (User-Facing). Percentage of user actions that result in errors.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/error-rate-user-facing."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"error_rate_user_facing\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count(field.event_id where field.product_event_type = 'error') / count(field.event_id where field.product_event_type in ('action', 'error'))\"}"
  - name: gasp_bug_escape_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN (issue.issue_type = 'bug' AND issue.issue_environment = 'production') THEN issue.issue_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN issue.issue_type = 'bug' THEN issue.issue_id END), 0))
    description: Bug Escape Rate. Share of bugs found in production rather than caught in testing.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/bug-escape-rate."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"bug_escape_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.issue_id where field.issue_type = 'bug' and field.issue_environment = 'production') / count_distinct(field.issue_id where field.issue_type = 'bug')\"}"
  - name: gasp_user_reported_issues
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT CASE WHEN (issue.issue_type = 'bug' AND issue.issue_source = 'user_report') THEN issue.issue_id END)
    description: User-Reported Issues. Number of bugs/issues reported by users.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/user-reported-issues."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"user_reported_issues\",\"gasp_version\":\"1\",\"unit\":\"count\",\"formula\":\"count_distinct(field.issue_id where field.issue_type = 'bug' and field.issue_source = 'user_report')\"}"
  - name: gasp_feature_request_volume
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT CASE WHEN issue.issue_type = 'feature_request' THEN issue.issue_id END)
    description: Feature Request Volume. Number of feature requests received.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/feature-request-volume."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"feature_request_volume\",\"gasp_version\":\"1\",\"unit\":\"count\",\"formula\":\"count_distinct(field.issue_id where field.issue_type = 'feature_request')\"}"
  - name: gasp_uptime
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_uptime.value)
    description: Uptime (Availability). The percentage of time the service is operational.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/uptime-availability. Staged (period_days): gasp_staged_gasp_uptime holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"uptime","gasp_version":"1","unit":"percent","formula":"1 - sum(field.downtime_minutes) / (period_days * 1440)","staged":true}'
  - name: gasp_sla_adherence
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(CASE WHEN service_metrics.sla_met = TRUE THEN service_metrics.service_id END) AS DECIMAL) / NULLIF(COUNT(service_metrics.service_id), 0))
    description: SLA Adherence. Percentage of time SLA commitments were met.
    datatype: Decimal
    ai_context:
      synonyms:
        - SLA
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/sla-adherence."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"sla_adherence","gasp_version":"1","unit":"percent","formula":"count(field.service_id where field.sla_met = true) / count(field.service_id)"}'
  - name: gasp_error_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(service_metrics.error_count) AS DECIMAL) / NULLIF(SUM(service_metrics.request_count), 0))
    description: Error Rate. Percentage of requests that result in errors.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/error-rate."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"error_rate","gasp_version":"1","unit":"percent","formula":"sum(field.error_count) / sum(field.request_count)"}'
  - name: gasp_latency_response_time
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY service_metrics.response_time_ms)
    description: Latency (Response Time). Time taken to respond to requests.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/latency-response-time."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"latency_response_time","gasp_version":"1","unit":"milliseconds","formula":"percentile(field.response_time_ms, 0.95)"}'
  - name: gasp_latency_response_time_p50
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY service_metrics.response_time_ms)
    description: Latency (Response Time), p50 variant. Time taken to respond to requests.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/latency-response-time."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"latency_response_time","gasp_version":"1","variant":"p50","unit":"milliseconds","formula":"percentile(field.response_time_ms, 0.5)"}'
  - name: gasp_latency_response_time_p99
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: PERCENTILE_CONT(0.99) WITHIN GROUP (ORDER BY service_metrics.response_time_ms)
    description: Latency (Response Time), p99 variant. Time taken to respond to requests.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/latency-response-time."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"latency_response_time","gasp_version":"1","variant":"p99","unit":"milliseconds","formula":"percentile(field.response_time_ms, 0.99)"}'
  - name: gasp_incident_count
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT incident.incident_id)
    description: Incident Count. Number of incidents in a period.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/incident-count."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"incident_count","gasp_version":"1","unit":"count","formula":"count_distinct(field.incident_id)"}'
  - name: gasp_incident_count_by_severity
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT incident.incident_id)
    description: Incident Count, by_severity breakdown. Number of incidents in a period.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/incident-count. Broken down by severity: report one value per severity by grouping on the severity field of each dataset the expression reads."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"incident_count","gasp_version":"1","variant":"by_severity","unit":"count","formula":"count_distinct(field.incident_id)","gasp_breakdown":"severity"}'
  - name: gasp_incident_count_by_incident_type
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT incident.incident_id)
    description: Incident Count, by_incident_type breakdown. Number of incidents in a period.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/incident-count. Broken down by incident_type: report one value per incident_type by grouping on the incident_type field of each dataset the expression reads."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"incident_count","gasp_version":"1","variant":"by_incident_type","unit":"count","formula":"count_distinct(field.incident_id)","gasp_breakdown":"incident_type"}'
  - name: gasp_mean_time_to_detect_mttd
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (AVG((DATEDIFF(second, incident.started_at, incident.detected_at) / 86400.0)) * 1440)
    description: Mean Time to Detect (MTTD). Time from incident start to detection.
    datatype: Decimal
    ai_context:
      synonyms:
        - MTTD
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/mean-time-to-detect-mttd."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"mean_time_to_detect_mttd","gasp_version":"1","unit":"minutes","formula":"(avg(field.detected_at - field.started_at)) * 1440"}'
  - name: gasp_mean_time_to_acknowledge_mtta
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (AVG((DATEDIFF(second, incident.detected_at, incident.acknowledged_at) / 86400.0)) * 1440)
    description: Mean Time to Acknowledge (MTTA). Time from detection (the alert firing) to a person acknowledging the incident.
    datatype: Decimal
    ai_context:
      synonyms:
        - MTTA
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/mean-time-to-acknowledge-mtta."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"mean_time_to_acknowledge_mtta","gasp_version":"1","unit":"minutes","formula":"(avg(field.acknowledged_at - field.detected_at)) * 1440"}'
  - name: gasp_mttr
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (AVG((DATEDIFF(second, incident.started_at, incident.resolved_at) / 86400.0)) * 1440)
    description: Mean Time to Resolve (MTTR). Time from incident start to resolution.
    datatype: Decimal
    ai_context:
      synonyms:
        - MTTR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/mean-time-to-resolve-mttr."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"mttr","gasp_version":"1","unit":"minutes","formula":"(avg(field.resolved_at - field.started_at)) * 1440"}'
  - name: gasp_mttr_by_severity
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (AVG((DATEDIFF(second, incident.started_at, incident.resolved_at) / 86400.0)) * 1440)
    description: Mean Time to Resolve (MTTR), by_severity breakdown. Time from incident start to resolution.
    datatype: Decimal
    ai_context:
      synonyms:
        - MTTR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/mean-time-to-resolve-mttr. Broken down by severity: report one value per severity by grouping on the severity field of each dataset the expression reads."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"mttr","gasp_version":"1","variant":"by_severity","unit":"minutes","formula":"(avg(field.resolved_at - field.started_at)) * 1440","gasp_breakdown":"severity"}'
  - name: gasp_mttr_by_incident_type
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (AVG((DATEDIFF(second, incident.started_at, incident.resolved_at) / 86400.0)) * 1440)
    description: Mean Time to Resolve (MTTR), by_incident_type breakdown. Time from incident start to resolution.
    datatype: Decimal
    ai_context:
      synonyms:
        - MTTR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/mean-time-to-resolve-mttr. Broken down by incident_type: report one value per incident_type by grouping on the incident_type field of each dataset the expression reads."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"mttr","gasp_version":"1","variant":"by_incident_type","unit":"minutes","formula":"(avg(field.resolved_at - field.started_at)) * 1440","gasp_breakdown":"incident_type"}'
  - name: gasp_change_failure_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN deployment.incident_id IS NOT NULL THEN deployment.deployment_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT deployment.deployment_id), 0))
    description: Change Failure Rate. Percentage of deployments that cause incidents.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/change-failure-rate."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"change_failure_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.deployment_id where field.incident_id is not null) / count_distinct(field.deployment_id)"}'
  - name: gasp_deployment_frequency
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT deployment.deployment_id)
    description: Deployment Frequency. How often code is deployed to production.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/deployment-frequency."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"deployment_frequency","gasp_version":"1","unit":"count","formula":"count_distinct(field.deployment_id)"}'
  - name: gasp_lead_time_for_changes
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (MEDIAN((DATEDIFF(second, deployment.committed_at, deployment.deploy_date) / 86400.0)) * 24)
    description: Lead Time for Changes. Time from code commit to production deployment.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/lead-time-for-changes."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"lead_time_for_changes","gasp_version":"1","unit":"hours","formula":"(median(field.deploy_date - field.committed_at)) * 24"}'
  - name: gasp_mean_time_to_recovery_mttr
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: AVG(incident.recovery_time)
    description: Mean Time to Recovery (MTTR). Time to restore service after a failure.
    datatype: Decimal
    ai_context:
      synonyms:
        - MTTR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/mean-time-to-recovery-mttr."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"mean_time_to_recovery_mttr","gasp_version":"1","unit":"minutes","formula":"avg(field.recovery_time)"}'
  - name: gasp_infrastructure_utilization
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: AVG(service_metrics.utilization)
    description: Infrastructure Utilization. Percentage of provisioned capacity being used.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/infrastructure-utilization."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"infrastructure_utilization","gasp_version":"1","unit":"percent","formula":"avg(field.utilization)"}'
  - name: gasp_infrastructure_cost_per_customer
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(CASE WHEN cost_event.cost_function = 'infrastructure' THEN cost_event.cost ELSE 0 END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN customer.customer_status = 'active' THEN customer.customer_id END), 0))
    description: Infrastructure Cost per Customer. Total infrastructure cost divided by active customers.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/infrastructure-cost-per-customer. Reads the customer snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"infrastructure_cost_per_customer\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.cost where field.cost_function = 'infrastructure') / count_distinct(field.customer_id where field.customer_status = 'active') at period_end\"}"
  - name: gasp_headroom
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (1 - (AVG(service_metrics.utilization)))
    description: Headroom. Available capacity before scaling is required.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/headroom."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"headroom","gasp_version":"1","unit":"percent","formula":"1 - metric.infrastructure_utilization"}'
  - name: gasp_vulnerability_count
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT CASE WHEN vulnerability.vulnerability_status = 'open' THEN vulnerability.vulnerability_id END)
    description: Vulnerability Count. Number of known vulnerabilities still open in your systems.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/vulnerability-count. Reads the vulnerability snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"vulnerability_count\",\"gasp_version\":\"1\",\"unit\":\"count\",\"formula\":\"count_distinct(field.vulnerability_id where field.vulnerability_status = 'open')\"}"
  - name: gasp_time_to_patch
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_time_to_patch.value)
    description: Time to Patch. Time from a vulnerability being discovered to its patch being deployed, for patches deployed in the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/time-to-patch. Staged (period bound in filter): gasp_staged_gasp_time_to_patch holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"time_to_patch","gasp_version":"1","unit":"hours","formula":"(avg(field.patched_at - field.discovered_at where in_period(field.patched_at))) * 24","staged":true}'
  - name: gasp_security_incident_count
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT CASE WHEN incident.incident_type = 'security' THEN incident.incident_id END)
    description: Security Incident Count. Number of security incidents in a period.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/engineering/security-incident-count."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"security_incident_count\",\"gasp_version\":\"1\",\"unit\":\"count\",\"formula\":\"count_distinct(field.incident_id where field.incident_type = 'security')\"}"
  - name: gasp_revenue_gaap
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(financials.revenue)
    description: Revenue (GAAP). Recognized revenue according to accounting standards.
    datatype: Decimal
    ai_context:
      synonyms:
        - GAAP
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/revenue-gaap."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"revenue_gaap","gasp_version":"1","unit":"currency","formula":"sum(field.revenue)"}'
  - name: gasp_bookings
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN contract_event.contract_event_type IN ('new_contract', 'renewal', 'amendment') THEN contract_event.tcv ELSE 0 END)
    description: Bookings. Total contract value signed in a period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/bookings."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"bookings\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.tcv where field.contract_event_type in ('new_contract', 'renewal', 'amendment'))\"}"
  - name: gasp_bookings_new
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN contract_event.contract_event_type = 'new_contract' THEN contract_event.tcv ELSE 0 END)
    description: Bookings, new variant. Total contract value signed in a period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/bookings."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"bookings\",\"gasp_version\":\"1\",\"variant\":\"new\",\"unit\":\"currency\",\"formula\":\"sum(field.tcv where field.contract_event_type = 'new_contract')\"}"
  - name: gasp_bookings_renewal
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN contract_event.contract_event_type = 'renewal' THEN contract_event.tcv ELSE 0 END)
    description: Bookings, renewal variant. Total contract value signed in a period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/bookings."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"bookings\",\"gasp_version\":\"1\",\"variant\":\"renewal\",\"unit\":\"currency\",\"formula\":\"sum(field.tcv where field.contract_event_type = 'renewal')\"}"
  - name: gasp_bookings_expansion
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN contract_event.contract_event_type = 'amendment' THEN contract_event.tcv ELSE 0 END)
    description: Bookings, expansion variant. Total contract value signed in a period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/bookings."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"bookings\",\"gasp_version\":\"1\",\"variant\":\"expansion\",\"unit\":\"currency\",\"formula\":\"sum(field.tcv where field.contract_event_type = 'amendment')\"}"
  - name: gasp_billings
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_billings.value)
    description: Billings. Amounts invoiced in a period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/billings. Staged (period bound in filter): gasp_staged_gasp_billings holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"billings","gasp_version":"1","unit":"currency","formula":"sum(field.invoice_amount where in_period(field.invoice_date))","staged":true}'
  - name: gasp_billings_by_payment_status
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_billings_by_payment_status.value)
    description: Billings, by_payment_status breakdown. Amounts invoiced in a period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/billings. Broken down by payment_status: report one value per payment_status. Staged (period bound in filter): gasp_staged_gasp_billings_by_payment_status holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"billings","gasp_version":"1","variant":"by_payment_status","unit":"currency","formula":"sum(field.invoice_amount where in_period(field.invoice_date))","gasp_breakdown":"payment_status","staged":true}'
  - name: gasp_revenue_per_employee
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST((((SUM(CASE WHEN subscription.subscription_status = 'active' THEN subscription.mrr ELSE 0 END)) * 12)) AS DECIMAL) / NULLIF((COUNT(DISTINCT CASE WHEN employee.employee_status = 'active' THEN employee.employee_id END)), 0))
    description: Revenue per Employee. Annual Recurring Revenue (ARR) divided by total headcount.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/revenue-per-employee. Reads the employee and subscription snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"revenue_per_employee","gasp_version":"1","unit":"currency","formula":"metric.arr / metric.total_headcount"}'
  - name: gasp_operating_margin
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (((CAST((SUM(financials.revenue) - SUM(CASE WHEN cost_event.cost_function = 'infrastructure' THEN cost_event.cost ELSE 0 END)) AS DECIMAL) / NULLIF(SUM(financials.revenue), 0))) - ((CAST(SUM(CASE WHEN cost_event.cost_function <> 'infrastructure' THEN cost_event.cost ELSE 0 END) AS DECIMAL) / NULLIF((SUM(financials.revenue)), 0))))
    description: Operating Margin (EBIT Margin). Operating income as a percentage of revenue.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/operating-margin-ebit-margin."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"operating_margin","gasp_version":"1","unit":"percent","formula":"metric.gross_margin - metric.opex_ratio"}'
  - name: gasp_ebitda_margin
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(financials.ebitda) AS DECIMAL) / NULLIF((SUM(financials.revenue)), 0))
    description: EBITDA Margin. Earnings before interest, taxes, depreciation and amortization as a percentage of revenue.
    datatype: Decimal
    ai_context:
      synonyms:
        - EBITDA
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/ebitda-margin."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"ebitda_margin","gasp_version":"1","unit":"percent","formula":"sum(field.ebitda) / metric.revenue_gaap"}'
  - name: gasp_net_income_margin
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(financials.net_income) AS DECIMAL) / NULLIF((SUM(financials.revenue)), 0))
    description: Net Income Margin. Net income as a percentage of revenue.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/net-income-margin."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"net_income_margin","gasp_version":"1","unit":"percent","formula":"sum(field.net_income) / metric.revenue_gaap"}'
  - name: gasp_burn_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_burn_rate.value)
    description: Cash Burn Rate. Net cash consumed per month.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/cash-burn-rate. Staged (at period_start): gasp_staged_gasp_burn_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"burn_rate","gasp_version":"1","unit":"currency","formula":"(sum(field.cash_balance) at period_start - sum(field.cash_balance) at period_end) / (period_days / 30.4375)","staged":true}'
  - name: gasp_cash_runway
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_cash_runway.value)
    description: Cash Runway. Time until cash runs out at current burn rate.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/cash-runway. Staged (at period_start): gasp_staged_gasp_cash_runway holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"cash_runway","gasp_version":"1","unit":"months","formula":"sum(field.cash_balance) at period_end / metric.burn_rate","staged":true}'
  - name: gasp_fcf
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (SUM(financials.operating_cash_flow) - SUM(financials.capital_expenditures))
    description: Free Cash Flow (FCF). Cash generated from operations minus capital expenditures.
    datatype: Decimal
    ai_context:
      synonyms:
        - FCF
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/free-cash-flow-fcf."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"fcf","gasp_version":"1","unit":"currency","formula":"sum(field.operating_cash_flow) - sum(field.capital_expenditures)"}'
  - name: gasp_free_cash_flow_margin
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(((SUM(financials.operating_cash_flow) - SUM(financials.capital_expenditures))) AS DECIMAL) / NULLIF((SUM(financials.revenue)), 0))
    description: Free Cash Flow Margin. FCF as a percentage of revenue.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/free-cash-flow-margin."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"free_cash_flow_margin","gasp_version":"1","unit":"percent","formula":"metric.fcf / metric.revenue_gaap"}'
  - name: gasp_magic_number
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_magic_number.value)
    description: Magic Number. Sales efficiency metric measuring revenue generated per dollar of sales and marketing spend.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/magic-number. Staged (lag): gasp_staged_gasp_magic_number holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"magic_number\",\"gasp_version\":\"1\",\"unit\":\"ratio\",\"formula\":\"(metric.arr - lag(metric.arr, 1 quarter)) / lag(window(sum(field.cost where field.cost_function = 'gtm'), 1 quarter), 1 quarter)\",\"staged\":true}"
  - name: gasp_burn_multiple
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_burn_multiple.value)
    description: Burn Multiple. Net burn divided by net new ARR. Popularized by David Sacks.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/burn-multiple. Staged (at period_start): gasp_staged_gasp_burn_multiple holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"burn_multiple","gasp_version":"1","unit":"ratio","formula":"metric.burn_rate / (metric.net_new_mrr * 12)","staged":true}'
  - name: gasp_opex_ratio
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(CASE WHEN cost_event.cost_function <> 'infrastructure' THEN cost_event.cost ELSE 0 END) AS DECIMAL) / NULLIF((SUM(financials.revenue)), 0))
    description: Opex Ratio. Operating expenses as a percentage of revenue.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/opex-ratio."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"opex_ratio\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"sum(field.cost where field.cost_function != 'infrastructure') / metric.revenue_gaap\"}"
  - name: gasp_opex_ratio_by_cost_centre
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_opex_ratio_by_cost_centre.value)
    description: Opex Ratio, by_cost_centre breakdown. Operating expenses as a percentage of revenue.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/opex-ratio. Broken down by cost_centre: report one value per cost_centre. Staged (total): gasp_staged_gasp_opex_ratio_by_cost_centre holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"opex_ratio\",\"gasp_version\":\"1\",\"variant\":\"by_cost_centre\",\"unit\":\"percent\",\"formula\":\"sum(field.cost where field.cost_function != 'infrastructure') / metric.revenue_gaap\",\"gasp_breakdown\":\"cost_centre\",\"staged\":true}"
  - name: gasp_sm_as_of_revenue
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(CASE WHEN cost_event.cost_function = 'gtm' THEN cost_event.cost ELSE 0 END) AS DECIMAL) / NULLIF((SUM(financials.revenue)), 0))
    description: S&M as % of Revenue. Sales and marketing spend as percentage of revenue.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/sm-as-of-revenue."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"sm_as_of_revenue\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"sum(field.cost where field.cost_function = 'gtm') / metric.revenue_gaap\"}"
  - name: gasp_rd_as_of_revenue
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(CASE WHEN cost_event.cost_function = 'research_development' THEN cost_event.cost ELSE 0 END) AS DECIMAL) / NULLIF((SUM(financials.revenue)), 0))
    description: R&D as % of Revenue. Research and development spend as percentage of revenue.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/rd-as-of-revenue."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"rd_as_of_revenue\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"sum(field.cost where field.cost_function = 'research_development') / metric.revenue_gaap\"}"
  - name: gasp_ga_as_of_revenue
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(CASE WHEN cost_event.cost_function = 'general_administrative' THEN cost_event.cost ELSE 0 END) AS DECIMAL) / NULLIF((SUM(financials.revenue)), 0))
    description: G&A as % of Revenue. General and administrative spend as percentage of revenue.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/ga-as-of-revenue."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"ga_as_of_revenue\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"sum(field.cost where field.cost_function = 'general_administrative') / metric.revenue_gaap\"}"
  - name: gasp_collection_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_collection_rate.value)
    description: Collection Rate. Percentage of invoiced amounts collected.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/finance/collection-rate. Staged (period bound in filter): gasp_staged_gasp_collection_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"collection_rate","gasp_version":"1","unit":"percent","formula":"sum(field.invoice_amount where in_period(field.invoice_date) and field.payment_date is not null) / metric.billings","staged":true}'
  - name: gasp_ttfv
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: MEDIAN(CASE WHEN onboarding_milestone.onboarding_milestone = 'first_value' THEN DATEDIFF(day, onboarding_milestone.contract_start, onboarding_milestone.milestone_date) END)
    description: Time to First Value (TTFV). Time from contract start to the customer's first meaningful value milestone.
    datatype: Decimal
    ai_context:
      synonyms:
        - TTFV
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/onboarding/time-to-first-value-ttfv."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"ttfv\",\"gasp_version\":\"1\",\"unit\":\"days\",\"formula\":\"median(field.milestone_date - field.contract_start where field.onboarding_milestone = 'first_value')\"}"
  - name: gasp_time_to_go_live
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: MEDIAN(CASE WHEN onboarding_milestone.onboarding_milestone = 'go_live' THEN DATEDIFF(day, onboarding_milestone.contract_start, onboarding_milestone.milestone_date) END)
    description: Time to Go-Live. Time from contract to production deployment.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/onboarding/time-to-go-live."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"time_to_go_live\",\"gasp_version\":\"1\",\"unit\":\"days\",\"formula\":\"median(field.milestone_date - field.contract_start where field.onboarding_milestone = 'go_live')\"}"
  - name: gasp_time_to_full_adoption
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: MEDIAN(CASE WHEN onboarding_milestone.onboarding_milestone = 'full_adoption' THEN DATEDIFF(day, onboarding_milestone.contract_start, onboarding_milestone.milestone_date) END)
    description: Time to Full Adoption. Time from contract to using all purchased features/modules.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/onboarding/time-to-full-adoption."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"time_to_full_adoption\",\"gasp_version\":\"1\",\"unit\":\"days\",\"formula\":\"median(field.milestone_date - field.contract_start where field.onboarding_milestone = 'full_adoption')\"}"
  - name: gasp_onboarding_duration
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_onboarding_duration.value)
    description: Onboarding Duration. Time from onboarding start to onboarding completion, for onboardings completed in the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/onboarding/onboarding-duration. Staged (period bound in filter): gasp_staged_gasp_onboarding_duration holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"onboarding_duration","gasp_version":"1","unit":"days","formula":"median(field.onboarding_completion_date - field.onboarding_start_date where in_period(field.onboarding_completion_date))","staged":true}'
  - name: gasp_onboarding_completion
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_onboarding_completion.value)
    description: Onboarding Completion Rate. Percentage of customers who complete the onboarding program.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/onboarding/onboarding-completion-rate. Staged (period bound in filter): gasp_staged_gasp_onboarding_completion holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"onboarding_completion","gasp_version":"1","unit":"percent","formula":"count_distinct(field.onboarding_id where in_period(field.onboarding_completion_date)) / count_distinct(field.onboarding_id where in_period(field.onboarding_start_date))","staged":true}'
  - name: gasp_on_time_completion_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_on_time_completion_rate.value)
    description: On-Time Completion Rate. Percentage of customers completing onboarding within target timeframe.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/onboarding/on-time-completion-rate. Staged (period bound in filter): gasp_staged_gasp_on_time_completion_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"on_time_completion_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.onboarding_id where in_period(field.onboarding_completion_date) and field.onboarding_completion_date <= field.target_date) / count_distinct(field.onboarding_id where in_period(field.onboarding_completion_date))","staged":true}'
  - name: gasp_session_attendance_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(CASE WHEN onboarding_session.attendees > 0 THEN onboarding_session.onboarding_session_date END) AS DECIMAL) / NULLIF(COUNT(onboarding_session.onboarding_session_date), 0))
    description: Session Attendance Rate. Percentage of scheduled onboarding sessions attended.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/onboarding/session-attendance-rate."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"session_attendance_rate","gasp_version":"1","unit":"percent","formula":"count(field.onboarding_session_date where field.attendees > 0) / count(field.onboarding_session_date)"}'
  - name: gasp_task_completion_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(onboarding.steps_completed) AS DECIMAL) / NULLIF(SUM(onboarding.steps_total), 0))
    description: Task Completion Rate. Percentage of assigned onboarding tasks completed by customer.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/onboarding/task-completion-rate. Reads the onboarding snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"task_completion_rate","gasp_version":"1","unit":"percent","formula":"sum(field.steps_completed) / sum(field.steps_total)"}'
  - name: gasp_onboarding_csat
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(CASE WHEN (survey_response.survey_type = 'onboarding' AND survey_response.satisfaction_score >= 4) THEN survey_response.satisfaction_score END) AS DECIMAL) / NULLIF(COUNT(CASE WHEN survey_response.survey_type = 'onboarding' THEN survey_response.satisfaction_score END), 0))
    description: Onboarding CSAT. Customer satisfaction with the onboarding experience.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/onboarding/onboarding-csat."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"onboarding_csat\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count(field.satisfaction_score where field.survey_type = 'onboarding' and field.satisfaction_score >= 4) / count(field.satisfaction_score where field.survey_type = 'onboarding')\"}"
  - name: gasp_onboarding_nps
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: ((CAST((COUNT(CASE WHEN (survey_response.survey_type = 'onboarding' AND survey_response.nps_score >= 9) THEN survey_response.nps_score END) - COUNT(CASE WHEN (survey_response.survey_type = 'onboarding' AND survey_response.nps_score <= 6) THEN survey_response.nps_score END)) AS DECIMAL) / NULLIF(COUNT(CASE WHEN survey_response.survey_type = 'onboarding' THEN survey_response.nps_score END), 0)) * 100)
    description: Onboarding NPS. Net Promoter Score specifically for onboarding experience.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/onboarding/onboarding-nps."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"onboarding_nps\",\"gasp_version\":\"1\",\"unit\":\"score\",\"formula\":\"(count(field.nps_score where field.survey_type = 'onboarding' and field.nps_score >= 9) - count(field.nps_score where field.survey_type = 'onboarding' and field.nps_score <= 6)) / count(field.nps_score where field.survey_type = 'onboarding') * 100\"}"
  - name: gasp_onboardings_per_resource
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_onboardings_per_resource.value)
    description: Onboardings per Resource. Number of onboardings handled per implementation resource.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/onboarding/onboardings-per-resource. Staged (period bound in filter): gasp_staged_gasp_onboardings_per_resource holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"onboardings_per_resource","gasp_version":"1","unit":"ratio","formula":"count_distinct(field.onboarding_id where in_period(field.onboarding_completion_date)) / count_distinct(field.resource_id where in_period(field.onboarding_completion_date))","staged":true}'
  - name: gasp_cost_per_onboarding
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_cost_per_onboarding.value)
    description: Cost per Onboarding. Total onboarding cost divided by customers onboarded.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/onboarding/cost-per-onboarding. Staged (period bound in filter): gasp_staged_gasp_cost_per_onboarding holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"cost_per_onboarding\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.cost where field.cost_function = 'onboarding') / count_distinct(field.onboarding_id where in_period(field.onboarding_completion_date))\",\"staged\":true}"
  - name: gasp_time_spent_per_onboarding
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_time_spent_per_onboarding.value)
    description: Time Spent per Onboarding. Total hours invested per customer onboarding.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/onboarding/time-spent-per-onboarding. Staged (period bound in filter): gasp_staged_gasp_time_spent_per_onboarding holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"time_spent_per_onboarding","gasp_version":"1","unit":"hours","formula":"sum(field.hours where in_period(field.onboarding_completion_date)) / count_distinct(field.onboarding_id where in_period(field.onboarding_completion_date))","staged":true}'
  - name: gasp_day_30_retention_post_onboarding
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN ((customer.onboarding_completion_date IS NOT NULL AND customer.customer_status = 'active') AND DATEDIFF(day, customer.onboarding_completion_date, customer.last_active_date) >= 30) THEN customer.customer_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN customer.onboarding_completion_date IS NOT NULL THEN customer.customer_id END), 0))
    description: 30-Day Retention (Post-Onboarding). Percentage of customers still active 30 days after onboarding completion.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/onboarding/30-day-retention-post-onboarding. Reads the customer snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"day_30_retention_post_onboarding\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.customer_id where field.onboarding_completion_date is not null and field.customer_status = 'active' and (field.last_active_date - field.onboarding_completion_date) >= 30) / count_distinct(field.customer_id where field.onboarding_completion_date is not null)\"}"
  - name: gasp_feature_adoption_at_go_live
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN product_event.usage_count > 0 THEN product_event.feature_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT feature.feature_id), 0))
    description: Feature Adoption at Go-Live. Percentage of available features being used at go-live.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/onboarding/feature-adoption-at-go-live. Reads the feature snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"feature_adoption_at_go_live","gasp_version":"1","unit":"percent","formula":"count_distinct(field.feature_id where field.usage_count > 0) / count_distinct(field.feature_id)"}'
  - name: gasp_total_headcount
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT CASE WHEN employee.employee_status = 'active' THEN employee.employee_id END)
    description: Total Headcount. Total number of active employees at the end of the period.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/total-headcount. Reads the employee snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"total_headcount\",\"gasp_version\":\"1\",\"unit\":\"count\",\"formula\":\"count_distinct(field.employee_id where field.employee_status = 'active') at period_end\"}"
  - name: gasp_total_headcount_by_department
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT CASE WHEN employee.employee_status = 'active' THEN employee.employee_id END)
    description: Total Headcount, by_department breakdown. Total number of active employees at the end of the period.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/total-headcount. Broken down by department: report one value per department by grouping on the department field of each dataset the expression reads. Reads the employee snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"total_headcount\",\"gasp_version\":\"1\",\"variant\":\"by_department\",\"unit\":\"count\",\"formula\":\"count_distinct(field.employee_id where field.employee_status = 'active') at period_end\",\"gasp_breakdown\":\"department\"}"
  - name: gasp_headcount_growth_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_headcount_growth_rate.value)
    description: Headcount Growth Rate. Percentage change in headcount over a period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/headcount-growth-rate. Staged (at period_start): gasp_staged_gasp_headcount_growth_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"headcount_growth_rate","gasp_version":"1","unit":"percent","formula":"(metric.total_headcount at period_end - metric.total_headcount at period_start) / metric.total_headcount at period_start","staged":true}'
  - name: gasp_employee_turnover
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_employee_turnover.value)
    description: Employee Turnover Rate. Percentage of employees who left in a period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/employee-turnover-rate. Staged (at period_start): gasp_staged_gasp_employee_turnover holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"employee_turnover","gasp_version":"1","unit":"percent","formula":"count_distinct(field.employee_id where field.termination_date >= period_start and field.termination_date <= period_end) / ((metric.total_headcount at period_start + metric.total_headcount at period_end) / 2)","staged":true}'
  - name: gasp_employee_turnover_by_department
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_employee_turnover_by_department.value)
    description: Employee Turnover Rate, by_department breakdown. Percentage of employees who left in a period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/employee-turnover-rate. Broken down by department: report one value per department. Staged (at period_start): gasp_staged_gasp_employee_turnover_by_department holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"employee_turnover","gasp_version":"1","variant":"by_department","unit":"percent","formula":"count_distinct(field.employee_id where field.termination_date >= period_start and field.termination_date <= period_end) / ((metric.total_headcount at period_start + metric.total_headcount at period_end) / 2)","gasp_breakdown":"department","staged":true}'
  - name: gasp_voluntary_turnover_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_voluntary_turnover_rate.value)
    description: Voluntary Turnover Rate. Turnover due to employee choice (resignations).
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/voluntary-turnover-rate. Staged (at period_start): gasp_staged_gasp_voluntary_turnover_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"voluntary_turnover_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.employee_id where field.termination_type = 'voluntary' and in_period(field.termination_date)) / ((metric.total_headcount at period_start + metric.total_headcount at period_end) / 2)\",\"staged\":true}"
  - name: gasp_voluntary_turnover_rate_by_department
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_voluntary_turnover_rate_by_department.value)
    description: Voluntary Turnover Rate, by_department breakdown. Turnover due to employee choice (resignations).
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/voluntary-turnover-rate. Broken down by department: report one value per department. Staged (at period_start): gasp_staged_gasp_voluntary_turnover_rate_by_department holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"voluntary_turnover_rate\",\"gasp_version\":\"1\",\"variant\":\"by_department\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.employee_id where field.termination_type = 'voluntary' and in_period(field.termination_date)) / ((metric.total_headcount at period_start + metric.total_headcount at period_end) / 2)\",\"gasp_breakdown\":\"department\",\"staged\":true}"
  - name: gasp_involuntary_turnover_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_involuntary_turnover_rate.value)
    description: Involuntary Turnover Rate. Turnover due to company decision (terminations, layoffs).
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/involuntary-turnover-rate. Staged (at period_start): gasp_staged_gasp_involuntary_turnover_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"involuntary_turnover_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.employee_id where field.termination_type = 'involuntary' and in_period(field.termination_date)) / ((metric.total_headcount at period_start + metric.total_headcount at period_end) / 2)\",\"staged\":true}"
  - name: gasp_regrettable_turnover
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_regrettable_turnover.value)
    description: Regrettable Turnover. Voluntary departures of high performers, as a share of the high performers employed at the start of the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/regrettable-turnover. Staged (at period_start): gasp_staged_gasp_regrettable_turnover holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"regrettable_turnover\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.employee_id where field.termination_type = 'voluntary' and field.is_high_performer = true and in_period(field.termination_date)) / count_distinct(field.employee_id where field.is_high_performer = true and field.employee_status = 'active') at period_start\",\"staged\":true}"
  - name: gasp_average_tenure
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(AVG(CASE WHEN employee.employee_status = 'active' THEN DATEDIFF(day, employee.hire_date, employee.snapshot_date) END) AS DECIMAL) / 30.4375)
    description: Average Tenure. Average length of employment.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/average-tenure. Reads the employee snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"average_tenure\",\"gasp_version\":\"1\",\"unit\":\"months\",\"formula\":\"(avg(field.snapshot_date - field.hire_date where field.employee_status = 'active') at period_end) / 30.4375\"}"
  - name: gasp_day_90_turnover
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_day_90_turnover.value)
    description: 90-Day Turnover. Percentage of new hires who leave within 90 days.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/90-day-turnover. Staged (period bound in filter): gasp_staged_gasp_day_90_turnover holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"day_90_turnover","gasp_version":"1","unit":"percent","formula":"count_distinct(field.employee_id where field.termination_date is not null and field.termination_date - field.hire_date <= 90) / count_distinct(field.employee_id where field.hire_date >= period_start and field.hire_date <= period_end)","staged":true}'
  - name: gasp_day_90_turnover_by_hire_source
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_day_90_turnover_by_hire_source.value)
    description: 90-Day Turnover, by_hire_source breakdown. Percentage of new hires who leave within 90 days.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/90-day-turnover. Broken down by hire_source: report one value per hire_source. Staged (period bound in filter): gasp_staged_gasp_day_90_turnover_by_hire_source holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"day_90_turnover","gasp_version":"1","variant":"by_hire_source","unit":"percent","formula":"count_distinct(field.employee_id where field.termination_date is not null and field.termination_date - field.hire_date <= 90) / count_distinct(field.employee_id where field.hire_date >= period_start and field.hire_date <= period_end)","gasp_breakdown":"hire_source","staged":true}'
  - name: gasp_enps
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: ((CAST((COUNT(CASE WHEN (survey_response.survey_type = 'employee' AND survey_response.nps_score >= 9) THEN survey_response.nps_score END) - COUNT(CASE WHEN (survey_response.survey_type = 'employee' AND survey_response.nps_score <= 6) THEN survey_response.nps_score END)) AS DECIMAL) / NULLIF(COUNT(CASE WHEN survey_response.survey_type = 'employee' THEN survey_response.nps_score END), 0)) * 100)
    description: Employee Net Promoter Score (eNPS). Likelihood of employees recommending the company as a place to work.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/employee-net-promoter-score-enps."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"enps\",\"gasp_version\":\"1\",\"unit\":\"score\",\"formula\":\"(count(field.nps_score where field.survey_type = 'employee' and field.nps_score >= 9) - count(field.nps_score where field.survey_type = 'employee' and field.nps_score <= 6)) / count(field.nps_score where field.survey_type = 'employee') * 100\"}"
  - name: gasp_engagement_score
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: AVG(CASE WHEN survey_response.survey_type = 'employee' THEN survey_response.engagement_score END)
    description: Engagement Score. Composite score from engagement survey.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/engagement-score."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"engagement_score\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"avg(field.engagement_score where field.survey_type = 'employee')\"}"
  - name: gasp_survey_participation_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(CASE WHEN (survey_response.survey_type = 'employee' AND survey_response.survey_completed = TRUE) THEN survey_response.response_id END) AS DECIMAL) / NULLIF(COUNT(CASE WHEN survey_response.survey_type = 'employee' THEN survey_response.response_id END), 0))
    description: Survey Participation Rate. Percentage of employees completing engagement surveys.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/survey-participation-rate."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"survey_participation_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count(field.response_id where field.survey_type = 'employee' and field.survey_completed = true) / count(field.response_id where field.survey_type = 'employee')\"}"
  - name: gasp_open_positions
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: COUNT(DISTINCT CASE WHEN requisition.requisition_status = 'open' THEN requisition.requisition_id END)
    description: Open Positions. Number of open requisitions (unfilled roles) at the end of the period.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/open-positions. Reads the requisition snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"open_positions\",\"gasp_version\":\"1\",\"unit\":\"count\",\"formula\":\"count_distinct(field.requisition_id where field.requisition_status = 'open') at period_end\"}"
  - name: gasp_time_to_fill
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_time_to_fill.value)
    description: Time to Fill. Days from a requisition opening to it being filled with an accepted offer, for requisitions filled in the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/time-to-fill. Staged (period bound in filter): gasp_staged_gasp_time_to_fill holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"time_to_fill","gasp_version":"1","unit":"days","formula":"avg(field.filled_date - field.requisition_opened_date where in_period(field.filled_date))","staged":true}'
  - name: gasp_time_to_hire
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_time_to_hire.value)
    description: Time to Hire. Days from the hired employee's application to their start date, for employees hired in the period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/time-to-hire. Staged (period bound in filter): gasp_staged_gasp_time_to_hire holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"time_to_hire","gasp_version":"1","unit":"days","formula":"avg(field.hire_date - field.application_date where in_period(field.hire_date))","staged":true}'
  - name: gasp_offer_acceptance_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(CASE WHEN requisition.offer_status = 'accepted' THEN requisition.requisition_id END) AS DECIMAL) / NULLIF(COUNT(CASE WHEN requisition.offer_status IN ('accepted', 'declined') THEN requisition.requisition_id END), 0))
    description: Offer Acceptance Rate. Percentage of offers accepted.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/offer-acceptance-rate. Reads the requisition snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"offer_acceptance_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count(field.requisition_id where field.offer_status = 'accepted') / count(field.requisition_id where field.offer_status in ('accepted', 'declined'))\"}"
  - name: gasp_quality_of_hire
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: AVG(CASE WHEN ((employee.hire_date IS NOT NULL AND DATEDIFF(day, employee.hire_date, employee.snapshot_date) >= 182) AND DATEDIFF(day, employee.hire_date, employee.snapshot_date) <= 365) THEN employee.performance_rating END)
    description: Quality of Hire. Performance rating of new hires after defined period.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/quality-of-hire. Reads the employee snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"quality_of_hire","gasp_version":"1","unit":"score","formula":"avg(field.performance_rating where field.hire_date is not null and field.snapshot_date - field.hire_date >= 182 and field.snapshot_date - field.hire_date <= 365)"}'
  - name: gasp_cost_per_hire
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_cost_per_hire.value)
    description: Cost per Hire. Total recruiting cost divided by hires made.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/cost-per-hire. Staged (period bound in filter): gasp_staged_gasp_cost_per_hire holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"cost_per_hire\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.cost where field.cost_function = 'recruiting') / count_distinct(field.employee_id where field.hire_date >= period_start and field.hire_date <= period_end)\",\"staged\":true}"
  - name: gasp_source_of_hire
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_source_of_hire.value)
    description: Source of Hire. Where successful candidates came from.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/source-of-hire. Broken down by hire_source: report one value per hire_source. Staged (total): gasp_staged_gasp_source_of_hire holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"source_of_hire","gasp_version":"1","unit":"percent","formula":"count_distinct(field.employee_id where in_period(field.hire_date)) / total(count_distinct(field.employee_id where in_period(field.hire_date)))","gasp_breakdown":"hire_source","staged":true}'
  - name: gasp_compa_ratio
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: AVG((CAST(employee.salary AS DECIMAL) / NULLIF(employee.market_midpoint, 0)))
    description: Compa-Ratio. Employee salary relative to market midpoint.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/compa-ratio. Reads the employee snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"compa_ratio","gasp_version":"1","unit":"percent","formula":"avg(field.salary / field.market_midpoint)"}'
  - name: gasp_pay_equity_ratio
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(AVG(CASE WHEN employee.underrepresented_group = TRUE THEN employee.salary END) AS DECIMAL) / NULLIF(AVG(CASE WHEN employee.underrepresented_group = FALSE THEN employee.salary END), 0))
    description: Pay Equity Ratio. Pay comparison across demographic groups for same role.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/pay-equity-ratio. Reads the employee snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"pay_equity_ratio","gasp_version":"1","unit":"ratio","formula":"avg(field.salary where field.underrepresented_group = true) / avg(field.salary where field.underrepresented_group = false)"}'
  - name: gasp_diversity_representation
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN (employee.underrepresented_group = TRUE AND employee.employee_status = 'active') THEN employee.employee_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN employee.employee_status = 'active' THEN employee.employee_id END), 0))
    description: Diversity Representation. Percentage of workforce from underrepresented groups.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/diversity-representation. Reads the employee snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"diversity_representation\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.employee_id where field.underrepresented_group = true and field.employee_status = 'active') / count_distinct(field.employee_id where field.employee_status = 'active') at period_end\"}"
  - name: gasp_diversity_in_leadership
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN ((employee.underrepresented_group = TRUE AND employee.job_level IN ('manager', 'director', 'vp', 'c_level')) AND employee.employee_status = 'active') THEN employee.employee_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN (employee.job_level IN ('manager', 'director', 'vp', 'c_level') AND employee.employee_status = 'active') THEN employee.employee_id END), 0))
    description: Diversity in Leadership. Representation at manager+ levels.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/diversity-in-leadership. Reads the employee snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"diversity_in_leadership\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.employee_id where field.underrepresented_group = true and field.job_level in ('manager', 'director', 'vp', 'c_level') and field.employee_status = 'active') / count_distinct(field.employee_id where field.job_level in ('manager', 'director', 'vp', 'c_level') and field.employee_status = 'active') at period_end\"}"
  - name: gasp_diversity_hiring_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_diversity_hiring_rate.value)
    description: Diversity Hiring Rate. Percentage of new hires from underrepresented groups.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/people/diversity-hiring-rate. Staged (period bound in filter): gasp_staged_gasp_diversity_hiring_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"diversity_hiring_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.employee_id where field.underrepresented_group = true and field.hire_date >= period_start and field.hire_date <= period_end) / count_distinct(field.employee_id where field.hire_date >= period_start and field.hire_date <= period_end)","staged":true}'
  - name: gasp_visitors
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(web_traffic.unique_visitors)
    description: Visitors. Unique visitors to owned properties (website, app).
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/visitors."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"visitors","gasp_version":"1","unit":"count","formula":"sum(field.unique_visitors)"}'
  - name: gasp_visitor_to_lead_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_visitor_to_lead_rate.value)
    description: Visitor-to-Lead Rate. Percentage of website visitors who become leads.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/visitor-to-lead-rate. Staged (period bound in filter): gasp_staged_gasp_visitor_to_lead_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"visitor_to_lead_rate","gasp_version":"1","unit":"percent","formula":"metric.leads / metric.visitors","staged":true}'
  - name: gasp_leads
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_leads.value)
    description: Leads. Contacts who have expressed interest (form fill, signup, etc.).
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/leads. Staged (period bound in filter): gasp_staged_gasp_leads holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"leads","gasp_version":"1","unit":"count","formula":"count_distinct(field.lead_id where in_period(field.lead_created_date))","staged":true}'
  - name: gasp_leads_by_lead_source
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_leads_by_lead_source.value)
    description: Leads, by_lead_source breakdown. Contacts who have expressed interest (form fill, signup, etc.).
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/leads. Broken down by lead_source: report one value per lead_source. Staged (period bound in filter): gasp_staged_gasp_leads_by_lead_source holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"leads","gasp_version":"1","variant":"by_lead_source","unit":"count","formula":"count_distinct(field.lead_id where in_period(field.lead_created_date))","gasp_breakdown":"lead_source","staged":true}'
  - name: gasp_leads_by_lead_stage
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_leads_by_lead_stage.value)
    description: Leads, by_lead_stage breakdown. Contacts who have expressed interest (form fill, signup, etc.).
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/leads. Broken down by lead_stage: report one value per lead_stage. Staged (period bound in filter): gasp_staged_gasp_leads_by_lead_stage holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"leads","gasp_version":"1","variant":"by_lead_stage","unit":"count","formula":"count_distinct(field.lead_id where in_period(field.lead_created_date))","gasp_breakdown":"lead_stage","staged":true}'
  - name: gasp_mqls
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_mqls.value)
    description: Marketing Qualified Leads (MQLs). Leads that have demonstrated sufficient engagement and intent to warrant sales attention, based on criteria established between marketing and sales.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/marketing-qualified-leads-mqls. Staged (period bound in filter): gasp_staged_gasp_mqls holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"mqls","gasp_version":"1","unit":"count","formula":"count_distinct(field.lead_id where in_period(field.mql_date))","staged":true}'
  - name: gasp_mqls_by_lead_source
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_mqls_by_lead_source.value)
    description: Marketing Qualified Leads (MQLs), by_lead_source breakdown. Leads that have demonstrated sufficient engagement and intent to warrant sales attention, based on criteria established between marketing and sales.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/marketing-qualified-leads-mqls. Broken down by lead_source: report one value per lead_source. Staged (period bound in filter): gasp_staged_gasp_mqls_by_lead_source holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"mqls","gasp_version":"1","variant":"by_lead_source","unit":"count","formula":"count_distinct(field.lead_id where in_period(field.mql_date))","gasp_breakdown":"lead_source","staged":true}'
  - name: gasp_lead_to_mql_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_lead_to_mql_rate.value)
    description: Lead-to-MQL Rate. Percentage of leads that become MQLs.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/lead-to-mql-rate. Staged (period bound in filter): gasp_staged_gasp_lead_to_mql_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"lead_to_mql_rate","gasp_version":"1","unit":"percent","formula":"metric.mqls / metric.leads","staged":true}'
  - name: gasp_lead_to_mql_rate_by_lead_source
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_lead_to_mql_rate_by_lead_source.value)
    description: Lead-to-MQL Rate, by_lead_source breakdown. Percentage of leads that become MQLs.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/lead-to-mql-rate. Broken down by lead_source: report one value per lead_source. Staged (period bound in filter): gasp_staged_gasp_lead_to_mql_rate_by_lead_source holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"lead_to_mql_rate","gasp_version":"1","variant":"by_lead_source","unit":"percent","formula":"metric.mqls / metric.leads","gasp_breakdown":"lead_source","staged":true}'
  - name: gasp_sqls
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_sqls.value)
    description: Sales Qualified Leads (SQLs). MQLs accepted by sales as worth pursuing.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/sales-qualified-leads-sqls. Staged (period bound in filter): gasp_staged_gasp_sqls holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"sqls","gasp_version":"1","unit":"count","formula":"count_distinct(field.lead_id where in_period(field.sql_date))","staged":true}'
  - name: gasp_mql_to_sql_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_mql_to_sql_rate.value)
    description: MQL-to-SQL Rate. Percentage of MQLs accepted by sales as qualified.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/mql-to-sql-rate. Staged (period bound in filter): gasp_staged_gasp_mql_to_sql_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"mql_to_sql_rate","gasp_version":"1","unit":"percent","formula":"metric.sqls / metric.mqls","staged":true}'
  - name: gasp_mql_to_sql_rate_by_lead_source
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_mql_to_sql_rate_by_lead_source.value)
    description: MQL-to-SQL Rate, by_lead_source breakdown. Percentage of MQLs accepted by sales as qualified.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/mql-to-sql-rate. Broken down by lead_source: report one value per lead_source. Staged (period bound in filter): gasp_staged_gasp_mql_to_sql_rate_by_lead_source holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"mql_to_sql_rate","gasp_version":"1","variant":"by_lead_source","unit":"percent","formula":"metric.sqls / metric.mqls","gasp_breakdown":"lead_source","staged":true}'
  - name: gasp_sql_to_opportunity_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_sql_to_opportunity_rate.value)
    description: SQL-to-Opportunity Rate. Percentage of SQLs that become pipeline opportunities.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/sql-to-opportunity-rate. Staged (period bound in filter): gasp_staged_gasp_sql_to_opportunity_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"sql_to_opportunity_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.opportunity_id where in_period(field.opportunity_created_date)) / metric.sqls","staged":true}'
  - name: gasp_lvr
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_lvr.value)
    description: Lead Velocity Rate (LVR). Month-over-month growth in qualified leads (MQLs).
    datatype: Decimal
    ai_context:
      synonyms:
        - LVR
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/lead-velocity-rate-lvr. Staged (lag): gasp_staged_gasp_lvr holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"lvr","gasp_version":"1","unit":"percent","formula":"(metric.mqls - lag(metric.mqls, 1 month)) / lag(metric.mqls, 1 month)","staged":true}'
  - name: gasp_marketing_cac
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(CASE WHEN (cost_event.cost_function = 'gtm' AND cost_event.cost_centre = 'marketing') THEN cost_event.cost ELSE 0 END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN revenue_event.event_type = 'new' THEN revenue_event.customer_id END), 0))
    description: "Marketing CAC. Marketing-only portion of acquisition cost: go-to-market cost booked to the marketing cost centre, divided by all new customers in the period."
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/marketing-cac."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"marketing_cac\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.cost where field.cost_function = 'gtm' and field.cost_centre = 'marketing') / count_distinct(field.customer_id where field.event_type = 'new')\"}"
  - name: gasp_cac_by_channel
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_cac_by_channel.value)
    description: CAC by Channel. Customer acquisition cost broken down by marketing channel.
    datatype: Decimal
    ai_context:
      synonyms:
        - CAC
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/cac-by-channel. Broken down by channel: report one value per channel. Staged (period bound in filter): gasp_staged_gasp_cac_by_channel holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"cac_by_channel\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.ad_spend) / count_distinct(field.opportunity_id where field.opportunity_stage = 'closed_won' and in_period(field.close_date))\",\"gasp_breakdown\":\"channel\",\"staged\":true}"
  - name: gasp_cpl
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_cpl.value)
    description: Cost per Lead (CPL). Cost to acquire a lead.
    datatype: Decimal
    ai_context:
      synonyms:
        - CPL
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/cost-per-lead-cpl. Staged (period bound in filter): gasp_staged_gasp_cpl holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"cpl\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.cost where field.cost_function = 'gtm' and field.cost_centre = 'marketing') / metric.leads\",\"staged\":true}"
  - name: gasp_cost_per_mql
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_cost_per_mql.value)
    description: Cost per MQL. Cost to acquire a marketing qualified lead.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/cost-per-mql. Staged (period bound in filter): gasp_staged_gasp_cost_per_mql holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"cost_per_mql\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.cost where field.cost_function = 'gtm' and field.cost_centre = 'marketing') / metric.mqls\",\"staged\":true}"
  - name: gasp_marketing_sourced_pipeline
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN (opportunity.marketing_source = 'marketing' AND opportunity.opportunity_stage NOT IN ('closed_won', 'closed_lost')) THEN opportunity.opportunity_amount ELSE 0 END)
    description: Marketing Sourced Pipeline. Pipeline value attributed to marketing efforts (first-touch attribution).
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/marketing-sourced-pipeline. Reads the opportunity snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"marketing_sourced_pipeline\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.opportunity_amount where field.marketing_source = 'marketing' and field.opportunity_stage not in ('closed_won', 'closed_lost'))\"}"
  - name: gasp_marketing_sourced_revenue
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_marketing_sourced_revenue.value)
    description: Marketing Sourced Revenue. Closed revenue attributed to marketing efforts (first-touch attribution).
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/marketing-sourced-revenue. Staged (period bound in filter): gasp_staged_gasp_marketing_sourced_revenue holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"marketing_sourced_revenue\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.opportunity_amount where field.marketing_source = 'marketing' and field.opportunity_stage = 'closed_won' and in_period(field.close_date))\",\"staged\":true}"
  - name: gasp_marketing_influenced_pipelinerevenue
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN (opportunity.marketing_influenced = TRUE AND opportunity.opportunity_stage NOT IN ('closed_won', 'closed_lost')) THEN opportunity.opportunity_amount ELSE 0 END)
    description: Marketing Influenced Pipeline/Revenue. Pipeline or revenue where marketing touched the deal at any point (multi-touch attribution).
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/marketing-influenced-pipelinerevenue. Reads the opportunity snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"marketing_influenced_pipelinerevenue\",\"gasp_version\":\"1\",\"unit\":\"currency\",\"formula\":\"sum(field.opportunity_amount where field.marketing_influenced = true and field.opportunity_stage not in ('closed_won', 'closed_lost'))\"}"
  - name: gasp_marketing_influenced_pipelinerevenue_revenue
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_marketing_influenced_pipelinerevenue_revenue.value)
    description: Marketing Influenced Pipeline/Revenue, revenue variant. Pipeline or revenue where marketing touched the deal at any point (multi-touch attribution).
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/marketing-influenced-pipelinerevenue. Staged (period bound in filter): gasp_staged_gasp_marketing_influenced_pipelinerevenue_revenue holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"marketing_influenced_pipelinerevenue\",\"gasp_version\":\"1\",\"variant\":\"revenue\",\"unit\":\"currency\",\"formula\":\"sum(field.opportunity_amount where field.marketing_influenced = true and field.opportunity_stage = 'closed_won' and in_period(field.close_date))\",\"staged\":true}"
  - name: gasp_organic_traffic
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(CASE WHEN web_traffic.traffic_source = 'organic_search' THEN web_traffic.unique_visitors ELSE 0 END)
    description: Organic Traffic. Visitors from unpaid search.
    datatype: Integer
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/organic-traffic."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"organic_traffic\",\"gasp_version\":\"1\",\"unit\":\"count\",\"formula\":\"sum(field.unique_visitors where field.traffic_source = 'organic_search')\"}"
  - name: gasp_paid_media_efficiency_roas
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_paid_media_efficiency_roas.value)
    description: "Paid Media Efficiency (ROAS). Return on ad spend: closed won revenue from the paid ads channel in the period, divided by paid ad spend."
    datatype: Decimal
    ai_context:
      synonyms:
        - ROAS
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/paid-media-efficiency-roas. Staged (period bound in filter): gasp_staged_gasp_paid_media_efficiency_roas holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"paid_media_efficiency_roas\",\"gasp_version\":\"1\",\"unit\":\"ratio\",\"formula\":\"sum(field.opportunity_amount where field.channel = 'paid_ads' and field.opportunity_stage = 'closed_won' and in_period(field.close_date)) / sum(field.ad_spend where field.channel = 'paid_ads')\",\"staged\":true}"
  - name: gasp_share_of_voice
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(SUM(CASE WHEN brand_mention.is_competitor = FALSE THEN brand_mention.mention_count ELSE 0 END) AS DECIMAL) / NULLIF(SUM(brand_mention.mention_count), 0))
    description: Share of Voice. Brand mentions relative to competitors.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/share-of-voice."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"share_of_voice","gasp_version":"1","unit":"percent","formula":"sum(field.mention_count where field.is_competitor = false) / sum(field.mention_count)"}'
  - name: gasp_nps_marketing_context
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: ((CAST((COUNT(CASE WHEN (survey_response.survey_type = 'prospect' AND survey_response.nps_score >= 9) THEN survey_response.nps_score END) - COUNT(CASE WHEN (survey_response.survey_type = 'prospect' AND survey_response.nps_score <= 6) THEN survey_response.nps_score END)) AS DECIMAL) / NULLIF(COUNT(CASE WHEN survey_response.survey_type = 'prospect' THEN survey_response.nps_score END), 0)) * 100)
    description: NPS (Marketing context). Net Promoter Score for prospects/market (vs customers).
    datatype: Decimal
    ai_context:
      synonyms:
        - NPS
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/marketing/nps-marketing-context."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"nps_marketing_context\",\"gasp_version\":\"1\",\"unit\":\"score\",\"formula\":\"(count(field.nps_score where field.survey_type = 'prospect' and field.nps_score >= 9) - count(field.nps_score where field.survey_type = 'prospect' and field.nps_score <= 6)) / count(field.nps_score where field.survey_type = 'prospect') * 100\"}"
  - name: gasp_onboarding_milestone_completion_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_onboarding_milestone_completion_rate.value)
    description: Onboarding Milestone Completion Rate. Percentage of due onboarding milestones that customers reach.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/onboarding/onboarding-milestone-completion-rate. Staged (all_time): gasp_staged_gasp_onboarding_milestone_completion_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"onboarding_milestone_completion_rate","gasp_version":"1","unit":"percent","formula":"all_time(count(field.onboarding_id where in_period(field.milestone_due_date) and field.milestone_date is not null and field.milestone_date <= period_end)) / all_time(count(field.onboarding_id where in_period(field.milestone_due_date)))","staged":true}'
  - name: gasp_project_milestone_completion_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_project_milestone_completion_rate.value)
    description: Project Milestone Completion Rate. Percentage of milestones completed on schedule.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/project-milestone-completion-rate. Staged (period bound in filter): gasp_staged_gasp_project_milestone_completion_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"project_milestone_completion_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.project_milestone_id where in_period(field.actual_date) and field.actual_date <= field.planned_date) / count_distinct(field.project_milestone_id where in_period(field.actual_date))","staged":true}'
  - name: gasp_ticket_escalation_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN ticket.escalated = TRUE THEN ticket.ticket_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT ticket.ticket_id), 0))
    description: Ticket Escalation Rate. Percentage of tickets escalated to higher tier or engineering.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/support/ticket-escalation-rate."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"ticket_escalation_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.ticket_id where field.escalated = true) / count_distinct(field.ticket_id)"}'
  - name: gasp_project_escalation_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN project.escalated = TRUE THEN project.project_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT project.project_id), 0))
    description: Project Escalation Rate. Percentage of projects with escalations.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/professional-services/project-escalation-rate. Reads the project snapshot: select one snapshot date (the period end) with the time dimension, since summing snapshot rows across dates double counts."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"project_escalation_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.project_id where field.escalated = true) / count_distinct(field.project_id)"}'
  - name: gasp_product_activation_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_product_activation_rate.value)
    description: Activation Rate. Percentage of users who signed up in the period that reached the activation milestone.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/activation-rate. Staged (period bound in filter): gasp_staged_gasp_product_activation_rate holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: '{"gasp_id":"product_activation_rate","gasp_version":"1","unit":"percent","formula":"count_distinct(field.user_id where in_period(field.signup_date) and field.activation_date is not null) / count_distinct(field.user_id where in_period(field.signup_date))","staged":true}'
  - name: gasp_trial_to_paid_conversion_rate
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: (CAST(COUNT(DISTINCT CASE WHEN trial.trial_status = 'converted' THEN trial.trial_id END) AS DECIMAL) / NULLIF(COUNT(DISTINCT CASE WHEN trial.trial_status IN ('converted', 'expired', 'cancelled') THEN trial.trial_id END), 0))
    description: Trial-to-Paid Conversion Rate. The percentage of trials that ended in the period and became paying customers.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/trial-to-paid-conversion-rate."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"trial_to_paid_conversion_rate\",\"gasp_version\":\"1\",\"unit\":\"percent\",\"formula\":\"count_distinct(field.trial_id where field.trial_status = 'converted' and in_period(field.trial_end_date)) / count_distinct(field.trial_id where field.trial_status in ('converted', 'expired', 'cancelled') and in_period(field.trial_end_date))\"}"
  - name: gasp_trial_to_paid_conversion_rate_by_start_date
    expression:
      dialects:
        - dialect: OSSIE_SQL_2026
          expression: SUM(gasp_staged_gasp_trial_to_paid_conversion_rate_by_start_date.value)
    description: Trial-to-Paid Conversion Rate, by_start_date variant. The percentage of trials that ended in the period and became paying customers.
    datatype: Decimal
    ai_context:
      instructions: "Canonical definition: https://gaspwiki.com/v1/metrics/product/trial-to-paid-conversion-rate. Staged (all_time): gasp_staged_gasp_trial_to_paid_conversion_rate_by_start_date holds one row per reporting period, so filter its period_start to one period. gasp.period_spine is a table of (period_start, period_end) rows the adopter provides."
    custom_extensions:
      - vendor_name: GASP
        data: "{\"gasp_id\":\"trial_to_paid_conversion_rate\",\"gasp_version\":\"1\",\"variant\":\"by_start_date\",\"unit\":\"percent\",\"formula\":\"all_time(count_distinct(field.trial_id where field.trial_status = 'converted' and in_period(field.trial_start_date))) / all_time(count_distinct(field.trial_id where in_period(field.trial_start_date)))\",\"staged\":true}"
