Skip to main content

Behavior Ranking & Selection

Jason Hreha· Updated July 9, 2026

TLDR: Not all behaviors are equal. Behavior ranking systematically evaluates potential target behaviors on impact, feasibility, and strategic alignment to identify the highest-leverage behaviors for intervention.

Overview #

After identifying potential behaviors through behavioral research, you must select which behaviors to target. This selection process determines the success of your entire behavioral strategy.

Poor behavior selection is the #1 cause of behavioral intervention failure.

Example (public sector): In a SNAP recertification program, candidates included “Start renewal 15 days before deadline,” “Upload required documents in a single session,” and “Attend assistance clinic.” Using the rubric, “Upload in a single session” ranked highest (direct impact on completion; BSM feasibility > 6 across contexts). “Start renewal early” scored lower on feasibility due to environmental constraints. The portfolio focused on enabling the single-session upload (checklist + one-upload flow) first.

The Behavior Selection Framework #

Core Evaluation Criteria #

Every behavior is evaluated on three dimensions:

behavior_score = (impact_score × feasibility_score × alignment_score) ^ (1/3)

Use the BSM minimum-component rule as a hard constraint: if the minimum BSM component for the target user segment is below 6, cap feasibility at 3 and flag INFEASIBLE.

Guardrail: Do not over-optimize proxy scores. Audit whether higher ranked behaviors still causally resolve the validated problem.

1. Impact Assessment #

Question: If users perform this behavior, how much value is created?

Sub-factors:

impact_factors:
  problem_resolution:
    weight: 0.4
    question: "How completely does this behavior solve the validated problem?"
    scoring:
      0-3: "Minimal problem resolution"
      4-6: "Partial problem resolution"
      7-10: "Complete problem resolution"
  
  value_creation:
    weight: 0.3
    question: "What's the economic/social value per behavior instance?"
    scoring:
      0-3: "Low value (<$10 or minor benefit)"
      4-6: "Moderate value ($10-100 or significant benefit)"
      7-10: "High value (>$100 or transformative benefit)"
  
  network_effects:
    weight: 0.2
    question: "Does this behavior influence others to act?"
    scoring:
      0-3: "Individual only"
      4-6: "Influences 1-2 others"
      7-10: "Influences many others"
  
  sustainability:
    weight: 0.1
    question: "Does impact persist after behavior stops?"
    scoring:
      0-3: "Impact ends immediately"
      4-6: "Impact lasts days/weeks"
      7-10: "Impact lasts months/years"

2. Feasibility Analysis #

Question: Can target users realistically perform this behavior?

BSM-Based Assessment:

def assess_feasibility(behavior, user_segment):
    """
    Evaluate feasibility using Behavioral State Model
    """
    bsm_scores = {
        'ability_match': assess_ability_requirements(behavior, user_segment),
        'motivation_fit': assess_motivation_alignment(behavior, user_segment),
        'environmental_support': assess_context_compatibility(behavior, user_segment),
        'perception_alignment': assess_belief_compatibility(behavior, user_segment)
    }
    
    # Minimum component rule
    min_score = min(bsm_scores.values())
    
    if min_score < 6:
        return {
            'feasibility_score': 3,  # cap when below feasibility floor
            'verdict': 'INFEASIBLE',
            'blocker': min(bsm_scores, key=bsm_scores.get),
            'recommendation': 'Address blocker or choose different behavior'
        }
    
    # Weighted average for feasible behaviors
    weights = {
        'ability_match': 0.35,
        'motivation_fit': 0.25,
        'environmental_support': 0.25,
        'perception_alignment': 0.15
    }
    
    feasibility = sum(bsm_scores[k] * weights[k] for k in bsm_scores)
    
    return {
        'feasibility_score': feasibility,
        'verdict': 'FEASIBLE' if feasibility > 6 else 'CHALLENGING',
        'improvement_areas': [k for k, v in bsm_scores.items() if v < 7]
    }

3. Strategic Alignment #

Question: Does this behavior advance our strategic objectives?

Alignment Matrix:

