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.
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.
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
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
Each weight has a reason. Each reason is plain. None of them are tuned by a market test.
70
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
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
Long-term mineral antagonisms (zinc suppressing copper, calcium suppressing iron) will not hurt you tomorrow. Five points keeps them visible without panic.
−5
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
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
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
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.
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.
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.
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.
min(100, max(0, −30))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
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.
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
Run it
Watch the score, factors, and reasons update in real time on the homepage demo, then browse the underlying interactions that feed it.
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.