The math behind PatternFolio: vertical tier weights feed breach priority, the ICCAN similarity score is bucketed into one of four actions, and the monitor dashboard sorts every fired alert by a single priority_score.
Each subscription tier contributes a fixed weight to the breach-priority formula. Enterprise is the highest; the free tier is the floor. The same weights power both the alert feed sort order and the priority rank badges on the dashboard.
| Tier | Weight | Notes |
|---|---|---|
| Enterprise | 8 | Daily cadence, unlimited competitors |
| Funnel | 7 | Pre-Monitor sales-pipeline tier |
| Pro | 5 | Bi-weekly cadence, 25 competitors |
| Starter | 3 | Weekly cadence, 5 competitors |
| Free | 1 | One-off Scan, no scheduled cadence |
5 to the breach priority for any of its monitored
competitors — regardless of whether the competitor is set to daily,
weekly, or bi-weekly cadence. The cadence term is scored separately.
The Monitor overview page has the full pricing breakdown — see the Free / Starter / Pro / Enterprise comparison.
The ICCAN scorer returns a similarity percentage between 0 and 100. That
score is bucketed into one of four actions using the thresholds in
lib/iccan-scorer.js. The same action then feeds the breach
priority formula.
| Action | Weight | Score band |
|---|---|---|
| CLEAR | 0 | 0 ≤ similarity < 50 |
| REVIEW | 8 | 50 ≤ similarity < 75 |
| FLAG | 15 | 75 ≤ similarity < 90 |
| REJECT | 20 | 90 ≤ similarity ≤ 100 |
similarity_pct = 87 lands in the FLAG band (75 – 90) and
contributes weight 15 to that audit's breach priority. The same
audit at similarity_pct = 92 would be REJECT (weight 20).
Cadence, alerts, and how the dashboard uses these bands live in the Monitor FAQ and in the Monitor + canvas + audit feed post.
Every fired monitoring_alert row carries a single priority_score. The dashboard sorts the Alert Timeline feed by this number, descending, so the most urgent breach always surfaces at the top.
The formula is a weighted blend of seven terms:
priority_score = severity + action + direction + similarity_magnitude
+ tier_weight + cadence_weight + recency_boost
recency_boost = 30 / (1 + age_days)
change_pct = 22.3, action = reject,
direction = increased, similarity_new = 87.4,
subscription tier pro, competitor cadence weekly,
age_days = 0:22.30,
act = 20,
dir = 6,
simMag = 17.48,
tier = 5,
cadence = 1,
recency = 30
The canonical formula lives in
db/monitoring_alerts.js — the migration
1801000000_monitor_alerts_priority_score.sql backfills existing
rows with the same expression, so legacy and new alerts sort consistently.
The same priority_score drives three surfaces in the app. If a number on one of these pages changes, this is where to look first.