GASP

Attribution Taxonomy Layer (ATL)

The tagging system that makes dual-lens metrics possible.

Every event in the Commercial Event Ledger (CEL) is an atomic fact: something happened, to someone, on a date, for an amount. But the same event can mean different things depending on which lens you apply. A $500/mo expansion might be organic seat growth (operating signal) or it might include a cross-module upsell (market-comparable signal). The ATL classifies events so that downstream metrics can include or exclude based on governed rules.

ATL tags are not optional. Every CEL event must carry the tags appropriate to its event class. Without ATL, the CEL is just a ledger. With ATL, it becomes a semantic layer.


Three Tag Dimensions

ATL defines three orthogonal tag dimensions. Each dimension answers a different question about a CEL event.

DimensionQuestionApplies to
Lifecycle AttributionWhere is this customer in their journey?All event classes
Expansion ClassificationWhat kind of growth is this?Revenue_Event (expansion/reactivation), Amendment_Event
Cost Function AttributionWhat commercial function incurred this cost?Cost_Event

Lifecycle Attribution

Every CEL event receives exactly one lifecycle tag. This is the primary dimension — it tells you why the event happened in the context of the customer relationship.

Values

TagDefinitionExample
AcquisitionFirst commercial engagement with a new customer.New customer signs a $2,000/mo contract.
ActivationCustomer reaches first value milestone after acquisition.Customer completes onboarding and goes live in production.
RetentionExisting customer continues or renews without change.Annual renewal at the same MRR.
ExpansionExisting customer increases their commercial commitment.Customer upgrades from Professional to Enterprise tier.
ReactivationPreviously churned customer returns.Customer who cancelled 6 months ago signs a new contract.
ServicingOngoing delivery cost for an active customer.Monthly infrastructure cost, support staffing.

Assignment Rules

  1. A customer’s first Revenue_Event is always Acquisition.
  2. Lifecycle_State_Change events with state_category = activation or state_category = onboarding_complete are Activation.
  3. Revenue_Event with event_type = renewal and zero MRR change is Retention.
  4. Revenue_Event with event_type = expansion is Expansion.
  5. Revenue_Event with event_type = reactivation is Reactivation.
  6. Cost_Event records for active customers with no change event are Servicing.
  7. When a single action generates multiple CEL events (e.g., a renewal with expansion), each event gets its own lifecycle tag. The renewal portion is Retention; the expansion portion is Expansion.

Expansion Classification

Revenue growth and mid-term amendments are not all the same. A customer adding seats to the same product is fundamentally different from a customer buying a new module. This dimension captures that distinction.

Applies to: Revenue_Event where event_type is expansion or reactivation, and all Amendment_Event records.

Values

TagDefinitionExample
Same_ProductMore of what the customer already has. Seat adds, tier upgrades within the same module.20 → 30 seats on the same Professional plan.
New_ModuleCustomer purchases a distinct product module they did not have before.Analytics customer adds the Automation module.
New_Buying_CentreA different department or division within the same legal entity starts purchasing.Engineering team adopts the product already used by Marketing.
Pricing_AdjustmentMRR change driven by pricing action, not usage or scope change.Annual price increase of 5% on renewal.
RecontractingMRR change driven by contract restructuring (e.g., monthly → annual, co-terming).Customer consolidates three monthly subscriptions into one annual contract.
Usage_RealisationMRR change from usage commitments being met or exceeded.Customer exceeds their committed API call volume, triggering overage billing.

Why This Matters

This is the dimension that makes NRR-O differ from NRR-M.

  • NRR-O (Operating) focuses on organic, durable expansion: Same_Product and Usage_Realisation. These signal product-market fit and natural customer growth.
  • NRR-M (Market) includes all expansion types because investor-comparable NRR counts everything that is not net-new logo acquisition.

Without expansion classification, you cannot separate organic growth signals from commercial motion signals. Both are valid — they answer different questions.


Cost Function Attribution

Not all costs serve the same commercial purpose. S&M spend to acquire new logos is fundamentally different from implementation labour to onboard them. This dimension classifies costs by function.

Applies to: all Cost_Event records.

Values

