|
| 1 | +# ============================================================ |
| 2 | +# Recovery Strategy Matrix |
| 3 | +# ============================================================ |
| 4 | +# This file defines the rules the recovery agent applies to each |
| 5 | +# lost opportunity and abandoned cart. EDIT THIS FILE to tune the |
| 6 | +# agent's behavior — no skill code changes needed. |
| 7 | +# |
| 8 | +# Sections: |
| 9 | +# 1. value_tiers — lost value thresholds that bucket leads/carts |
| 10 | +# 2. recency_tiers — days-since-event thresholds (freshness) |
| 11 | +# 3. lost_opportunity_matrix — rules for leads who never completed signup |
| 12 | +# 4. abandoned_cart_matrix — rules for visitors who started checkout but left |
| 13 | +# |
| 14 | +# Rule evaluation: |
| 15 | +# - Rules in each matrix are evaluated TOP-TO-BOTTOM. |
| 16 | +# - The FIRST rule whose `match` clause is satisfied wins. |
| 17 | +# - Always end each matrix with a catch-all rule (match: {}) so |
| 18 | +# every record gets a recommendation. |
| 19 | +# ============================================================ |
| 20 | + |
| 21 | +# ---------------------------------------------------------------- |
| 22 | +# 1. Value tiers — potential/cart value buckets |
| 23 | +# ---------------------------------------------------------------- |
| 24 | +# Bucket is determined by the `lost_value` field (annual or monthly |
| 25 | +# contract value, whichever is available). Currency: USD (or your |
| 26 | +# org's base currency — keep consistent). |
| 27 | +value_tiers: |
| 28 | + high: { min: 1000 } # ≥ $1,000 ACV |
| 29 | + medium: { min: 200, max: 1000 } # $200 – $999 ACV |
| 30 | + low: { max: 200 } # < $200 ACV |
| 31 | + |
| 32 | +# ---------------------------------------------------------------- |
| 33 | +# 2. Recency tiers — how fresh the event is |
| 34 | +# ---------------------------------------------------------------- |
| 35 | +# Fresh leads respond much better. The sooner we act the higher the |
| 36 | +# recovery rate — recency is therefore the primary sort key. |
| 37 | +recency_tiers: |
| 38 | + fresh: { max_days: 2 } # ≤ 2 days ago — highest urgency |
| 39 | + recent: { max_days: 7 } # 3–7 days ago — still warm |
| 40 | + cold: { min_days: 7 } # > 7 days ago — harder to recover |
| 41 | + |
| 42 | +# ---------------------------------------------------------------- |
| 43 | +# 3. Lost Opportunity matrix |
| 44 | +# ---------------------------------------------------------------- |
| 45 | +# Rules for prospects who expressed intent (e.g., started a trial, |
| 46 | +# reached the pricing page, or began onboarding) but never converted. |
| 47 | +# These leads have lower intent than abandoned-cart but still |
| 48 | +# warrant proactive outreach. |
| 49 | +# |
| 50 | +# Each rule has: |
| 51 | +# match: — conditions that must ALL be true (AND semantics). |
| 52 | +# Fields: value (tier name), recency (tier name). |
| 53 | +# Omit a field to mean "any value". |
| 54 | +# action: — one of: human_outreach, email_with_discount, |
| 55 | +# email_reminder, email_sequence, accept |
| 56 | +# params: — action-specific parameters |
| 57 | +# rationale: — shown in the proposal so reviewers understand why |
| 58 | +lost_opportunity_matrix: |
| 59 | + |
| 60 | + # -- High value, very fresh — personal touch wins -- |
| 61 | + - match: { value: high, recency: fresh } |
| 62 | + action: human_outreach |
| 63 | + params: { route_to: "Sales", priority: urgent, contact_within_hours: 4 } |
| 64 | + rationale: "High-value lead lost <2 days ago — Sales should reach out personally within 4 hours while intent is highest" |
| 65 | + |
| 66 | + # -- High value, still warm — strong incentive email -- |
| 67 | + - match: { value: high, recency: recent } |
| 68 | + action: email_with_discount |
| 69 | + params: { discount_percent: 20, coupon_duration_months: 3, expiry_hours: 48 } |
| 70 | + rationale: "High-value lead cooling off — 20% welcome-back discount with a 48-hour urgency window" |
| 71 | + |
| 72 | + # -- Medium value, fresh — move fast with a mid-tier offer -- |
| 73 | + - match: { value: medium, recency: fresh } |
| 74 | + action: email_with_discount |
| 75 | + params: { discount_percent: 15, coupon_duration_months: 2, expiry_hours: 72 } |
| 76 | + rationale: "Mid-value fresh lead — 15% discount email before they forget" |
| 77 | + |
| 78 | + # -- Medium value, recent — nurture sequence -- |
| 79 | + - match: { value: medium, recency: recent } |
| 80 | + action: email_sequence |
| 81 | + params: { sequence: "lost_opportunity_nurture", steps: 3, cadence_days: [0, 3, 7] } |
| 82 | + rationale: "Mid-value lead gone quiet — 3-step nurture sequence (day 0, 3, 7) with value messaging" |
| 83 | + |
| 84 | + # -- Low value, any recency — lightweight automated flow -- |
| 85 | + - match: { value: low } |
| 86 | + action: email_sequence |
| 87 | + params: { sequence: "standard_recovery", steps: 2, cadence_days: [0, 5] } |
| 88 | + rationale: "Low-value lead — standard 2-step automated recovery sequence" |
| 89 | + |
| 90 | + # -- Catch-all -- |
| 91 | + - match: {} |
| 92 | + action: email_sequence |
| 93 | + params: { sequence: "standard_recovery", steps: 2, cadence_days: [0, 5] } |
| 94 | + rationale: "Default recovery: standard 2-step email sequence" |
| 95 | + |
| 96 | +# ---------------------------------------------------------------- |
| 97 | +# 4. Abandoned Cart matrix |
| 98 | +# ---------------------------------------------------------------- |
| 99 | +# Rules for visitors who reached checkout, added a plan to their cart, |
| 100 | +# and left without completing payment. These are the highest-intent |
| 101 | +# prospects — a small nudge often converts them. |
| 102 | +# |
| 103 | +# Prioritize these above lost opportunities of equivalent value because |
| 104 | +# the barrier to recovery is lower (they know the product, they chose |
| 105 | +# a plan — they just didn't click Pay). |
| 106 | +abandoned_cart_matrix: |
| 107 | + |
| 108 | + # -- High value, very fresh — call them now -- |
| 109 | + - match: { value: high, recency: fresh } |
| 110 | + action: human_outreach |
| 111 | + params: { route_to: "Sales", priority: urgent, contact_within_hours: 2 } |
| 112 | + rationale: "High-value cart abandoned <2 days — immediate personal outreach; they were seconds from buying" |
| 113 | + |
| 114 | + # -- High value, still warm — urgency discount -- |
| 115 | + - match: { value: high, recency: recent } |
| 116 | + action: email_with_discount |
| 117 | + params: { discount_percent: 15, expiry_hours: 48, include_cart_contents: true } |
| 118 | + rationale: "High-value cart cooling — 15% off with 48-hour timer and cart contents reminder" |
| 119 | + |
| 120 | + # -- Medium value, fresh — strong reminder, no discount needed -- |
| 121 | + - match: { value: medium, recency: fresh } |
| 122 | + action: email_reminder |
| 123 | + params: { include_cart_contents: true, urgency: high, expiry_hours: 24 } |
| 124 | + rationale: "Mid-value fresh abandon — cart reminder with urgency; try without discount first" |
| 125 | + |
| 126 | + # -- Medium value, recent — add a small incentive -- |
| 127 | + - match: { value: medium, recency: recent } |
| 128 | + action: email_with_discount |
| 129 | + params: { discount_percent: 10, expiry_hours: 72, include_cart_contents: true } |
| 130 | + rationale: "Mid-value cart going cold — 10% nudge with cart contents and time pressure" |
| 131 | + |
| 132 | + # -- Low value, any recency — simple reminder -- |
| 133 | + - match: { value: low } |
| 134 | + action: email_reminder |
| 135 | + params: { include_cart_contents: true, urgency: normal } |
| 136 | + rationale: "Low-value abandoned cart — standard cart reminder email" |
| 137 | + |
| 138 | + # -- Catch-all -- |
| 139 | + - match: {} |
| 140 | + action: email_reminder |
| 141 | + params: { include_cart_contents: true, urgency: normal } |
| 142 | + rationale: "Default: cart contents reminder email" |
0 commit comments