| Strategic Objective | Behavior Contribution | Score |
|-------------------|---------------------|--------|
| User Acquisition | New users attracted by behavior | 0-10 |
| User Retention | Behavior creates stickiness | 0-10 |
| Revenue Generation | Direct monetization potential | 0-10 |
| Brand Building | Behavior enhances brand | 0-10 |
| Competitive Advantage | Unique/defensible behavior | 0-10 |

The Ranking Process #

Step 1: Behavior Inventory #

Create comprehensive list of candidate behaviors:

behavior_inventory:
  - behavior_1:
      name: "Daily progress tracking"
      description: "User logs progress once per day"
      current_adoption: "12% do this naturally"
      required_effort: "2 minutes/day"
      
  - behavior_2:
      name: "Weekly planning session"
      description: "User plans upcoming week"
      current_adoption: "5% do this naturally"
      required_effort: "30 minutes/week"
      
  - behavior_3:
      name: "Share achievement"
      description: "User shares success with network"
      current_adoption: "22% do this naturally"
      required_effort: "1 minute per achievement"

Step 2: Multi-Criteria Scoring #

Score each behavior systematically:

class BehaviorRanker:
    def __init__(self, strategic_weights=None):
        self.strategic_weights = strategic_weights or {
            'acquisition': 0.3,
            'retention': 0.4,
            'revenue': 0.2,
            'brand': 0.1
        }
    
    def rank_behaviors(self, behaviors, user_segment):
        """
        Rank behaviors by combined score
        """
        scored_behaviors = []
        
        for behavior in behaviors:
            # Calculate three core dimensions
            impact = self.calculate_impact(behavior)
            feasibility = self.calculate_feasibility(behavior, user_segment)
            alignment = self.calculate_alignment(behavior, self.strategic_weights)
            
            # Combined score (geometric mean)
            combined_score = (impact * feasibility * alignment) ** (1/3)
            
            # Confidence based on data quality
            confidence = self.assess_confidence(behavior)
            
            scored_behaviors.append({
                'behavior': behavior,
                'scores': {
                    'impact': impact,
                    'feasibility': feasibility,
                    'alignment': alignment,
                    'combined': combined_score
                },
                'confidence': confidence,
                'rank': None  # Set after sorting
            })
        
        # Sort by combined score
        scored_behaviors.sort(key=lambda x: x['scores']['combined'], reverse=True)
        
        # Assign ranks
        for i, sb in enumerate(scored_behaviors):
            sb['rank'] = i + 1
        
        return scored_behaviors

Legacy Criteria Crosswalk (Overview Article) #

For teams familiar with the original article rubric, the legacy criteria map into the framework above as follows:

Legacy criterion Where it maps now
Compelling (exciting) Motivation fit (Feasibility) and early value (Impact/value_creation)
Reasonable (not strange) Perception alignment (Feasibility) and social acceptability
Socially acceptable Social environment (Feasibility) and brand/competitive alignment (Strategic)
Physically simple Ability match (Feasibility) and TTFB friction (Impact via completion)
Cognitively simple Ability/perception alignment (Feasibility) and path complexity (TTFB)
Expensive (reverse) Environmental support and value/economics (Impact + Strategic)
Rewarding Early value and reinforcement (Impact/value_creation, retention potential)
Useful (solves problem) Problem resolution (Impact)
Impactful Aggregate Impact dimension

You can keep using the legacy checklist as a sanity check; the current framework simply collapses it into Impact, Feasibility (BSM-based), and Strategic Alignment for consistency and scoring reliability.

Step 3: Sensitivity Analysis #

Test how robust rankings are:

# Runnable example
import numpy as np
from collections import defaultdict
import copy
rng = np.random.default_rng(42)

def add_measurement_noise(behaviors, std=0.5):
    noisy = copy.deepcopy(behaviors)
    for b in noisy:
        for k in ['impact','feasibility','alignment']:
            b[k] = max(0, min(10, b[k] + rng.normal(0, std)))
    return noisy

def rank_behaviors(behaviors):
    out = []
    for b in behaviors:
        combined = (b['impact'] * b['feasibility'] * b['alignment']) ** (1/3)
        out.append({**b, 'combined': combined})
    out.sort(key=lambda x: x['combined'], reverse=True)
    for i, b in enumerate(out): b['rank'] = i+1
    return out