TagDefinitionExample
GTMGo-to-market costs: demand generation, sales compensation, partner commissions.$45,000 monthly marketing spend; $12,000 SDR compensation.
ImplementationCosts to deploy and configure the product for a new customer.40 hours of solutions engineering at $150/hr.
OnboardingCosts to train and enable a new customer post-implementation.CSM time for 90-day onboarding programme.
InfrastructureHosting, compute, storage, and third-party service costs (COGS).AWS monthly bill; Datadog monitoring.
SupportReactive customer assistance: tickets, escalations, troubleshooting.Support team salaries; helpdesk tooling.
Success_EngineeringProactive customer engagement: health monitoring, adoption programmes, QBRs.CS team salaries; Gainsight licensing.
Account_ManagementRenewal and expansion selling to existing customers.Account executive compensation for upsell quota.

Why This Matters

This is the dimension that makes CAC-O differ from CAC-M.

  • CAC-O (Operating) includes all costs to make a customer productive: GTM + Implementation + Onboarding. This reflects the true economic cost of acquiring a revenue-generating customer.
  • CAC-M (Market) includes only GTM costs, matching the S&M-based CAC that investors use for benchmarking.

Without cost function attribution, you cannot compute both perspectives from the same data. You end up maintaining two separate cost allocation models.


Tagging Rules

Every CEL event must be tagged according to these rules. No exceptions.

Rule 1: Every event gets a Lifecycle tag

All five event classes receive exactly one lifecycle_attribution tag.

Rule 2: Revenue growth and amendments get an Expansion tag

Revenue_Event records where event_type is expansion or reactivation, and all Amendment_Event records, receive exactly one expansion_classification tag.

Rule 3: Cost events get a Cost Function tag

All Cost_Event records receive exactly one cost_function tag.

Rule 4: Tags are mutually exclusive within a dimension

An event cannot have two lifecycle tags, two expansion tags, or two cost function tags. If an action spans two categories, it must be recorded as two CEL events with separate tags.

Rule 5: Tags are assigned at event creation

ATL tags are set when the CEL event is created and are immutable thereafter, consistent with the CEL’s immutability principle. Corrections require new events.


Example Tagged Events

These examples show CEL events with their ATL tags applied.

1. New Customer Acquisition

{
  "event_class": "Revenue_Event",
  "event_id": "rev-001",
  "event_date": "2026-02-01",
  "customer_id": "cust-1042",
  "subscription_id": "sub-2001",
  "event_type": "new",
  "mrr_change": 500.00,
  "currency": "USD",
  "prior_mrr": 0.00,
  "new_mrr": 500.00,
  "lifecycle_attribution": "Acquisition"
}

2. Organic Seat Expansion

{
  "event_class": "Amendment_Event",
  "event_id": "amd-001",
  "event_date": "2026-02-10",
  "customer_id": "cust-0512",
  "subscription_id": "sub-0890",
  "amendment_type": "seat_change",
  "mrr_change": 500.00,
  "prior_quantity": 20,
  "new_quantity": 30,
  "lifecycle_attribution": "Expansion",
  "expansion_classification": "Same_Product"
}

3. Cross-Module Upsell

{
  "event_class": "Amendment_Event",
  "event_id": "amd-002",
  "event_date": "2026-03-01",
  "customer_id": "cust-0512",
  "subscription_id": "sub-0891",
  "amendment_type": "add_on",
  "mrr_change": 800.00,
  "lifecycle_attribution": "Expansion",
  "expansion_classification": "New_Module"
}

4. GTM Spend (Shared Cost)

{
  "event_class": "Cost_Event",
  "event_id": "cost-002",
  "event_date": "2026-02-28",
  "cost_centre": "Marketing",
  "amount": 45000.00,
  "currency": "USD",
  "cost_type": "services",
  "customer_id": null,
  "description": "February demand generation campaigns",
  "lifecycle_attribution": "Acquisition",
  "cost_function": "GTM"
}

5. Onboarding Labour (Customer-Specific Cost)

{
  "event_class": "Cost_Event",
  "event_id": "cost-001",
  "event_date": "2026-02-05",
  "cost_centre": "Implementation",
  "amount": 6000.00,
  "currency": "USD",
  "cost_type": "personnel",
  "customer_id": "cust-1042",
  "description": "40 hrs implementation engineering @ $150/hr",
  "lifecycle_attribution": "Activation",
  "cost_function": "Implementation"
}

6. Retention Success Servicing

