Duplicate ingredient risk is the failure mode where a user crosses a safety ceiling — a stimulant cap, a fat-soluble vitamin upper limit, a mineral RDA multiple — because the same active is hiding in multiple products under different names, forms, or proprietary-formula labels. Unfair models each stack as a flat ingredient roster rather than a product roster, so every dose of every compound across every product is summed before any cap is evaluated. Without this step a user stacking a multivitamin, a pre-workout, and a separate B-complex can be well over the B6 upper limit with every bottle still inside its own labeled serving.
Where duplicates hide
Label-level duplicate detection is easy. The harder cases are semantic or structural. The builder treats four patterns as the dominant sources of hidden duplicates.
| Pattern | Example | What looks like one source but is three | Detection cue |
|---|---|---|---|
| Stimulant stacking across forms | Coffee 2 cups (190 mg caffeine) + green tea extract (60 mg caffeine) + pre-workout (200 mg caffeine) | Three products, one compound, combined 450 mg caffeine | Every library entry carries a `stimulant_mg` field normalized to caffeine equivalents |
| B-vitamin overlap in complexes | Multivitamin with B6 50 mg + B-complex with B6 50 mg + energy drink with B6 10 mg | Three products, combined 110 mg B6 per day — above the 100 mg US tolerable upper intake with no headroom | Ingredient metadata tags each B vitamin with RDA and UL so the sum is checked at add-time |
| Magnesium split across stacks | Sleep stack 400 mg magnesium glycinate + muscle-support stack 200 mg magnesium citrate + greens powder 100 mg magnesium | Three stacks, 700 mg elemental magnesium, well above the 350 mg supplemental UL — loose stools before labs are checked | Elemental mineral content is computed per salt form and summed across all active stacks |
| Proprietary formulas with standardized actives | "Focus formula 500 mg" masking 200 mg caffeine + 100 mg L-theanine + 200 mg tyrosine, added to a user's existing standalone caffeine and L-theanine | Undisclosed actives counted twice | Library entries for known branded formulas expand to their published standardized actives; unverifiable ones are flagged, not trusted |
Synonym drift is the fifth pattern and cuts across all four above. Vitamin D3 and cholecalciferol are the same compound; ascorbic acid and buffered C are the same compound; magnesium glycinate, bisglycinate, and chelate are the same elemental magnesium. The library stores a canonical compound identifier per ingredient so form variants resolve to one sum. See ingredient metadata for how the canonical id is assigned and how product-label drift is reconciled.
Overlap-detection logic
The builder's duplicate check runs three passes before every activation.
- Canonical compound pass. Every ingredient is resolved to its canonical id, and each active stack contributes its rostered dose to a per-id running sum.
- Cap pass. The running sum is compared against the per-compound cap set in metadata — RDA for informational display, UL for warning, regulatory ceiling for blocking.
- Form-specific pass. Compounds with meaningfully different pharmacokinetics by form — melatonin immediate-release vs extended-release, magnesium oxide vs glycinate — carry form-specific caps so the check is not falsely conservative.
Proprietary formulas without published standardized actives cannot be summed reliably, so the builder treats them as opaque and prompts the user to choose between removing the product, substituting a single-ingredient alternative, or accepting an activation note that the cap check is incomplete for that stack.
A numeric example
A user assembles a focus stack with 200 mg caffeine from green tea extract at 8 a.m. and a pre-workout at 10 a.m. containing another 200 mg caffeine. They drink two 8-oz coffees during the same morning, contributing roughly 190 mg more. The canonical caffeine sum is 590 mg before noon. The general adult daily cap in the library is 400 mg, with a stricter 200 mg single-window cap. The builder flags both caps exceeded, pauses activation of the pre-workout, and suggests either removing the green tea extract or moving the pre-workout to a non-caffeinated variant. The related overlap framing covers why staggered introduction is preferred over a single-day swap once a duplicate cluster is identified.
When to reduce vs rebuild
Reducing a single source is the right move when the user wants to keep one product for a non-overlapping reason — a pre-workout with tyrosine and beta-alanine kept for those ingredients, with the caffeine version swapped for the stim-free variant. Rebuilding is the right move when three or more products are contributing to the same duplicate and the roster is easier to understand from scratch. The builder offers both paths and defaults to reduction for single-compound duplicates and to rebuild for multi-compound clusters.
Why hidden duplicates are routinely missed
Three structural reasons keep most users from noticing duplicates without a tool.
- Products market themselves by category, not by compound. A "sleep support" bottle and a "magnesium" bottle both containing 200 mg elemental magnesium are read as different products unless the user opens both labels.
- Daily totals are invisible across stacks. A user who built a morning stack in March and a recovery stack in July rarely re-reads March's roster when picking July's products, and the app is the only place the per-compound daily sum lives.
- Form names disguise the active. Bisglycinate, glycinate, glycinate chelate, and Magtein are four labels for products that all contribute elemental magnesium; without a canonical id, none of them look like the same compound.
The fix is not user diligence. It is metadata — canonical ids, elemental-content calculations per salt form, and per-compound caps that sum across every active stack.
Action ladder after a flag fires
Once a duplicate flag fires, the builder walks the user through a short ladder rather than asking for a yes/no decision.
- Reduce one source and hold for 24–72 hours. A single-compound duplicate usually resolves at this step, and the symptom separation is easier to read than from a full removal.
- Recheck the per-compound sum. If the sum is back inside the cap and no symptom cluster appeared during the hold, the stack proceeds.
- If symptoms persist or the sum is still above the cap, remove the duplicate source entirely and extend the hold to seven days before reintroducing anything new.
How this appears in Unfair
The builder runs the canonical compound sum on every save and on every add. Caps crossed at the UL tier surface a non-blocking warning with the sum and the delta. Caps crossed at the regulatory tier block activation and require either dose reduction or product removal. The log view shows a "hidden duplicate" chip on any ingredient whose sum across stacks is higher than its single-stack dose, so users notice that their magnesium total is 700 mg without having to open each stack.
Clinical safety note
Cap checks are derived from published reference intakes and do not account for individual tolerance, existing medications, or organ-function status. Persistent GI symptoms, paresthesia, flushing, or cardiovascular symptoms on a duplicate-heavy stack should be treated as a reason to stop the overlapping products and involve a clinician, not as a cue to continue and monitor.