Detect self-serve cancellation request submission via webhook or API

I’m trying to detect when a customer submits a self-serve cancellation request in Shopify.

As far as I can tell, there is no dedicated webhook/event for that moment. I did find fulfillment_orders/cancellation_request_submitted, but that seems to be a different flow between merchant/app and fulfillment service, not customer → merchant.

For fulfilment integrations, this is pretty important: a cancellation request can already be open while the order is still moving through picking or shipping prep. In that situation, we’d want to pause fulfilment before the request is approved or rejected.

I also noticed that self-serve returns do have a webhook model, so I’m wondering whether something similar exists or is planned for self-serve cancellations.

Is there currently a supported way to detect:

  • a self-serve cancellation request being submitted
  • the request being approved or rejected
  • whether the outcome is a full cancellation or a partial cancellation/refund

Or is this not exposed yet?

Hi,

having the same issue. The only workaround I’ve found so far of getting any information on this is by actively scanning the events as at least the request is recorded as a BasicEvent with the action “requested_edit_requested”:

$ curl -sS -X POST \
  "https://DOMAIN.myshopify.com/admin/api/VERSION/graphql.json" \
  -H "Content-Type: application/json" \
  -H "X-Shopify-Access-Token: $SHOPIFY_TOKEN" \
  -d '{ "query": "query { events(first: 100, query: \"action:requested_edit_requested subject_type:ORDER\") { edges { node { __typename id createdAt action message ... on BasicEvent { subjectType subject { __typename ... on Order { id name } } } } } } }" }' 

The response contains something like:

  "data": {
    "events": {
      "edges": [
        {
          "node": {
            "__typename": "BasicEvent",
            "id": "gid://shopify/BasicEvent/ID",
            "createdAt": "TIME",
            "action": "requested_edit_requested",
            "message": "NAME requested cancellation of 3 items.",
            "subjectType": "ORDER",
            "subject": {
              "__typename": "Order",
              "id": "gid://shopify/Order/ID",
              "name": "NAME"
            }
          }
        },
        {
          "node": {
            "__typename": "BasicEvent",
            "id": "gid://shopify/BasicEvent/ID",
            "createdAt": "TIME",
            "action": "requested_edit_requested",
            "message": "NAME requested cancellation of 4 items.",
            "subjectType": "ORDER",
            "subject": {
              "__typename": "Order",
              "id": "gid://shopify/Order/ID",
              "name": "NAME"
            }
          }
        },

Remaining issue:

  • this has to be actively polled for, definitely needs a webhook topic ASAP
  • I cannot figure out how to identify which X items were requested, only that a request was submitted

I hope we get something backwards compatible soon, not just for the 2026-10 or 2027-01 release.

Please let me know if anyone figures out how to get info on the specific items.

+1 for this. We need something as well that we can use to automate putting the order on hold until customer service has a chance to review the request. There’s not even a way to trigger a Flow in the Flow app when there is a cancel request. There is one for a return request but not a cancellation request.

If you are using B2B companies setup, you can setup “Submit all order as draft for reviews” to solve thst problem.

Hello there @Jules_Picqer
Currently Shopify does not provide a specific webhook for the self serve cancellation request step. When cancelled_at is set, you only receive events downstream such as orders canceled, refunds created, or order updated. To get ahead, most partners create a hack with a custom cancel flow or app proxy button that writes a tag or metafield on the order prior to Shopify cancelling. Then, using fulfilment holds or rules in Shopify Flow, you can pause fulfillment until you have received final confirmation of the cancellation or rejection. This is the best pattern to use right now.

Not B2B. We are allowing self-serve cancellations on the site to comply with the new EU laws.