Targeting controls who sees the widget. The right rules dramatically improve performance — a "10% off" offer on a pricing page converts very differently than the same offer on a blog post.
Page Targeting
Page targeting matches against the path of the current URL (everything after the domain).
Substring by Default
By default, the pattern you enter is treated as a substring match — the rule matches if the URL contains your pattern anywhere. This is the most forgiving option.
| Pattern | Matches | Doesn't Match |
|---|---|---|
/pricing | /pricing, /pricing/team, /en/pricing | /about, /blog |
/blog | /blog, /blog/post-1, /de/blog | /about, /podcasts |
checkout | /checkout, /store/checkout/step-2 | /cart, /orders |
Wildcards With *
Use * to match anything in that segment of the URL.
| Pattern | Matches | Doesn't Match |
|---|---|---|
/blog/* | /blog/launch, /blog/2026/launch | /blog, /news |
/products/*/buy | /products/widget-a/buy, /products/123/buy | /products/widget-a |
/*/pricing | /en/pricing, /de/pricing | /pricing |
Multiple Patterns
Add more than one pattern (one per line). They are combined with OR — a URL only needs to match one of them.
/pricing
/checkout
/products/*/buy
This widget would fire on the pricing page, the checkout flow, and any product buy page.
Leave Blank to Match Everything
If you leave the page rule blank, the widget is eligible on every page of the domain. This is best for top-funnel widgets like newsletter signups.
Tip: Excluding Pages
Page targeting is "include only". To exclude specific pages from a wide rule, the cleanest pattern is to create separate widgets per page or per section, rather than trying to express "all pages except X" in one rule.
Country Targeting
Show or hide the widget based on the visitor's country.
Format
Use two-letter ISO 3166-1 alpha-2 country codes, all uppercase:
| Code | Country |
|---|---|
US | United States |
DE | Germany |
FR | France |
JP | Japan |
BR | Brazil |
GB | United Kingdom |
In the builder, type a two-letter code in the country field and press Add (or Enter) to add it as a chip. Repeat for each country you want to include, and remove one by clicking the x on its chip.
Common Patterns
| Goal | Selection |
|---|---|
| Currency-specific offer | Just the countries that use that currency |
| Regional launch | Countries you've localized for |
| Compliance carve-outs | Exclude markets where the offer can't be made |
Leave Blank for Worldwide
Empty country list = the widget is eligible everywhere.
How Country Is Detected
Country is derived from the visitor's IP at the time the page loads. Visitors using VPNs are matched to the VPN exit-node country. No GeoIP lookup happens client-side — the widget engine receives the country alongside the page event.
Device Targeting
Pick which device types the widget runs on.
| Device | Detected By | Typical Use |
|---|---|---|
| Desktop | Visitor's user-agent | Mouse-leave triggers (most reliable) |
| Mobile | Visitor's user-agent | Scroll-up + visibility-return triggers |
| Tablet | Visitor's user-agent | Scroll-up + visibility-return triggers |
Why Device Matters
Exit-intent fires differently on each device (see Overview). A widget designed around the mouse-leave signal will look strange on mobile, where the trigger is scroll-up. A few common pairings:
- Discount popup — desktop only (mouse-leave is the strongest signal)
- Newsletter sign-up — all devices
- App-store CTA — mobile only
Mixing Devices
You can pick any combination of the three. At least one must be checked, otherwise the widget cannot fire.
Visit Count Targeting
Optional rule: only show the widget after the visitor has been on the site at least N times.
Use Cases
| Threshold | Use Case |
|---|---|
| 1 (default) | First-time visitors only |
| 2 | "Welcome back" or loyalty offer |
| 3+ | Engaged visitors who keep returning |
⚠️ Caveat — Cookieless Mode
Visit count is calculated from a stored visitor identifier. In cookieless mode (the privacy-first default for some Zenovay deployments), the visitor ID is window-scoped only — it disappears when the tab closes. As a result:
min_visit_count > 1will essentially never fire in cookieless mode- Each "visit" looks like a brand-new visitor to the engine
- Use this rule only when your site is running with the standard (cookie-using) tracker
If you're not sure which mode your site uses, check the General Settings page in your domain dashboard, or see Does Zenovay Use Cookies?.
Frequency Caps
A frequency cap limits how often the same visitor sees the widget. This is set on the Frequency step of the builder, using a slider measured in days (0–30).
| Setting | Behavior |
|---|---|
| 0 days | No cap — eligible to fire on every exit-intent trigger |
| 1 day | At most once per day, per visitor |
| 7 days | At most once per week, per visitor |
| 30 days | At most once per month, per visitor |
Any whole number from 0 to 30 works — set the slider to whatever spacing you want between views.
How the Cap Window Works
The cap is a rolling window from the moment a visitor was last shown the widget, not a calendar-day boundary. With a 1-day cap, a visitor who sees the widget at 14:00 won't see it again until 14:00 the next day — the clock starts when they see it, wherever they are in the world.
Setting the slider to 0 removes the cap entirely. Even then, the same visitor won't see the widget twice within a single browser tab session (the renderer dedupes per session), but they may see it again on a later visit.
How the Cap Is Counted
The cap is recorded when the widget is shown to a visitor. Whether they click the call-to-action or dismiss (close) it, the window has already started, so they won't see it again until the window expires.
The cap is tracked by a daily-rotating hash of the visitor's IP address — no cookie is needed, which is why frequency caps work even in cookieless mode (unlike visit-count targeting above).
Putting It All Together
A typical "high-intent shopper" widget might combine:
| Rule | Value |
|---|---|
| Page | /pricing, /checkout/* |
| Country | US, CA, GB |
| Device | Desktop only |
| Min. visit count | 1 |
| Cap | 1 day |
This shows a checkout-rescue offer to English-speaking shoppers on desktop, never more than once a day.
Common Pitfalls
| Symptom | Likely Cause |
|---|---|
| Widget never fires | Targeting too narrow, or you've already seen it (try incognito) |
| Fires on wrong pages | Substring match is too loose — try * wildcards or a longer pattern |
| Doesn't fire on mobile | Device list excludes mobile, or you're testing with mouse-leave (use scroll-up instead) |
| Visit-count rule does nothing | Site is in cookieless mode; visit-count needs persistent identifiers |
| Fires more often than expected | Frequency cap is set to 0 (no cap), or to fewer days than you want between views |