EU withdrawal (Directive 2023/2673) on subscription contracts -- does the native self-serve flow cover recurring billing, and how should an app coordinate with it?

Hi all,

I’m building an app that grants a customer access to gated content while a subscription (created via the Subscriptions API / selling plans) stays active. When the subscription is cancelled, the app reacts to the relevant webhook to revoke access and reconcile the customer’s internal state (entitlements, credit balances).

With EU Directive 2023/2673 in force since June 19, 2026, I’ve already built a full custom withdrawal flow for these subscriptions (consent gate on first download, in-window contract cancellation, credit reconciliation, and a merchant-side reimbursement queue). I built it custom because, at the time, the native self-serve flow didn’t appear to cover subscription contracts. Before I keep relying on it, I want to confirm what Shopify provides natively now and whether my flow risks conflicting with it. This is a technical/API question — not looking for legal advice, just webhook and API behavior.

The foundational question first:

  1. Does Shopify’s native self-serve returns/cancellations flow currently cover subscription contracts / recurring billing, or is it still scoped to one-time orders? This is the foundational one: if it doesn’t cover subscription contracts, my existing custom flow stays the right approach and questions 2–5 are moot. If it does now, I need to understand how my flow should coexist with it.

If it does cover subscription contracts:

  1. When a customer completes a withdrawal through the native flow on a subscription contract, is there any way to distinguish that event from a regular merchant-initiated cancellation — a dedicated webhook topic, a flag on the payload, anything? Or do both land on the same cancellation webhook with no distinguishing signal?
  2. If an app already has its own logic reacting to subscription cancellation (revoking access, adjusting internal balances/entitlements) and the merchant also has the native withdrawal function enabled, is there a risk of the two paths being uncoordinated — e.g. the native flow processing a refund before the app has reconciled its own state, or the app’s logic firing on the event without knowing it originated from a customer withdrawal specifically?
  3. Is there a recommended integration pattern for apps that gate access on subscription status to hook into the native withdrawal flow correctly, rather than building a fully separate parallel mechanism that might conflict with it?
  4. On the integration contract specifically: does the native withdrawal flow emit a distinct event an app is expected to react to, or is reacting to the standard subscription-cancellation webhook the intended way to pick up a customer-initiated withdrawal? I want to make sure I’m listening on the right signal and not missing one the platform expects apps to handle.

Any pointers to docs, webhook topics, or experience from other partners dealing with recurring billing + EU withdrawal would be a big help. Thanks!

Hey @ZioLou :waving_hand:

Just confirming this from the product/API side rather than as legal guidance: our self-serve returns/cancellations flow is for return/cancellation requests on the underlying order/items. Basically, when a cancellation request relates to a subscription order, processing that order cancellation doesn’t cancel the subscription contract itself: Setting up self-serve returns and cancellations.

So for an app that gates access based on a subscription contract, you’ll still want to handle the subscription-contract cancellation path separately. The Admin API surface for that is subscriptionContractCancel, and the cancellation state change is exposed through subscription_contracts/cancel.

If your app needs to distinguish a customer withdrawal flow from another cancellation source, the safest technical pattern is to record that context in your app before cancelling the contract, then make your webhook handler idempotent so it can reconcile entitlements/access from the contract cancellation event without double-processing.

For broader merchant setup context, Shopify’s Help Center page is here: EU right of withdrawal. For legal/compliance interpretation, merchants and partners should work with their own counsel.

Hope this helps! Let me know if I can clarify anything on our end here.