Quick Glossary
Use these definitions before working through the model.
- Stream: a fundraising strategy bucket (Renewal, Reactivation, Acquisition, Mid-Level Conversion).
- Tier: a spend segment within a stream with its own capacity and return rate.
- Tier capacity: the maximum spend allowed in that tier before moving to the next tier.
- Strategic marginal return: value per dollar in a tier after combining current-year, lifetime, and terminal components.
- Current-year value: expected value recognized in the active fiscal year.
- Lifetime value contribution: discounted expected value from future years within the selected forecast horizon.
- Terminal value contribution: discounted residual value after the forecast horizon.
- Donor-year state table: one row per donor per fiscal year used to track movement between active, lapsed, and reactivated states.
- Reactivated donor: a donor who gives this year after a lapse period.
- Mid-Level Conversion: high-value upgrade asks among retained donors in the highest mass giving tier before the mid-level giving.
- Cost-ratio headroom: linear check used by Solver to enforce the cost-ratio policy.
- Certificate gap: difference between Solver result and certified best feasible solution.
1. The Planning Problem: One Budget, Four Strategic Streams
Fundraising leaders often face a conflicting choice in annual planning:
- maximize this-year cash,
- or protect future file health.
The current-year strategic model resolves that trade-off by optimizing one annual budget across four streams:
- Renewal
- Reactivation
- Acquisition
- Mid-Level Conversion
Unlike a short-horizon model, this framework does not treat acquisition as automatically weak. It evaluates each stream using current-year value plus future value components.
2. Why Last-Year-Plus-Optimism Is Still Insufficient
Most teams still build annual plans by applying small percentage changes to last year. That approach misses three things:
- Diminishing returns by spend tier.
- Stream dependencies (for example, Mid-Level Conversion depth depends on renewal base strength).
- Strategic future value from reactivation and acquisition.
If those effects are not explicit in the model, portfolio recommendations default to near-term bias.
3. Enabling Solver in Excel Desktop and Microsoft 365
This section is required before any optimization run.
Excel Desktop (Windows)
- Open Excel.
- Go to File > Options > Add-ins.
- At the bottom, in Manage, choose Excel Add-ins and click Go.
- Check Solver Add-in.
- Click OK.
- Confirm Solver appears on the Data ribbon, usually in the Analysis group.
If Solver does not appear:
- Repeat steps above and verify Solver Add-in remains checked.
- Restart Excel.
- Confirm the workbook is not in Protected View.
Excel for Microsoft 365
If you are using the desktop Microsoft 365 app, use the same steps as above.
If you are using Excel on the web:
- Open the workbook in the desktop app if you need native Solver Add-in behavior.
- Solver functionality and add-in availability can vary by tenant policy and environment.
Recommended practice for this model:
- Run Solver in desktop Excel for full compatibility with range constraints and Simplex LP settings.
4. What Data to Export from Raisers Edge NXT
To go from source system to optimization tiers, export enough data to reconstruct donor-state transitions and stream-level economics.
Gift-level export fields
- Constituent ID
- Gift Date
- Gift Amount
- Campaign
- Appeal
- Package or Source Code (if available)
- Gift Type
- Payment Method
Recommended additional operational fields for database teams:
- Gift ID (or transaction ID) for deduplication.
- Appeal Channel (if not encoded in campaign or source code).
- Revenue recognition date if different from gift date (i.e. Gift GL Post Date)
Constituent-level export fields
- Constituent ID
- First Gift Date
- Last Gift Date
- Lifetime Giving
- Largest Gift
- Segment or status fields used in your organization
- Opt-in and contactability fields by channel
Minimum contactability fields to include explicitly:
- Email opt-in or do-not-email.
- Do-not-mail.
- Do-not-call.
- No-solicit.
- Deceased.
Time horizon
- Preferred: 3 to 5 fiscal years.
- Minimum: 1 full fiscal year plus current-year YTD.
5. Cleaning and Structuring Data for Stream Logic
Before estimating returns, build clean donor-year and stream summaries.
Step 1: Normalize raw records
- Assign fiscal year consistently.
- Standardize donor identifiers.
- Flag exclusions (soft credits, irreconcilable anonymous rows, and invalid gift types per policy).
Typical invalid gift types for annual-fund optimization (confirm with your finance policy):
- Pledges not yet paid.
- In-kind gifts.
- Bequests.
- Internal transfers.
- Write-offs or reversals.
Detailed execution checklist (Phase B.1):
- Create a
FiscalYearfield using your organization’s fiscal start month. - Create a normalized donor key, for example
DonorKey = UPPER(TRIM(ConstituentID)). - Create a unique transaction key, for example
TxnKey = DonorKey + GiftID + GiftDate. - Remove exact duplicates by
TxnKey. - Add
ExcludeFlagwith explicit reasons (INVALID_TYPE,SOFT_CREDIT,ANONYMOUS_UNMATCHED,REVERSAL). - Keep excluded rows in an audit table; do not hard-delete without trace.
Useful fiscal-year formula pattern (Excel):
- If fiscal year starts in July:
=IF(MONTH(GiftDate)>=7,YEAR(GiftDate)+1,YEAR(GiftDate)).
QA checks before continuing:
- No null
DonorKeyvalues. - No future-dated gifts unless explicitly allowed.
- Sum of included + excluded gross equals raw gross total.
Step 2: Build donor-year state table
Create one row per donor per fiscal year with:
- opening state ( donor status on first day of the fiscal year),
- contact volume,
- response indicator,
- closing state ( donor status on the last day of the fiscal year),
- stream touch indicators.
Clarification: stream touch indicators
- Stream touch indicators are binary fields that show whether a donor was exposed to a stream in that fiscal year, regardless of whether they gave.
- Typical fields are
Touched_Renewal,Touched_Reactivation,Touched_Acquisition,Touched_MidLevel. - Use
1when at least one eligible touch occurred in that stream-year, otherwise0. - Keep channel-level detail in source tables; these indicators are the modeling layer summary.
- A donor can have multiple touch indicators = 1 in the same year if your operating model allows multi-stream contact.
Use explicit state codes to make joins and QA easier:
- New (first gift this FY).
- Active (gave in current or immediately prior FY).
- Lapsed-1Y (no gift this FY, gave last FY).
- Lapsed-2Y+ (no gift for 2 or more FYs).
- Reactivated (gave this FY after lapse period).
Detailed execution checklist (Phase B.2):
- Aggregate gifts to one row per donor per fiscal year.
- Create donor-year features:
FYGross: sum of included gift amount in that FY.GiftCount: number of included gifts in that FY.RespondedFlag: 1 ifFYGross > 0, else 0.PriorFYRespondedFlag: prior-year response status.YearsSinceLastGift: integer gap from most recent prior gift year.- Derive
OpeningStatefrom prior-year status. - Derive
ClosingStatefrom current-year response outcome. - Tag stream touches (
Touched_Renewal,Touched_Reactivation,Touched_Acquisition,Touched_MidLevel).
Suggested state assignment logic:
- Opening
Activeif prior FY responded. - Opening
Lapsed-1Yif no gift in prior FY but gift in FY-2. - Opening
Lapsed-2Y+if no gift for 2+ FY. - Closing
Reactivatedif opening is lapsed and current FY responded. - Closing
Newif first-ever gift occurs this FY.
QA checks before continuing:
- Exactly one donor-year row per
(DonorKey, FiscalYear). - State transition matrix has no impossible transitions by policy.
RespondedFlag=1always impliesFYGross>0.
Step 3: Build stream performance summary
For each stream and year, calculate:
- contacts,
- responses,
- response rate,
- average response value,
- gross revenue,
- cost,
- gross return per dollar.
Detailed execution checklist (Phase B.3):
- Create one summary row per
(FiscalYear, Stream). - Compute
Contactsfrom campaign activity tables (or stream-touch records). - Compute
Responsesas distinct donors with responded gifts in that stream-year. - Compute
ResponseRate = Responses / Contacts. - Compute
AverageResponseValue = GrossRevenue / Responses. - Compute
GrossReturnPerDollar = GrossRevenue / Cost. - Create 3-year trailing averages for each KPI.
- Flag outliers where stream-year KPI deviates from trailing average beyond tolerance.
Clarification: 3-year trailing averages for each KPI
- For each
(Stream, FiscalYear), compute the average of the prior three completed fiscal years for the same KPI. - Example for FY2026 response rate: average of FY2023, FY2024, FY2025 response rates.
- Do not include the current year in its own trailing average.
- If fewer than 3 prior years exist, use available years and set a low-confidence flag.
Clarification: outlier flagging by trailing tolerance
- Define tolerance policy per KPI before analysis (for example plus/minus 20 percent relative difference, or plus/minus 2 standard deviations).
- Relative-difference pattern:
DeviationPct = (CurrentKPI - TrailingAvgKPI) / TrailingAvgKPI.- Flag outlier when
ABS(DeviationPct) > TolerancePct. - For near-zero denominators, switch to absolute thresholds to avoid unstable percentages.
Recommended minimum output table columns:
FiscalYearStreamContactsResponsesResponseRateGrossRevenueCostGrossReturnPerDollarDataQualityFlag
Clarification: DataQualityFlag
DataQualityFlagis a compact status label that marks whether a row is reliable for calibration.- Suggested values:
OK,LOW_VOLUME,MISSING_COST,OUTLIER_KPI,INCOMPLETE_YEAR,MANUAL_REVIEW. - Keep the flag rule-based and reproducible; avoid free-text where possible.
- Use this field to exclude or down-weight rows in tier estimation.
Compact worked example (single stream-year row)
Use this template to make the logic concrete for reviewers:
| FiscalYear | Stream | KPI | CurrentKPI | TrailingAvg3Y | TolerancePct | DeviationPct | OutlierFlag | DataQualityFlag |
|---|---|---|---|---|---|---|---|---|
| 2026 | Reactivation | GrossReturnPerDollar | 1.20 | 1.50 | 20% | -20.0% | No | OK |
Calculation notes for the row above:
DeviationPct = (1.20 - 1.50) / 1.50 = -0.20 = -20.0%.- With rule
ABS(DeviationPct) > 20%, this is not flagged because it equals, not exceeds, tolerance. - If your policy is
>= 20%, then this same row would be flagged as an outlier.
Tier-calibration companion example:
| Stream | Tier | CurrentYearValuePerDollar | VolumeSupport | MinSupportRule | OverrideFlag | OverrideReason |
|---|---|---|---|---|---|---|
| Reactivation | Tier 3 | 1.18 | 42 | 50 | 1 | Raised to Tier 2 floor after low-volume instability review |
How to interpret the companion row:
VolumeSupport=42is below the minimum rule of 50 observations.- Because support is low, the raw estimate is treated as unstable.
OverrideFlag=1records that a governed manual adjustment was applied.- Store approver, date, and method note in your audit log for traceability.
6. Defining the Four Streams in This Model
Renewal
Purpose:
- protect active-base current-year revenue.
Reactivation
Purpose:
- recover lapsed donors with meaningful future value carryover.
Acquisition
Purpose:
- add first-time or re-entered donors,
- build future file capacity.
Mid-Level Conversion
Purpose:
- increase value to mid-level giving among stronger retained donors,
- deliver high incremental current-year contribution under capacity limits.
7. Converting Historical Economics into Four Tiers per Stream
Use a piecewise-linear structure for each stream:
- Tier 1: highest productivity segment.
- Tier 2: strong but broader segment.
- Tier 3: moderate productivity segment.
- Tier 4: marginal segment.
Detailed execution checklist (Phase C):
- For each stream, define segmentation units used for ranking (for example audience bands, channel cohorts, recency bands, or list-quality groups).
- Compute historical productivity metric for each unit (recommended: gross return per dollar, plus supporting response and average value).
- Sort units from highest to lowest productivity within stream.
- Assign units sequentially into Tier 1 to Tier 4 so each tier remains operationally executable.
- Sum unit-level reachable spend into
TierCapacity. - Estimate tier-level
CurrentYearValuePerDollarfrom weighted historical outcomes. - Estimate
LifetimeValueContributionusing retained-value forecasts by stream. - Estimate
TerminalValueContributionusing your residual-value method. - Calculate
StrategicMarginalReturnfor each tier. - Validate monotonicity: Tier 1 >= Tier 2 >= Tier 3 >= Tier 4.
Clarification: estimate CurrentYearValuePerDollar from weighted historical outcomes
- Start at unit level inside each tier:
UnitCurrentValuePerDollar = UnitGrossRevenue / UnitCost(or your approved net-value variant). - Weight each unit by its economic scale, typically historical cost or contact volume.
- Tier estimate:
CurrentYearValuePerDollar_tier = SUM(UnitMetric * UnitWeight) / SUM(UnitWeight).- Use the same weighting basis across all tiers for comparability.
- Require minimum sample support before accepting the estimate; otherwise mark for override review.
If monotonicity fails:
- Recheck segment assignment boundaries.
- Pool unstable low-volume segments.
- Apply conservative smoothing to enforce descending returns.
- Document any manual overrides.
Practical ranking metric guidance:
- Primary metric:
GrossReturnPerDollar. - Tie-breaker 1: higher response rate stability.
- Tie-breaker 2: larger reachable capacity.
- Tie-breaker 3: lower year-to-year volatility.
Each tier must have:
- spend capacity,
- current-year value per dollar,
- lifetime value contribution per dollar,
- terminal value contribution per dollar.
How to estimate these terms so they are reproducible:
- Current-year value: modeled gross return in the active fiscal year.
- Lifetime value contribution: discounted expected future gross value over a defined horizon (for example 3 years).
- Terminal value contribution: residual value beyond the modeled horizon, expressed as a single discounted value.
Document these global assumptions in your planning notes:
- forecast horizon in years,
- discount rate,
- retention and migration assumptions,
- data vintage used for estimation.
Recommended calibration output table (per stream-tier):
StreamTierTierCapacityCurrentYearValuePerDollarLifetimeValueContributionTerminalValueContributionStrategicMarginalReturnVolumeSupport(historical observation count)OverrideFlag
Clarification: VolumeSupport and OverrideFlag
VolumeSupportis the number of historical observations underlying the tier estimate.- Define observation consistently, for example donor-year rows, campaign cells, or segment-year rows.
- Use minimum thresholds by stream-tier; below threshold means low statistical confidence.
OverrideFlagindicates the tier value was manually adjusted from its raw empirical estimate.- Suggested values:
0(no override) and1(override applied). - When
OverrideFlag=1, store reason, approver, and timestamp in a companion audit table.
Strategic marginal return per tier is:
Strategic Marginal Return = Current-Year Value + Lifetime Value + Terminal Value
Rendering note:
- Some Markdown renderers do not fully support LaTeX text commands like
\text{...}. - This guide uses a plain equation format here so it renders consistently across editors and exports.
This is the key mechanism that keeps acquisition competitive in a current-year model.
Plain-language interpretation:
- a dollar in acquisition may return less this year,
- but if that donor renews and upgrades later, total strategic value can exceed short-term-only options.
8. Workbook Structure and Where to Enter or Review Inputs
Workbook:
outputs/current_year_four_stream_strategic_solver_20260709/Current_Year_Four_Stream_Strategic_Solver.xlsx
Conference-style tabs:
- Conference Guide
- Scenario Inputs
- Revenue Curves
- Base LP
- Conservative LP
- Growth LP
- Stress LP
- Scenario Summary
- Optimality Certificate
- Solver Setup
Where to focus first:
- Scenario Inputs for budgets, limits, stream multipliers.
- Revenue Curves for tier capacities and strategic marginal returns.
- Scenario LP sheet for Solver execution.
Multiplier rule (to avoid ambiguity):
- each scenario stream multiplier applies to the full strategic marginal return for that stream tier, not only to current-year value.
How scenario-specific return curves are built
Use this sequence for every (Stream, Tier) row in Revenue Curves:
- Start with calibrated components:
Current-Year ValueLifetime ValueTerminal Value- Compute base return:
Base Strategic Return = Current-Year Value + Lifetime Value + Terminal Value.- Pull scenario multiplier by stream from
Scenario Inputs. - Compute scenario return columns:
Conservative Return = Base Strategic Return * ConservativeMultiplier(stream)Growth Return = Base Strategic Return * GrowthMultiplier(stream)Stress Return = Base Strategic Return * StressMultiplier(stream)- Keep tier capacities unchanged unless your scenario policy explicitly changes capacity.
Example from your worksheet pattern
- Renewal Tier 1 shows
Current-Year=3.8,Lifetime=0.6,Terminal=0.2. - So
Base Strategic Return = 3.8 + 0.6 + 0.2 = 4.6. - Scenario values imply multipliers:
Conservative: 4.37 / 4.6 = 0.95Growth: 4.784 / 4.6 = 1.04Stress: 4.14 / 4.6 = 0.90
Important interpretation
- Scenario curves are scaled versions of the same base tier curve.
- The scenario changes productivity assumptions, not the identity of the tier.
- If multipliers are stream-level constants, every tier in that stream is scaled by the same factor.
Quality checks to run after building curves
- Recompute each
Base Strategic Returnand confirm exact equality with component sum. - For each stream, verify
ScenarioReturn / BaseReturnis constant (or intentionally varied) across tiers. - Recheck monotonicity by scenario: Tier 1 >= Tier 2 >= Tier 3 >= Tier 4.
- Confirm no negative return values unless explicitly allowed by governance policy.
9. Solver Setup in Each Scenario Sheet
Use Solver in Base LP, Conservative LP, Growth LP, and Stress LP one by one.
Objective and changing cells
- Set Objective: E4 (maximize).
- By Changing Variable Cells: E13:E28.
Core constraints
- Budget committed: B3 = E3.
- Cost-ratio linear headroom: E5 >= 0.
- Tier spend lower bound: E13:E28 >= 0.
- Tier spend upper bound: E13:E28 <= C13:C28.
- Stream minimums: B31:B34 >= C31:C34.
- Stream maximums: B31:B34 <= D31:D34.
Strategic dependency constraints
- Mid-level Conversion dependency: B34 <= 0.55 * B31.
- Reactivation dependency: B32 <= 0.75 * B31 + 5000.
- Pipeline floor: B32 + B33 >= 0.30 * E3.
- Stability floor: B31 + B34 >= 0.40 * E3.
How to explain and tune these constants:
- 0.55 reflects upgradeable depth relative to retained base under current portfolio assumptions.
- 0.75 and +5000 cap reactivation scale to reachable lapsed volume plus a practical fixed operational allowance.
- 0.30 enforces minimum future-pipeline investment.
- 0.40 protects near-term base stability.
These are starting governance parameters, not universal truths. Re-estimate annually from observed conversion and capacity data.
Solver method
- Select Simplex LP.
- Check Assume Linear Model.
- Check Make Unconstrained Variables Non-Negative.
10. Scenario Logic and Interpretation
The model includes four independent scenarios:
- Base
- Conservative
- Growth
- Stress
Each scenario modifies:
- total budget,
- stream productivity multipliers,
- cost-ratio limit (Stress is tighter).
Use Scenario Summary to compare:
- certified net value,
- implied portfolio mix,
- sensitivity of acquisition and reactivation allocation under stress.
11. Optimality Certificate and Validation Workflow
Purpose first: why this certificate exists
- The Optimality Certificate is evidence that the recommended allocation is not just a good answer, but the best feasible answer under the exact constraints you approved.
- It gives governance confidence by independently checking Solver output against a ranked set of feasible alternatives.
- It helps non-technical reviewers answer the key oversight question: “How do we know a different feasible mix would not produce higher strategic value?”
- It creates an audit trail for leadership, finance, and board review by preserving the feasible search method, assumptions, and gap-to-best result.
The certificate tab contains ranked feasible allocations (enumerated at fixed spend increments) for each scenario.
In this workbook, allocation enumeration uses $1,000 spend increments.
Interpretation for technical and non-technical readers:
- smaller increments increase precision but increase runtime,
- larger increments reduce runtime but can miss near-optimal allocations.
Validation flow:
- Solve scenario sheet with Solver.
- Compare scenario net result to certified net benchmark.
- Confirm gap to certificate is zero or effectively zero after rounding.
- Repeat with different starting values to verify starting-point independence.
This gives board-level confidence that the recommendation is globally optimal for the modeled feasible region.
Detailed Optimality Certificate workflow (all involved steps):
- Freeze scenario inputs.
- Confirm budget, stream min/max, tier capacities, and dependency constants are final for the scenario run.
- Set certificate granularity.
- Choose spend increment (for this workbook, $1,000) and record it in run notes.
- Enumerate candidate allocations.
- Generate all tier-spend combinations on the increment grid that can sum to the scenario budget.
- Apply feasibility filters.
- Keep only allocations that satisfy all linear constraints (budget, bounds, dependencies, policy floors).
- Score each feasible allocation.
- Compute objective value using the same strategic marginal return logic as Solver.
- Rank feasible set.
- Sort by objective descending and assign rank (1 is best certified allocation).
- Capture top-N rows.
- Write ranked results and key allocation vectors to the certificate tab for auditability.
- Run Solver independently.
- Solve the same scenario tab with Simplex LP and record objective plus allocation vector.
- Compare Solver vs certificate best.
- Compute
CertificateGap = CertifiedBestObjective - SolverObjective. - Accept optimality when gap is zero or within your defined numerical tolerance.
- Test robustness.
- Re-run Solver from different starting values and verify unchanged optimum.
- Archive evidence.
- Save scenario inputs, certificate output, Solver settings, and timestamped run metadata.
Practical note on precision:
- The certificate is exact only on the selected increment grid.
- Smaller increments improve precision but increase computation.
- If gap persists, reduce increment and rerun to confirm whether it is a discretization artifact.
12. End-to-End Operating Procedure: Raisers Edge to Solver Decision
Use this as the complete runbook each planning cycle.
Phase A: Data extraction
- Export gift-level and constituent-level fields from Raisers Edge NXT.
- Store snapshots with extraction date and fiscal-year scope.
Phase B: Data preparation
- Standardize IDs and fiscal-year assignment.
- Build donor-year transition table.
- Build stream-level performance summary.
Phase C: Tier calibration
- Rank historical segments within each stream by productivity.
- Assign four tiers with descending productivity.
- Estimate capacities and strategic marginal returns per tier.
- Validate that each stream remains diminishing by tier.
Phase D: Workbook refresh
- Update Scenario Inputs and Revenue Curves.
- Confirm stream min and max limits align with policy.
- Confirm dependency constraints match current strategy.
- Record assumption version metadata (date, owner, and source extracts).
Phase E: Optimization and governance
- Run Solver on all four scenario tabs.
- Check certificate gaps.
- Review Scenario Summary with leadership.
- Select execution scenario and document rationale.
Phase F: Execution and monitoring
- Translate stream allocations into campaign plans.
- Track in-year actuals vs modeled assumptions.
- Recalibrate tiers and multipliers at next cycle.
Recommended ownership and cadence:
- Prospect research lead owns segment and eligibility logic review.
- Database administrator owns extraction, field mapping, and data QA controls.
- Fundraising operations owns scenario selection and campaign translation.
- Monthly variance review, quarterly assumption check, annual full recalibration.
Closing
This current-year strategic workbook is designed to be both practical and decision-grade:
- practical because it runs as linear programming in standard Excel Solver,
- decision-grade because it encodes future value and stream dependencies explicitly.
The result is a portfolio recommendation that goes beyond simple marginal-return sorting while staying transparent, auditable, and repeatable.