← All notes
E-commerce Development6 min

A buyer journey intercept is not checkout validation

On 2 July 2026 Shopify deprecated useBuyerJourneyIntercept and the block_progress capability on checkout UI extensions. Those hooks felt like validation because they could stop a shopper mid-step. They were not. They were UI code that only ran where the extension mounted. Express wallets and other accelerated paths skip those steps. The replacement — Cart and Checkout Validation Functions — evaluates the cart on Shopify's servers and holds across standard checkout, Shop Pay, Apple Pay, and Google Pay. On Al's Flowers and Provale Cup we treat delivery windows, B2B minimums, and sellability rules as platform facts, not as something a React hook happened to notice.

Intercept is a UI event, not a cart rule

useBuyerJourneyIntercept let an extension inspect the current checkout and call block when a local rule failed. That is useful for messaging and progressive disclosure. It is not the same as declaring that the cart is invalid. The rule lives in the shopper's browser session for surfaces that render your extension.

Shop Pay, Apple Pay, and Google Pay from the product or cart page often never visit the information, shipping, or payment steps your extension was watching. Agentic storefront tools that build a cart and complete purchase have the same gap. If the only place the rule ran was the intercept, those paths never saw it.

We have seen the same shape with delivery windows: a picker that looked closed in the UI still converted if completion skipped the re-check. The delivery-window note already says re-validate at payment time. A Function is how that re-check becomes platform-enforced instead of extension-enforced.

Validation Functions evaluate the cart, not the journey

A Cart and Checkout Validation Function receives a structured cart snapshot and returns validation errors with targets — a field, or the cart itself. Shopify surfaces those errors on the Cart object, in themes that use the cart template, and during checkout. The rule is a fact about the cart, not a reaction to which step the shopper clicked.

That design matches how we already want commerce seams to behave. Minimum order value, case-pack multiples, membership gates, and region refusals are properties of the basket. They should fail the same way whether the buyer walked the long checkout or tapped an express wallet. Shopify's docs call out express checkouts explicitly as surfaces Functions cover.

Discount rejection has its own Function path now. Do not keep an intercept alive just to say a code does not apply to sale items. Put discount policy in the discount Function, put cart policy in the validation Function, and keep the UI extension for presentation.

What the Function can see changes the rule design

Moving a rule server-side changes the available inputs. A UI hook could react to whatever the shopper had just typed. A Function sees what Shopify puts in the input query — and it has a tight execution budget with no casual network calls unless you are on a limited fetch path. Anything live (margin floors, courier pin-code tables, ERP credit) has to be pre-staged into metafields or other cart-visible data before evaluation.

Write rules as cart facts: this line fails a B2B multiple, this destination is not serviceable, this membership tag is missing. Do not write rules as journey narration: the shopper changed address three times. That instinct belonged to the intercept era and does not survive the Function sandbox.

Before scoping, read the input schema for the fields you need — especially customer and delivery address. The most common overrun we see is designing around a field the Function never receives, then bolting on metafield writers mid-flight.

What we check before calling the migration done

Inventory the real rules in plain language: which apps, which custom extensions, which stale campaign caps. Delete what is dead. Rebuild what remains as named validation Functions — prefer a few clear ones over a pile of overlapping Wasm modules nobody can triage when an order rejects.

Test each surviving rule on standard checkout and on every express wallet you accept. Place a Shop Pay order that should fail and confirm it fails. If the theme never rendered Cart validation errors, add that surface so shoppers learn at the cart instead of after address entry.

Confirm the intercept and block_progress paths are gone from the deployed extension, not merely commented out in a branch. Deprecated is not removed yet, but leaving both systems live means two sources of truth and intermittent bypasses that look like flaky QA.

The milestone is simple: a cart that violates a business rule cannot complete on any surface you sell through. Until that is true for wallets as well as the long path, you still have an intercept wearing a validation badge.

Questions

Is useBuyerJourneyIntercept the same as checkout validation?
No. Intercepts are checkout UI extension hooks that run where the extension mounts. Cart and checkout validation Functions run server-side against the cart and cover express wallets and other paths that skip those UI steps.
Do we have to migrate immediately after the July 2026 deprecation?
Shopify has not published a removal date; existing extensions keep working on current and prior API versions. Treat it as planned work — and fix wallet bypasses now, because those holes existed before the deprecation announcement.
Where should live data come from if Functions cannot call the network freely?
Pre-stage values into metafields or other cart-visible inputs before evaluation. The Function reads local input; whatever writes those fields owns freshness. Do not keep the rule in the browser just because an ERP call is easier from the client.

Sources

  1. Shopify — Cart and Checkout Validation Function API — Server-side validation including express checkouts; errors on Cart and checkout.
  2. Shopify Functions — cart checkout validation overview
  3. Related: A delivery window is not a shipping estimate — Re-validate capacity at completion — Functions are the enforcement surface.
  4. Related: Available is not sellable

Have something to build?

Tell us what you're working on and we'll tell you honestly whether we're the right fit.

Work with us