def sensitivity_analysis(behaviors, variations=100):
    """
    Monte Carlo simulation of ranking stability
    """
    rank_distributions = defaultdict(list)
    for _ in range(variations):
        noisy_behaviors = add_measurement_noise(behaviors, std=0.5)
        rankings = rank_behaviors(noisy_behaviors)
        for behavior in rankings:
            rank_distributions[behavior['name']].append(behavior['rank'])
    stability_report = {}
    for behavior, ranks in rank_distributions.items():
        stability_report[behavior] = {
            'mean_rank': float(np.mean(ranks)),
            'rank_std': float(np.std(ranks)),
            'rank_range': (min(ranks), max(ranks)),
            'top_3_probability': sum(r <= 3 for r in ranks) / len(ranks)
        }
    return stability_report

Step 4: Behavioral Dependencies #

Consider behavior chains and prerequisites:

graph TD
    A[Account Creation] -->|Enables| B[Profile Completion]
    B -->|Enables| C[First Post]
    C -->|Enables| D[Community Engagement]
    D -->|Enables| E[Sustained Behavior]
    
    A -.->|Also Enables| C
    B -.->|Influences| D

Dependency Analysis:

def analyze_dependencies(behaviors):
    """
    Identify behavioral prerequisites and sequences
    """
    dependency_graph = {}
    
    for behavior in behaviors:
        dependencies = {
            'hard_prerequisites': [],  # Must happen first
            'soft_prerequisites': [],  # Helpful but not required
            'enables': [],            # This behavior enables others
            'reinforces': []          # Mutual reinforcement
        }
        
        # Example logic
        if behavior['name'] == 'daily_tracking':
            dependencies['hard_prerequisites'] = ['account_setup', 'initial_goal']
            dependencies['enables'] = ['weekly_review', 'streak_building']
            dependencies['reinforces'] = ['motivation_maintenance']
        
        dependency_graph[behavior['name']] = dependencies
    
    return optimize_behavior_sequence(dependency_graph)

Selection Decision Matrix #

The 2x2 Prioritization Grid #

High Impact ┃ Quick Wins       │ Strategic Priorities
           ┃ (Do second)      │ (Do first)
           ┃                  │
           ┣━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━
           ┃ Questionable     │ Stepping Stones
Low Impact ┃ (Usually skip)   │ (Do if enables priority)
           ┃                  │
           ┗━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━
             Low Feasibility    High Feasibility

Selection Rules #

  1. Always Start with One: Focus beats dilution
  2. High Feasibility First: Build momentum with wins
  3. Address Dependencies: Enable before requiring
  4. Test Assumptions: Pilot before full rollout
  5. Monitor Cannibalization: Don’t compete with yourself

Advanced Selection Techniques #

Machine Learning Prediction #

import pandas as pd  # required for the example below
from sklearn.ensemble import RandomForestRegressor

def ml_behavior_prediction(historical_data):
    """
    Use ML to predict behavior success
    """
    # Features: behavior characteristics
    features = historical_data[[
        'complexity_score',
        'time_requirement',
        'social_component',
        'immediate_reward',
        'ability_requirement',
        'motivation_type'
    ]]
    
    # Target: actual adoption rate
    target = historical_data['adoption_success']
    
    # Train model
    model = RandomForestRegressor(n_estimators=100)
    model.fit(features, target)
    
    # Feature importance
    importance = pd.DataFrame({
        'feature': features.columns,
        'importance': model.feature_importances_
    }).sort_values('importance', ascending=False)
    
    return model, importance

Portfolio Optimization #

Select behavior portfolio for maximum impact:

from scipy.optimize import minimize

def optimize_behavior_portfolio(behaviors, constraints=None):
    """
    Select optimal mix of behaviors given constraints
    """
    n_behaviors = len(behaviors)
    
    # Objective: maximize total impact
    def objective(weights):
        total_impact = sum(
            w * b['impact'] * b['feasibility'] 
            for w, b in zip(weights, behaviors)
        )
        return -total_impact  # Minimize negative
    
    # Constraints
    cons = [
        {'type': 'eq', 'fun': lambda w: sum(w) - 1},  # Weights sum to 1
        {'type': 'ineq', 'fun': lambda w: w}          # Non-negative
    ]
    
    # Bounds
    bounds = [(0, 1) for _ in range(n_behaviors)]
    
    # Initial guess
    initial = [1/n_behaviors] * n_behaviors
    
    # Optimize
    result = minimize(objective, initial, method='SLSQP', 
                      bounds=bounds, constraints=cons)
    
    # Return portfolio
    portfolio = [
        {'behavior': b, 'allocation': w}
        for b, w in zip(behaviors, result.x)
        if w > 0.05  # 5% threshold
    ]
    
    return sorted(portfolio, key=lambda x: x['allocation'], reverse=True)

