---
title: Manage fulfillments for prepaid subscriptions
description: >-
  Learn how to manage prepaid subscriptions with scheduled fulfillments based on
  future fulfillment dates.
source_url:
  html: >-
    https://shopify.dev/docs/apps/build/purchase-options/subscriptions/fulfillments/manage-subscription-fulfillments
  md: >-
    https://shopify.dev/docs/apps/build/purchase-options/subscriptions/fulfillments/manage-subscription-fulfillments.md
api_name: admin
---

# Manage fulfillments for prepaid subscriptions

After a prepaid subscription has been billed for, the merchant or customer might want to make changes to the subscription contract or order. For example, they might want to reschedule a shipment or refund one of the scheduled fulfillments.

This guide shows how to manage and make changes to scheduled fulfillments for prepaid subscriptions.

***

## Requirements

**Note:**

* Most subscriptions, pre-order and try before you buy apps need to request API access through the [Partner Dashboard](https://partners.shopify.com/current/apps). We give API access to apps that are designed according to our [principles for subscriptions, pre-order and TBYB apps](https://shopify.dev/docs/apps/build/purchase-options#shopifys-principles).
* Public apps that use subscriptions, pre-order or TBYB need to meet [specific requirements](https://shopify.dev/docs/apps/launch/shopify-app-store/app-store-requirements#purchase-option) to be published on the Shopify App Store.
* Custom apps [created in the Shopify admin](https://shopify.dev/docs/apps/build/authentication-authorization/legacy/admin-custom-apps) can't use subscriptions, pre-order or TBYB because these apps can't use extensions or request access to protected scopes. If you're building a solution for a single store, then [create your custom app in the Dev Dashboard](https://shopify.dev/docs/apps/build/dev-dashboard/create-apps-using-dev-dashboard).

- Your app can make [authenticated requests](https://shopify.dev/docs/api/admin-graphql#authentication) to the GraphQL Admin API.
- Your app has the `merchant_managed_fulfillment_orders` and `third_party_fulfillment_orders` [access scopes](https://shopify.dev/docs/api/usage/access-scopes). Learn how to [configure your access scopes using Shopify CLI](https://shopify.dev/docs/apps/build/cli-for-apps/app-configuration).

* You're familiar with [how prepaid subscriptions work](https://shopify.dev/docs/apps/build/purchase-options/subscriptions/fulfillments).
* You have a prepaid subscription order that has scheduled fulfillment orders.

***

## Manually open a fulfillment order

Merchants can opt to **Fulfill early** for scheduled fulfillments in the Shopify admin. For scheduled fulfillment orders, this changes the fulfillment order's status to `OPEN` ahead of the `fulfillAt` date.

![Early fulfillment for prepaid subscriptions on a fulfillment order in the Shopify admin](https://shopify.dev/assets/assets/images/api/subscriptions/fulfill-early-CxiWeC0I.png)

You can also use the [`fulfillmentOrderOpen`](https://shopify.dev/docs/api/admin-graphql/latest/mutations/fulfillmentorderopen) mutation to set a fulfillment order's status to `OPEN`, as demonstrated in the following example:

## POST https://{shop}.myshopify.com/admin/api/{api\_version}/graphql.json

## GraphQL mutation

```graphql
mutation {
  fulfillmentOrderOpen(id: "gid://shopify/FulfillmentOrder/1899849515064") {
    fulfillmentOrder {
      id
      status
    }
    userErrors {
      field
      message
    }
  }
}
```

## JSON response

```json
{
  "data": {
    "fulfillmentOrderOpen": {
      "fulfillmentOrder": {
        "id": "gid://shopify/FulfillmentOrder/1899849515064",
        "status": "OPEN"
      },
      "userErrors": []
    }
  },
  ...
}
```

***

## Skip a fulfillment order

A customer might want to skip a scheduled fulfillment of a product. For example, in the case of a three-month prepaid coffee subscription, a customer might decide to skip fulfillment because they already have enough coffee that month.

To skip a fulfillment order, you need to reschedule the fulfillment order and change the subscription contract's renewal date if applicable.

### Reschedule a fulfillment order

Pass a new `fulfillAt` date to the [`fulfillmentOrderReschedule`](https://shopify.dev/docs/api/admin-graphql/latest/mutations/fulfillmentorderreschedule) mutation to reschedule a fulfillment order. In this example, the fulfillment order is rescheduled from Feb 15 to Apr 15.

## POST https://{shop}.myshopify.com/admin/api/{api\_version}/graphql.json

## GraphQL mutation

```graphql
mutation {
  fulfillmentOrderReschedule(
    id: "gid://shopify/FulfillmentOrder/1899851251768"
    fulfillAt: "2022-04-15"
  ) {
    fulfillmentOrder {
      fulfillAt
    }
    userErrors {
      field
      message
    }
  }
}
```

## JSON response

```json
{
  "data": {
    "fulfillmentOrderReschedule": {
      "fulfillmentOrder": {
        "fulfillAt": "2022-04-15T00:00:00Z"
      },
      "userErrors": []
    }
  },
  ...
}
```

### Change the contract renewal date

To change the contract renewal date, you can use the [`subscriptionContractSetNextBillingDate`](https://shopify.dev/docs/api/admin-graphql/latest/mutations/subscriptioncontractsetnextbillingdate) mutation. Because the previous example rescheduled a fulfillment order from Feb 15 to Apr 15, the renewal date is changed to May 15 for the following example:

## POST https://{shop}.myshopify.com/admin/api/{api\_version}/graphql.json

## GraphQL mutation

```graphql
mutation {
  subscriptionContractSetNextBillingDate(
    contractId: "gid://shopify/SubscriptionContract/1671224"
    date: "2022-05-15"
  ) {
    contract {
      nextBillingDate
    }
    userErrors {
      field
      message
    }
  }
}
```

## JSON response

```json
{
  "data": {
    "subscriptionContractSetNextBillingDate": {
      "contract": {
        "nextBillingDate": "2022-05-15T00:00:00Z"
      },
      "userErrors": []
    }
  },
  ...
}
```

***

## Refund a scheduled fulfillment

**Caution:**

When you refund fulfillment orders, it doesn't automatically cancel the renewal that's associated with the subscription contract. To cancel the renewal, you also need to [update the subscription contract](https://shopify.dev/docs/apps/build/purchase-options/subscriptions/contracts/update-a-subscription-contract).

A customer might want to refund one or more of their scheduled fulfillments. Fulfillment order cancellations and refunds are processed [in reverse chronological order](https://shopify.dev/docs/apps/build/purchase-options/subscriptions/fulfillments#how-refunds-work). You can pass the `quantity` to the [`refundCreate`](https://shopify.dev/docs/api/admin-graphql/latest/mutations/refundcreate) mutation to determine how many subscription cycles should be cancelled.

The following example cancels the last four months of a six-month prepaid subscription:

## POST https://{shop}.myshopify.com/admin/api/{api\_version}/graphql.json

## GraphQL mutation

```graphql
mutation {
  refundCreate(
    input: {
      orderId: "gid://shopify/Order/2067697074232"
      refundLineItems: {
        lineItemId: "gid://shopify/LineItem/4780880232504"
        quantity: 4
        restockType: CANCEL
        locationId: "gid://shopify/Location/9562054"
      }
    }
  ) {
    refund {
      id
    }
    userErrors {
      field
      message
    }
  }
}
```

## JSON response

```json
{
  "data": {
    "refundCreate": {
      "refund": {
        "id": "gid://shopify/Refund/659856"
      },
      "userErrors": []
    }
  },
  ...
}
```

***

## Next steps

* Learn how to [manage orders for prepaid subscriptions](https://shopify.dev/docs/apps/build/purchase-options/subscriptions/fulfillments/sync-orders-subscriptions) by keeping subscription contract and order information in sync.

***
