How rule matching works

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 viewCurrent pageScore
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 requires color = Red AND size = L is excluded. The URL is missing size.
  • URL is ?color=red&size=l – a rule that requires only color = Red is excluded. The URL has an extra size filter.

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 typeExample rule valueLevel
Full range – both bounds definedprice = 10 to 503 (highest)
One-sided range – one bound definedprice = 10 and up2
Discrete value(s)color = Red1

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.