{
  "event_class": "Cost_Event",
  "event_id": "cost-003",
  "event_date": "2026-02-12",
  "cost_centre": "Customer Success",
  "amount": 2400.00,
  "currency": "USD",
  "cost_type": "personnel",
  "customer_id": "cust-0783",
  "description": "16 hrs success engineering for at-risk retention",
  "lifecycle_attribution": "Servicing",
  "cost_function": "Success_Engineering"
}

Example SQL

ATL tags live as columns on CEL event tables. Querying by ATL dimension is a simple WHERE clause.

CAC-O (Operating): Full Acquisition Cost

SELECT
    DATE_TRUNC('quarter', e.event_date) AS quarter,
    SUM(e.amount) / NULLIF(COUNT(DISTINCT r.customer_id), 0) AS cac_o
FROM cel_cost_events e
CROSS JOIN (
    SELECT DISTINCT customer_id, event_date
    FROM cel_revenue_events
    WHERE event_type = 'new'
) r
WHERE e.lifecycle_attribution IN ('Acquisition', 'Activation')
  AND e.event_date BETWEEN DATE_TRUNC('quarter', r.event_date)
      AND DATE_TRUNC('quarter', r.event_date) + INTERVAL '3 months'
GROUP BY 1;

CAC-M (Market): GTM-Only Acquisition Cost

SELECT
    DATE_TRUNC('quarter', e.event_date) AS quarter,
    SUM(e.amount) / NULLIF(COUNT(DISTINCT r.customer_id), 0) AS cac_m
FROM cel_cost_events e
CROSS JOIN (
    SELECT DISTINCT customer_id, event_date
    FROM cel_revenue_events
    WHERE event_type = 'new'
) r
WHERE e.lifecycle_attribution = 'Acquisition'
  AND e.cost_function = 'GTM'
  AND e.event_date BETWEEN DATE_TRUNC('quarter', r.event_date)
      AND DATE_TRUNC('quarter', r.event_date) + INTERVAL '3 months'
GROUP BY 1;

NRR-O (Operating): Organic Retention

SELECT
    SUM(CASE WHEN event_type IN ('expansion') AND expansion_classification IN ('Same_Product', 'Usage_Realisation')
             THEN mrr_change ELSE 0 END)
  + SUM(CASE WHEN event_type IN ('contraction', 'churn')
             THEN mrr_change ELSE 0 END)
  + SUM(CASE WHEN event_type = 'renewal' THEN new_mrr ELSE 0 END)
AS nrr_o_numerator
FROM cel_revenue_events
WHERE lifecycle_attribution IN ('Retention', 'Expansion')
  AND (expansion_classification IS NULL
       OR expansion_classification IN ('Same_Product', 'Usage_Realisation'))
  AND event_date BETWEEN '2025-03-01' AND '2026-02-28';

How O/M Metrics Use ATL

ATL tags are the mechanism that distinguishes Operating (O) from Market (M) metric forms. O-form metrics reflect internal economic reality — what ops teams use to run the business. M-form metrics match investor-comparable definitions — what boards and investors benchmark against peers. The pattern is consistent:

MetricOperating (O) IncludesMarket (M) Includes
CAClifecycle_attribution ∈ (Acquisition, Activation)lifecycle_attribution = Acquisition AND cost_function = GTM
NRRexpansion_classification ∈ (Same_Product, Usage_Realisation)All expansion_classification except net-new logos
LTVContribution margin (includes Implementation, Onboarding costs)Gross margin (COGS only)
ChurnHazard-based: includes at-risk state transitionsLogo-based: binary churned/active
ARRDurable ARR: excludes Recontracting, Pricing_AdjustmentContracted ARR: all recurring revenue

The full inclusion/exclusion rules for each Core 8 metric (ARR, CAC, NRR, LTV, Churn, GRR, Gross Margin, Rule of 40) will be specified as O/M subsections in Core Metrics in a future update. The ATL dimensions defined here are the building blocks for those rules.


Relationship to Existing Metrics

The current GASP Standard defines metrics with Include/Exclude lists (e.g., CAC includes S&M + implementation costs; NRR excludes reactivation from some calculations). These existing definitions are implicitly the Operating (O) perspective — they represent the economic truth that internal operators need.

ATL does not replace those definitions. It provides the tagging vocabulary that makes it possible to also compute the Market (M) perspective from the same underlying events, and to formally reconcile the two via a Translation Bridge.

GASP Standard v1 · Last updated

Try searching for:

navigateselect