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:
- 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:
- 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?
- 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?
- 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?
- 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!