Cart & checkout

Restrictions & limiters with express checkout

How cart restrictions and product limiters enforce on Shop Pay, Apple Pay, Google Pay, PayPal and other express buttons.

Express and accelerated checkout buttons — Shop Pay, Apple Pay, Google Pay, PayPal and the dynamic checkout buttons on product pages — let shoppers skip the cart page and jump straight into checkout. A common merchant question is whether your cart restrictions and product limiters still apply when a shopper takes one of these shortcuts. The short answer is yes, as long as one setting is configured correctly. This page explains exactly how enforcement works on express flows, the one rule you must follow to guarantee it, and how to test it.

Why enforcement works everywhere

Restrictions and product limiters do not run in your storefront's JavaScript. They run as Shopify Function cart and checkout validations inside Shopify's own checkout infrastructure. When a shopper tries to move forward, Shopify calls the validation function, the function inspects the cart, and it returns either no errors or a blocking error message that prevents the shopper from completing the order.

Because the check lives inside Shopify rather than in your theme, it cannot be skipped by the things that normally bypass theme code:

  • A shopper who clicks an express button and never loads the cart page.
  • A headless / custom storefront that uses the Storefront API instead of your Liquid theme.
  • A shopper who has JavaScript disabled in their browser.

In every one of these cases the validation still runs server-side, so a violating cart is still blocked.

Server-side validation is the reason restrictions and limiters are reliable. The rule you configure is registered with Shopify's cart validation system, so the enforcement travels with the cart — not with the page the shopper happens to be on.

How express buttons change the stage

The single most important concept for express checkout is the stage at which a rule is evaluated. Shopify tells the validation function which step of the buyer journey it is running for, and your rules are filtered to match that step.

Restrictions have two independent toggles that control where they fire:

ToggleWhen it evaluatesCatches a normal cart-page shopperCatches an express-button shopper
Run on cartWhen items are added or quantities change on the cartYesNo
Run at checkoutWhen the shopper proceeds into checkoutYesYes

The critical detail is what an express button actually does: it jumps straight to checkout and bypasses the cart page entirely. That means the "cart" stage never runs for that shopper. Only rules evaluated at the checkout stage will see the cart.

So the explicit rule is:

A restriction set to Run on cart only will not block an express purchase that skips the cart page. To guarantee a restriction is enforced on Shop Pay, Apple Pay, Google Pay, PayPal and other express buttons, you must enable Run at checkout on that restriction.

Product limiters behave differently and are simpler here: limiters validate the cart at checkout by design. They inspect every line in the cart when the shopper proceeds, so all limiters apply to express checkout automatically — there is no per-stage toggle to forget. Whatever minimum or maximum you set on a product, variant or SKU is enforced no matter how the shopper reaches checkout.

Quick reference: what catches an express purchase

Rule typeEnforced on express checkout?
Restriction with Run at checkout ONYes
Restriction with Run at checkout OFF (Run on cart only)No
Product limiter (minimum or maximum)Yes, always

Where the error appears in express flows

When a cart violates an active rule, the validation function returns a blocking error and the shopper cannot complete the order. The error surfaces as a checkout error tied to the cart.

A few specifics worth knowing:

  • The text the shopper sees is the custom error message you configured on the restriction. If you did not set a message, a default of Please review your cart before continuing is shown.
  • The message is localized: the function picks the message for the shopper's checkout language, falling back to English (en) when no translation exists for that language.
  • For product limiters, the message is built from your configured minimum/maximum text. The placeholders {{ min_quantity }}, {{ max_quantity }} and {{ product_name }} are filled in with the real values, so the shopper sees, for example, the exact maximum and the product name that triggered the block.

Presentation differs slightly between flows. The error blocks completion in both the standard one-page Shopify checkout and the Shop Pay checkout, but because Shop Pay is a separate checkout surface, the exact placement and styling of the error can look different from the standard checkout. The enforcement is the same; the framing is not identical.

Because Shop Pay renders its checkout differently from the standard one-page checkout, always test both flows after you create or change a rule. A message that reads clearly in standard checkout should also make sense in the Shop Pay context.

Enforcement vs. checkout upsell offers — don't conflate them

This is the most common point of confusion, so it deserves to be stated plainly.

  • Restriction and limiter ENFORCEMENT is automatic in Shop Pay. You do not need to flip any extra "Shop Pay" switch for a blocking rule to apply — as long as the restriction has Run at checkout enabled (limiters are always on at checkout). The block runs inside Shopify and applies to Shop Pay just like every other flow.
  • Checkout upsell OFFER blocks are different. The upsell offer you show inside checkout is a Checkout UI Extension block, and that block does not appear in Shop Pay unless you turn on a separate Include block in Shop Pay toggle for it.

In other words: a rule that stops a cart works in Shop Pay with no extra setting, but an offer that you want to show in Shop Pay needs the block-level toggle.

If your upsell offer is missing from Shop Pay (but enforcement is working), that is a block-visibility issue, not an enforcement issue. See Upsells not showing in Shop Pay for the Include block in Shop Pay fix.

Edge cases and complex scenarios

Express checkout interacts with several special cart and order types. Here is how each behaves.

Recipe: verify a restriction blocks a Shop Pay express purchase

Use this to confirm, end to end, that a rule really stops an express checkout before you rely on it.

Confirm the rule is set to run at checkout

Open the restriction and make sure Run at checkout is enabled. Without it, express checkout will not be caught. Confirm the restriction is active and that its English error message is set.

Build a cart that violates the rule

Add the exact products, quantities or cart total that your restriction is meant to block. Do not open the cart page — the point is to test the express path.

Click the express button

Use the Shop Pay button (or the express button you want to verify) to jump straight into checkout, skipping the cart page.

Confirm the error blocks completion

You should see your custom error message and be unable to complete the order. Read the message in the Shop Pay context to make sure it is clear.

Repeat in standard checkout

Run the same violating cart through the standard one-page checkout to confirm the error appears there too. The placement may differ; the block should not.

Troubleshooting

Pre-launch checklist

Before you rely on a rule to hold on express checkout, confirm all of the following:

  • Run at checkout is ON for the restriction (limiters are always enforced at checkout).
  • An English error message is set (so there is always a fallback).
  • The relevant limiter is active, if you are enforcing a per-product minimum or maximum.
  • The rule is active and the sync to Shopify is confirmed.
  • You have tested both Shop Pay and the standard checkout with a cart that violates the rule.

On this page