Eligibility is a Pro feature. On the free version the two settings are stored but not enforced, so every visitor is eligible. The sign-in switch shows off and locked, and the roles show locked with none ticked, because that’s what the free version does.
Signed-in customers and roles
Signed-in customers only. A guest following the link is refused like any other refused visitor. They’re told why, and they go wherever your Unavailable links setting sends them. Once signed in, they can follow the link again. Allowed roles. Tick one or more WordPress roles. A visitor whose account holds none of them is turned away. Leave every role unticked to allow any signed-in customer. Allowed roles appears only while the sign-in switch is on. Roles narrow “signed in” and never apply on their own. A guest holds no roles, so a role list without the switch would refuse every visitor while the screen showed no sign-in requirement at all.The same rule holds below the screen. A role list stored without the switch turns the switch on when it’s saved, so an import or a filter can’t add a restriction the editor wouldn’t show you. Turning the switch off clears the roles with it.
Checked again at checkout
Eligibility is checked when the link is followed, and again at checkout: the classic checkout, the Checkout block, and Pay for order. A customer whose role you’ve removed since the preset reached their cart, or whose guest cart was merged into an account that isn’t allowed, is refused there with the same sentence.Why only these two
Both are facts WordPress knows for certain on every request. There’s no ship-to region restriction. You often can’t tell where a visitor is when they click a link, so a region rule would work for some people and not others, and you’d think the preset was protected when it wasn’t.What a rejected visitor reads
There are two sentences. Both are store-wide and editable under Settings → Messages and labels. The editor links there from the foot of the Usage restrictions card.
A guest meeting a role-restricted preset reads the sign-in sentence, not the account one. Roles imply sign-in, so that gate is asked first. It’s also the more useful message for somebody who isn’t signed in.
Where they land
They go where every refused visitor goes. That’s set by Unavailable links under Settings → Cart behaviour, which a preset can override in its Cart behaviour card: Cart, or a Custom URL of your own. See Where customers land. There’s no sign-in redirect. A guest isn’t sent to a login form and brought back. The plugin refuses the link and says why, and that setting decides where they go next. External addresses work. A destination you configure passes through a redirect helper that allow-lists the host you set. WordPress’s ownwp_safe_redirect() rewrites 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 adds the pending queue to the top of 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.