Skip to main content

Scoring Configuration

GTM Clarity scores every entity on two axes -- Fit (how well a prospect matches your ICP) and Engagement (how actively they interact with your brand). These combine into a unified score that places each entity into a quadrant tier.

Scoring configuration is stored per-tenant in the scoring_configs table and is fully customizable.

Scoring Pipeline Overview

Fit Configuration

Fit scoring measures how closely an account matches your Ideal Customer Profile. The configuration is defined by the FitConfig type:

ICP Profile

ParameterTypeDefaultDescription
industriesstring[][]Target industries (exact match)
minEmployeesnumber50Minimum employee count
maxEmployeesnumber1000Maximum employee count
minRevenuenumber1,000,000Minimum annual revenue (USD)
maxRevenuenumber100,000,000Maximum annual revenue (USD)
customAttributesarray[]Additional scored fields

Custom Attributes

Custom attributes allow scoring on any field in the account data:

{
"customAttributes": [
{
"field": "technology_stack",
"values": ["Salesforce", "HubSpot", "Marketo"],
"weight": 15
},
{
"field": "region",
"values": ["North America", "EMEA"],
"weight": 10
}
]
}

Fit Dimension Weights

Weights control how much each dimension contributes to the overall fit score. They are expressed as percentages and should sum to 100:

DimensionDefault WeightDescription
industry30Industry match
companySize25Employee count within range
revenue25Annual revenue within range
customAttributes20Custom field matches

Engagement Configuration

Engagement scoring measures behavioral signals with time-based decay. The configuration is defined by the EngagementConfig type:

Core Parameters

ParameterTypeDefaultDescription
decayHalfLifeDaysnumber30Days until signal value halves
signalWeightsRecord<string, number>See belowWeight per activity type
channelCapsRecord<string, number>See belowMax score per channel
qualityHierarchyRecord<string, number>See belowSignal quality ranking (0-1)

Signal Weights

Each activity type has a configurable weight. Default weights are all 1.0:

SignalDefault WeightDescription
demo_request1.0Demo or trial request
form_fill1.0Form submission
email_click1.0Email link click
email_open1.0Email open
page_view1.0Website page view
ad_click1.0Advertisement click
event_attend1.0Event attendance
content_download1.0Content download
meeting_attend1.0Meeting attendance

Channel Caps

Channel caps prevent any single channel from dominating the engagement score:

ChannelDefault CapDescription
email30Email interactions
web25Website activity
ads15Advertising engagement
events20Event participation
content20Content consumption
meetings25Meeting engagement
other15Uncategorized

Quality Hierarchy

The quality hierarchy assigns a multiplier (0-1) reflecting signal intent strength:

SignalQuality ScoreIntent Level
demo_request1.0Highest
event_attend0.9Very High
meeting_attend0.9Very High
form_fill0.8High
content_download0.7Medium-High
email_click0.6Medium
ad_click0.5Medium
email_open0.4Low-Medium
page_view0.2Low

Decay Formula

Engagement scores decay exponentially over time:

decayed_score = raw_score * e^(-lambda * days_since_activity)

Where lambda = ln(2) / decayHalfLifeDays. With the default 30-day half-life, a signal loses 50% of its value after 30 days and approximately 75% after 60 days.

tip

Set a shorter half-life (e.g., 14 days) for fast-moving sales cycles, or a longer one (e.g., 90 days) for enterprise deals with extended timelines.

Combined Weights

The combined score blends fit and engagement:

ParameterDefaultDescription
fitWeight1Relative weight for fit
engagementWeight1Relative weight for engagement

The formula: combined = (fitScore * fitWeight + engagementScore * engagementWeight) / (fitWeight + engagementWeight)

Quadrant Thresholds and Tier Assignment

Entities are assigned to quadrants based on their fit and engagement scores:

QuadrantFitEngagementTier Label
Fast-Track>= threshold>= thresholdhot
Investigate< threshold>= thresholdwarm
Nurture>= threshold< thresholdcool
Deprioritize< threshold< thresholdcold

Default thresholds:

ParameterDefaultDescription
fitThreshold50Fit score boundary
engagementThreshold50Engagement score boundary
hysteresisBand10Points beyond threshold needed to change tier

Hysteresis

Hysteresis prevents entities from oscillating between tiers when scores hover near thresholds. An entity must move beyond the threshold by the full hysteresis band (default: 10 points) before changing tier. For example, a hot entity must drop below 40 (not just 49) to become cold.

info

Hysteresis is applied automatically by the TierAssigner class and is tracked in the score breakdown as hysteresisApplied: true/false.

Rollup Strategies

Account and opportunity scores are aggregated from their associated people scores:

Account Rollup

StrategyDescriptionBest For
championHighest individual score wins (default, weight: 0.6)Small buying groups
weighted-averageAll contacts contribute proportionallyLarge accounts
max-breadthRewards engagement breadth across contacts (cap: 1.5x)Enterprise deals

Opportunity Rollup

ParameterDefaultDescription
fitSourceinherit-accountInherit fit from parent account
stageVelocityWeight0.1Weight for deal stage velocity
contactEngagementStrategyweighted-averageHow contact scores aggregate

Configuration Storage

Scoring configs are stored in the scoring_configs table:

ColumnTypeDescription
idtext (UUID)Primary key
tenant_idtextTenant scope
typetextfit, engagement, or combined
configjsonbFull configuration object
versionintegerConfiguration version (default: 1)
is_activebooleanWhether this config is active
warning

Only one active configuration per type per tenant is allowed (enforced by a unique index on tenant_id + type). Changing the config creates a new version -- the old config is deactivated but retained for audit purposes.