This article is part of the guide to SEO Rules in FiboFilters. If you’re new to SEO Rules, start there first.
When a visitor lands on a filtered page, FiboFilters first identifies which SEO rules are eligible for that URL, then selects the most specific one. This is handled by the matching algorithm described below, and the result is always deterministic.
The matching algorithm
The algorithm works in two stages:
In the first stage, FiboFilters reject inactive rules (“Rule is active” toggle is off) and rules whose filter set doesn’t exactly match the URL.
In the second stage, the remaining rules are ranked by specificity, according to criteria 1-5 presented in the following sections. The first criterion that separates two rules decides the winner – later criteria only matter if earlier ones are tied.
1. Base view specificity
A rule’s base view must be compatible with the current page. FiboFilters assigns a specificity score:
- Exact match – the rule targets this specific category or the main shop page. Score: 2.
- Wildcard match – the rule uses “Any product category” and the current page is any product category. Score: 1.
- No match – the base view type doesn’t fit the current page (e.g. a “Main shop page” rule on a category page, or a category rule on the main shop page). Score: 0.
| Rule base view | Current page | Score |
| Specific category: Sneakers | /category/sneakers/ | 2 |
| Any product category | /category/sneakers/ | 1 |
| Specific category: Jackets | /category/sneakers/ | 0 |
| Main shop page | /category/sneakers/ | 0 |
Base view types never mix. A “Main shop page” rule will never fire on a category page, regardless of how well its filter conditions match.
2. Exact filter set
A rule only enters ranking if its filter conditions match the current URL exactly. If the URL has a filter the rule doesn’t include, that rule is excluded. If the rule requires a filter that isn’t in the URL, it’s excluded too.
- URL is
?color=red– a rule that requirescolor = Red AND size = Lis excluded. The URL is missingsize. - URL is
?color=red&size=l– a rule that requires onlycolor = Redis excluded. The URL has an extrasizefilter.
Rules with different filter sets are never ranked against each other. Each URL has its own pool of eligible rules, and only rules in that pool compete.
3. Constrained vs “any value” conditions
A condition pinned to a specific value (color = Red) beats a condition open to any value (color = any value). FiboFilters counts how many of a rule’s conditions are pinned – more pinned conditions wins.
A condition is “any value” when you leave the values list empty in the rule editor. It still requires that filter to be present in the URL – it just accepts any single selection for it.
4. Per-filter specificity
When two rules are still tied after step 3, FiboFilters examines each filter individually and assigns a level based on what kind of value constraint the rule uses:
| Constraint type | Example rule value | Level |
| Full range – both bounds defined | price = 10 to 50 | 3 (highest) |
| One-sided range – one bound defined | price = 10 and up | 2 |
| Discrete value(s) | color = Red | 1 |
Higher level wins. Within the same level, the rule with fewer allowed values wins. A condition that accepts only Red is more specific than one that accepts Red or Blue, even though both match a ?color=red URL.
5. Tiebreaker
If every criterion above is still equal, FiboFilters uses a stable internal tiebreaker to decide. The same URL will always resolve to the same rule, no matter when the page is loaded or refreshed.
Examples
Example 1: Exact category beats Any product category
- Rule A: “Any product category”,
color = Red - Rule B: “Specific category: Sneakers”,
color = Red - URL:
/category/sneakers/?color=red
Winner: Rule B. Both rules pass the filter-set check (color = Red matches). However, Rule B scores 2 on base view specificity, while Rule A scores 1.
Example 2: Fewer allowed values wins
- Rule A:
color = Red or Blue,size = M - Rule B:
color = Red,size = M - URL:
?color=red&size=m
Winner: Rule B. Both rules have the same base view, the same filter count (2), and the same constrained filter count (2). The per-filter specificity criterion finds that color = Red (with 1 allowed value) beats color = Red or Blue (with 2 allowed values).
Example 3: Range filter – only matching rule type wins
- Rule A:
price = 10 to 50(both bounds) - Rule B:
price = 10 and up(min-only) - URL:
?price=10-50
Winner: Rule A. Rule B doesn’t match this URL. The URL carries both bounds, so FiboFilters requires the matching rule to also define both bounds with the same values.
Example 4: Inactive rule doesn’t compete
- Rule A: inactive, “Specific category: Sneakers”,
color = Red - Rule B: active, “Any product category”,
color = Red - URL:
/category/sneakers/?color=red
Winner: Rule B. Rule A is inactive and is removed before scoring begins.
Why my rule isn’t matching – 5 common causes
1. Extra filter in the URL
Your rule specifies color = Red, but the visitor’s URL is ?color=red&size=l. The filter set doesn’t match exactly – size is present in the URL but absent from the rule. Fix: add a size = L condition to this rule, or create a separate rule for the two-filter combination.
2. Multi-select value in the URL
A shopper selected two colors and the URL reads ?color=red,blue. SEO Rules requires exactly one selected value per filter slot. Multi-select URLs don’t match any rule and fall back to default behavior (noindex, canonical to base URL).
3. Rule is inactive
Open the rule editor and check the Rule is active toggle. An inactive rule never matches.
4. Wrong base view
A rule set to “Specific category: Sneakers” won’t fire on /shop/?color=red – the base view is different.
5. Filter slug mismatch
The slug in the rule must match the URL parameter character for character. If the filter slug is color, but you entered pa_color in the URL, the condition never fires.