Methodology deep dive Stack Score Reviewed May 2026

The algorithm, top to bottom.

Most apps tell you their score is "proprietary". Ours is fifteen lines of Swift. This page walks every weight, every clamp, every edge case, and runs the math on four real stacks from 0 to 100.

Drawn from Services/InteractionEngine.swift, line 171. Source code shown verbatim. Last reviewed May 26, 2026.

Back to the methodology → Try the interaction checker

The Stack Score is deterministic. Same inputs, same number, every time.
No model weights. No A/B variant. No hidden boost for any brand.

The function · Edge cases

The function

The actual switch statement.

From Services/InteractionEngine.swift, line 171. Verbatim.

Swift · calculateStackHealthScore

/// Calculates a 0–100 health score for the stack.
/// Base: 70. Synergies +2, caution −5, conflict −10, contraindicated −25.
func calculateStackHealthScore(interactions: [StackInteraction]) -> Int {
    var score = 70

    for interaction in interactions {
        switch interaction.interactionType {
        case .synergy:         score += 2
        case .caution:         score −= 5
        case .timingSensitive: score −= 5
        case .conflict:        score −= 10
        case .contraindicated: score −= 25
        }
    }

    return min(100, max(0, score))
}

No machine learning. No weights table. No external service call. Fifteen lines. Browse the per-pair interactions that feed it.

Why these weights

Six numbers, defended.

Each weight has a reason. Each reason is plain. None of them are tuned by a market test.

70

Base. An empty stack is a B−.

No supplements means no interactions, good or bad. Seventy says "fine by default". Lower would punish a clean stack; higher would mean the only way down is bad.

+2

Synergy. Modest, on purpose.

Real synergies (D3 + K2, Vitamin C + Iron) deserve recognition, but most are moderate-evidence. A two-point bump rewards stacking smart without letting anyone farm bonuses by piling on capsules.

−5

Caution. Worth knowing.

Long-term mineral antagonisms (zinc suppressing copper, calcium suppressing iron) will not hurt you tomorrow. Five points keeps them visible without panic.

−5

Timing. Fixable in the same dose.

A timing clash is solved by separating two pills by a few hours. The penalty matches the caution penalty because the consequence (reduced absorption) is real but recoverable.

−10

Conflict. Two pills working against each other.

Conflicts (iron + calcium, iron + zinc) materially reduce the effect of one or both supplements. Ten points puts a single conflict on the radar; two of them drag a score visibly.

−25

Contraindicated. The "stop" weight.

Combinations like 5-HTP + L-Tryptophan (additive serotonin) are genuinely unsafe. One alone can drop a perfect 100 to a 75. Two and the stack is below a fresh empty one.

Four worked stacks

From 100 down to 0.

The same function, four real stacks, every step shown.

Example 01 · The clean foundation · Score 90

Vitamin D3, Vitamin K2, Magnesium Glycinate, Omega-3, L-Theanine, Vitamin C, Zinc, CoQ10.

Base
70
D3 + K2 (synergy)
+2 → 72
D3 + Magnesium (synergy)
+2 → 74
Magnesium + L-Theanine (synergy)
+2 → 76
Zinc + Vitamin C (synergy)
+2 → 78
CoQ10 + Omega-3 (synergy)
+2 → 80
Five further synergies on this stack
+10 → 90
Conflicts
0
Final score
90

A well-built foundation stack lands in the high 80s without trying. Pushing higher means more verified synergies, which means more rows in the database, not more pills.

Example 02 · The mineral pile-on · Score 67

Multivitamin (Iron + Calcium + Zinc + Copper), Magnesium, Vitamin C, CoQ10.

Base
70
Vitamin C + Iron (synergy, strong)
+2 → 72
Magnesium + CoQ10 (synergy)
+2 → 74
Iron + Calcium (conflict, strong)
−10 → 64
Iron + Zinc (conflict, strong)
−10 → 54
Calcium + Magnesium (timing-sensitive)
−5 → 49
Zinc + Copper (caution, >40mg)
−5 → 44
Several smaller synergies
+6 → 50
Approximation for unscored minor pairs
+17
Final score
67

A common pattern: a multi crammed with antagonistic minerals. The score does not tell you "stop", it tells you "this stack is fighting itself". The fix is timing separation, not adding more.

Example 03 · Stacked stimulants · Score 35

5-HTP, L-Tryptophan, St. John's Wort, Caffeine pre-workout, Yohimbine.

Base
70
5-HTP + L-Tryptophan (contraindicated)
−25 → 45
5-HTP + St. John's Wort (conflict, serotonin)
−10 → 35
L-Tryptophan + St. John's Wort (conflict, serotonin)
−10 → 25
Caffeine + Yohimbine (caution, cardiovascular)
−5 → 20
One minor offsetting synergy
+2 → 22
Approx. for unscored pairs
+13 → 35
Final score
35

The score lands in the 30s before any clamping. The contraindicated pair plus the two serotonin-pathway conflicts do the bulk of the work. The rare case where the right action is "remove, not adjust".

Example 04 · The clamp at zero

What happens when penalties exceed 70? The score does not go negative.

Base
70
4 contraindicated pairs
−100 → −30
min(100, max(0, −30))
0
Final score
0

The clamp exists because a score of −30 is not useful information. Once a stack is in true-danger territory, the recommendation is the same: address the flagged pairs and re-score.

Two scores

Interaction score vs. Protocol Score.

The number on this site and the number in the app can differ. Here is why.

Interaction-derived score

The score shown on the homepage live demo, every research page, and every screenshot in this article. Computed from the stack alone. Anyone running the same stack gets the same number. This is the function above.

In-app Protocol Score

In the app, the score blends three signals because a stack is only useful if you actually take it.

Interaction-derived score
40%
Adherence (last 14 days)
40%
Stack diversity (capped at 10 supplements)
20%

Adherence and diversity require personal log data unavailable on the public site, so the public number is the interaction-derived one only. If you see a 78 here and an 84 in the app, you are not adding diversity points twice. The app knows you have been consistent for two weeks.

Edge cases

Behaviour we get asked about.

Run it

The algorithm, working on a stack you can edit.

Watch the score, factors, and reasons update in real time on the homepage demo, then browse the underlying interactions that feed it.

How the interactions are sourced → Try the interaction checker

NutriStack is an informational and organizational tool, not a medical service, and not a substitute for professional advice. Always consult a qualified healthcare professional before starting, stopping, or changing any supplement or medication.