Common Selection Mistakes #

Mistake 1: Complexity Bias #

Wrong: Choose the most sophisticated behavior Right: Choose the simplest behavior that solves the problem

Mistake 2: Ignoring Prerequisites #

Wrong: Jump to ideal end-state behavior Right: Build stepping stones to target behavior

Mistake 3: Perfect Information Paralysis #

Wrong: Wait for complete data before selecting Right: Make best guess, test quickly, iterate

Mistake 4: Kitchen Sink Approach #

Wrong: Target many behaviors simultaneously Right: Master one behavior before adding more

Behavior Selection Checklist #

Before finalizing selection, verify:

  • Problem-Behavior Fit: Does this behavior actually solve the validated problem?
  • User Capability: Can >50% of target users perform this with minimal training?
  • Measurement Plan: Can we reliably measure if behavior occurs?
  • Intervention Ideas: Do we have 3+ ways to enable this behavior?
  • Failure Recovery: If this behavior fails, what’s Plan B?
  • Ethical Screen: Behavior promotes user welfare and avoids coercion
  • Competitive Analysis: Are others already “owning” this behavior?

Templates and Tools #

Behavior Ranking Spreadsheet Template #

Behavior Impact (0-10) Feasibility (0-10) Alignment (0-10) Combined Score Confidence Rank
Daily Check-in 7 9 8 8.0 High 1
Weekly Planning 9 5 7 6.7 Medium 2
Peer Sharing 6 8 6 6.6 High 3

Decision Documentation Example #

## Behavior Selection Decision

**Date**: January 15, 2026
**Selected Behavior**: Daily check-in
**Decision Makers**: Product Lead, Research Lead, Behavioral Strategy

### Rationale
- Impact Score: 7/10 because daily check-ins predict week-4 retention in prior cohorts.
- Feasibility Score: 9/10 because the action takes under a minute and fits existing routines.  
- Alignment Score: 8/10 because it reinforces the core value proposition.

### Alternatives Considered
1. Weekly Planning - Rejected because setup time is high for new users.
2. Peer Sharing - Rejected because it depends on network effects we don’t yet have.

### Success Criteria
- Adoption target: steady adoption within the first week of onboarding.
- Frequency target: at least three check-ins per week per active user.
- Quality target: check-ins include the required context fields.

### Risk Mitigation
- Risk: novelty-driven check-ins fade after week 2 → Mitigation: rotate prompts and reduce friction in the flow.

Next Steps #

Frequently asked questions #

What is behavior ranking? #

Behavior ranking is a structured way to compare candidate behaviors before you build. It scores each behavior on impact, feasibility (for a real population in real context), and strategic alignment.

How is ranking different from choosing a target behavior? #

Ranking is the comparison method. Choosing the target behavior is the decision. Behavioral Strategy makes that decision explicit and evidence-based before solution design.

What is the most common mistake? #

Ranking proxy behaviors (clicks, opens, intent) instead of the behavior that causally produces the outcome. If the top-ranked behavior is not causal, you optimized the wrong thing.

What if all candidate behaviors are infeasible? #

Do not force it. Generate new candidates, change the population/context constraints, or choose a different outcome. If the behavior cannot clear feasibility thresholds, design work will not rescue it.

How do I handle dependencies in behavior chains? #

Rank the whole chain rather than a single step. If a prerequisite step is infeasible, the downstream behavior will not scale; enable the weakest step first.

Licensing #

Content © Jason Hreha. Text licensed under CC BY-NC-SA 4.0 unless a more specific asset notice applies. Framework names may be used accurately without implying endorsement.


← Back to Methodology