> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.ordergroove.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.ordergroove.com/_mcp/server.

# Hiding inactive subscriptions in the Subscription Manager

The Subscription Manager lists a customer's canceled subscriptions in its Inactive Subscriptions section, where the customer can reactivate them. Some subscriptions shouldn't be offered again, such as a gift subscription that has delivered its last order or a subscription to a product you've discontinued. To hide one, add `"hide": true` to the subscription's `extra_data` with the API.

Themes on [Subscription Manager 25.5.0](/lifecycle/sm/templates-changelog#v2550) or later support this already, so there's no theme code to change.

---

## What hiding does

Hiding only changes what the Subscription Manager shows:

* The subscription no longer appears in the Inactive Subscriptions section, so the customer can't see it or reactivate it there.
* The subscription itself doesn't change. It stays canceled, and you can still reactivate it with the [Reactivate subscription](/reference/rest-rpc-api/subscriptions/reactivate) endpoint.
* The flag stays in `extra_data` until you remove it. If you reactivate a hidden subscription, it shows as active like any other, and it's hidden again if it's canceled later.

---

## Before you start

You'll need:

* A theme on Subscription Manager 25.5.0 or later. Check your live theme's version in [Ordergroove](https://rc3.ordergroove.com/) > **Subscriptions** > **Subscription Manager**. If it's older, see [Themes earlier than 25.5.0](#themes-earlier-than-2550).
* An Application API key, passed in the `x-api-key` header. See [Authentication](/api-reference/authentication).
* The public ID of each subscription you want to hide.

---

## Hide a subscription

Updating `extra_data` replaces the whole field, so any key you leave out is deleted. Read the current value first, add `hide` to it, and send everything back:

1. Get the subscription with [Retrieve subscription](/reference/rest-rpc-api/subscriptions/retrieve) and copy its `extra_data`:

   ```bash
   curl --request GET \
     --url https://restapi.ordergroove.com/subscriptions/<SUBSCRIPTION_ID>/ \
     --header 'x-api-key: <YOUR_API_KEY>'
   ```

   In this example, the subscription already stores a fulfillment counter:

   **`Response (excerpt)`**

   ```json title="Response (excerpt)"
   "extra_data": {
     "fulfillment_counter": "2"
   }
   ```

2. Add `"hide": true` to the existing keys and send the full object to [Update subscription](/reference/rest-rpc-api/subscriptions/update):

   ```bash
   curl --request PATCH \
     --url https://restapi.ordergroove.com/subscriptions/<SUBSCRIPTION_ID>/update/ \
     --header 'x-api-key: <YOUR_API_KEY>' \
     --header 'content-type: application/json' \
     --data '{
       "extra_data": {
         "fulfillment_counter": "2",
         "hide": true
       }
     }'
   ```

   If `extra_data` was empty (`{}`), send `{"extra_data": {"hide": true}}`.

3. Check that the response's `extra_data` includes `"hide": true` alongside your existing keys.

The subscription is hidden the next time the customer loads the Subscription Manager.

> **Keep the keys you didn't add**
>
> Copy every existing key exactly, including ones you don't recognize. Ordergroove and your other integrations store data in `extra_data` too. For example, Shopify subscriptions keep their contract ID in `shopify_contract_id`, and changing it changes which Shopify contract the subscription is linked to.

### Format rules

The Subscription Manager only recognizes the flag when it's sent in this shape:

* Send `extra_data` as a JSON object, as in the example above. A JSON-encoded string such as `"{\"hide\": true}"` is saved as plain text, and the subscription stays visible.
* Use the boolean `true`, not the string `"true"`. The Subscription Manager hides a subscription for any value that isn't empty, so even the string `"false"` hides it.
* Keep the whole `extra_data` value under 1,024 characters when written out as JSON. A longer value returns a `400` error.

---

## Show a hidden subscription again

Send `extra_data` again without the `hide` key, keeping the other keys as they are. Setting `"hide": false` also works.

---

## Hide many subscriptions

To find candidates, call [List subscriptions](/reference/rest-rpc-api/subscriptions/list) with `live=False`, which returns inactive subscriptions. Listing subscriptions across customers requires an Application API key with the Bulk Operations permission. Each subscription in the response includes its `extra_data`, so you can build each update from it. Then send one update per subscription, as in step 2 above.

---

## Themes earlier than 25.5.0

If your theme is on a version 25 release earlier than 25.5.0, you can add the filter yourself in the [Advanced Editor](/lifecycle/sm/advanced-editor):

1. Locate your live theme in **Ordergroove** > **Subscriptions** > **Subscription Manager** and click **Copy** to create a draft theme. You'll make the change on the draft.

2. Open the draft theme, click the **Advanced** tab, and then **Views**.

3. Open `inactive-subscriptions/main.liquid` and find this line:

   ```liquid
   {% for subscription in subscriptions | reject('live') %}
   ```

4. Replace it with:

   ```liquid
   {% for subscription in subscriptions | reject('live') | reject('extra_data.hide') %}
   ```

5. Preview the draft, then publish it.

If your theme is on 25.5.0 or later but your team has customized `inactive-subscriptions/main.liquid`, check that the loop still includes `reject('extra_data.hide')`.

This guide doesn't cover legacy version 0 themes.