All use cases

scan.count_total

The first hundred, the normal page after that

Launch, drop, opening. The first 100 scans see the voucher, every one after that the normal page. That is a threshold in the list, not an A/B test: order is the only semantics, and the mandatory rule catches everything after it.

Where it hangs
Shop window, roll-up, the first page of a campaign.
Why the paper stays
“Only the first 100” on paper becomes a lie the moment number 101 arrives.

Live resolution

scan.count_total = 42
geo.country = CHdevice.type = mobilelang.primary = de
  1. 1Under 100
  2. 2From 100
  3. alwaysOtherwise
https://hof.app/drop
A single card on an empty plinth in a dark shop window, early in the morning
The same code on every shot.Shop window, roll-up, the first page of a campaign.

The ruleset

Valid, storable, mandatory rule last.

Not a description of what the engine could do — this is the text a code carries. The first matching rule wins, and the last one always matches.

ruleset · version 1

{
  "rules": [
    {
      "when": { "scan.count_total": { "lt": 100 } },
      "then": { "type": "redirect", "url": "https://hof.app/drop" }
    },
    {
      "when": { "scan.count_total": { "gt": 99 } },
      "then": { "type": "redirect", "url": "https://hof.app/shop" }
    },
    {
      "when": "always",
      "then": { "type": "redirect", "url": "https://hof.app/shop" }
    }
  ]
}

Reprinting is the expensive part. Stop doing it.