Eligibility is a Pro feature. On the free build the two settings are stored but not enforced — every visitor is eligible. The controls are visible and locked.
Two gates
Require sign-in. A guest following the link is sent to sign in, and returned to the link afterwards — so the preset still fills their cart once they are in, rather than dropping them on an account page with no idea why. Limit to roles. Pick one or more WordPress roles. A visitor whose account does not hold one of them is turned away. Selecting roles implies sign-in: a logged-out visitor has no role to match.Why only these two
Both are facts WordPress knows with certainty on every request. Ship-to region was considered and removed. A visitor’s country is frequently unknowable at the moment they click a link, and a restriction that silently holds for some visitors and not others is worse than no restriction at all — you would believe the preset was protected when it was not.What a rejected visitor sees
Your own message, as a notice, and then your store’s fallback URL. The rejection message is per preset, so a wholesale link can say something different from a staff one. Leave it empty and the shipped wording is used.Where they land
The store’s not-found fallback, under Settings → Links & fallbacks. Leave it empty and they go to your shop page. External addresses work. A merchant-configured destination passes through a redirect helper that allow-lists the host you configured — WordPress’s ownwp_safe_redirect() would silently rewrite a foreign host to wp-admin, which would send a rejected customer to your dashboard login.
Notices reach block checkouts too
WooCommerce’s Cart and Checkout blocks on a classic theme never print the classic notice queue. A message written into the session would sit there until some classic template dumped every stale notice at once. CartPresets prepends the pending queue to both blocks through WooCommerce’s own notice templates, so your rejection message arrives whichever cart your theme uses.Settings reference
For developers
Eligibility is decided throughcartpresets_eligibility, seeded allowed => true. Every verdict comes from a listener, including the plugin’s own — so you can add a rule of your own (a membership check, a regional policy) at a later priority and have the last word. See the hooks reference.