---
title: Updating to 2024-07
description: >+
Some checkouts may be created with [cart
instructions](/docs/api/checkout-ui-extensions/apis/cart-instructions) that
prevent buyers from making certain changes to their checkout.
As of version `2024-07`, UI extensions must check for instructions before
calling select APIs, to properly handle checkouts where those APIs are not
available.
> Caution: As of **July 22nd, 2024**, all UI extensions on this version will
render in **draft order** invoice checkouts. As draft order invoice checkouts
have restrictions on what buyers can edit, UI extensions in draft order
invoice checkouts will be subject to cart instructions.
api_version: 2024-07
api_name: checkout-ui-extensions
source_url:
html: >-
https://shopify.dev/docs/api/checkout-ui-extensions/2024-07/instructions-update
md: >-
https://shopify.dev/docs/api/checkout-ui-extensions/2024-07/instructions-update.md
---
# Updating to 2024-07
Some checkouts may be created with [cart instructions](https://shopify.dev/docs/api/checkout-ui-extensions/apis/cart-instructions) that prevent buyers from making certain changes to their checkout.
As of version `2024-07`, UI extensions must check for instructions before calling select APIs, to properly handle checkouts where those APIs are not available.
Caution
As of **July 22nd, 2024**, all UI extensions on this version will render in **draft order** invoice checkouts. As draft order invoice checkouts have restrictions on what buyers can edit, UI extensions in draft order invoice checkouts will be subject to cart instructions.
***
## Required instruction checking
You will need to check for cart instructions before calling the following APIs:
| Extension API | As of July 2024 |
| - | - |
| applyAttributeChange() | Attributes cannot be modified on draft order checkouts. |
| applyShippingAddressChange() | Buyers cannot change the address on a draft order checkout if it has fixed shipping rates. |
| applyDiscountCodeChange() | By default, discounts cannot be modified in draft order checkouts. Merchants must allow it via a setting on the draft order. |
| applyCartLinesChange() | Cart lines cannot be modified on draft order checkouts. |
| applyMetafieldChange() | Cart metafields cannot be modified on draft order checkouts. Metafields can still be modified. |
| applyNoteChange() | Notes cannot be modified on draft order checkouts. |
Caution
If you don't check for instructions, the APIs will return an error when they're not available in a given checkout
[Learn more - Cart Instructions API](https://shopify.dev/docs/api/checkout-ui-extensions/apis/cart-instructions)
## Checking for cart instructions
Use the cart instructions API to determine if the affected APIs are available in checkout.
Changes to applyAttributeChange()
Check `instructions.attributes.canUpdateAttributes` before calling `applyAttributeChange()`.
Changes to applyShippingAddressChange()
Check `instructions.delivery.canSelectCustomAddress` before calling `applyShippingAddressChange()`. When `true`, this instruction implies that extensions can change the shipping address.
Changes to applyDiscountCodeChange()
Check `instructions.discounts.canUpdateDiscountCodes` before calling `applyDiscountCodeChange()`.
Changes to applyCartLinesChange()
Check `instructions.lines.canAddCartLine` or `instructions.lines.canRemoveCartLine` or `instructions.lines.canUpdateCartLine` before calling `applyCartLinesChange()`.
Changes to applyMetafieldChange()
Check `instructions.metafields.canSetCartMetafields` or `instructions.metafields.canDeleteCartMetafields` before calling `applyMetafieldChange()` if you are working with cart metafields.
Changes to applyNoteChange()
Check `instructions.notes.canUpdateNote` before calling `applyNoteChange()`.
### Examples
* #### Migrating applyAttributeChange()
##### React
```jsx
import {
Banner,
Button,
useApplyAttributeChange,
useInstructions,
reactExtension,
} from '@shopify/ui-extensions-react/checkout';
export default reactExtension(
'purchase.checkout.block.render',
() => ,
);
function Extension() {
const applyAttributeChange =
useApplyAttributeChange();
const instructions = useInstructions();
if (
instructions.attributes.canUpdateAttributes
) {
return (
);
} else {
return (
Loyalty points are unavailable
);
}
}
```
##### JavaScript
```js
import {
extension,
Banner,
Button,
} from '@shopify/ui-extensions/checkout';
export default extension(
'purchase.checkout.block.render',
(root, api) => {
if (
api.instructions.current.attributes
.canUpdateAttributes
) {
root.appendChild(
root.createComponent(
Button,
{
onPress: () =>
api.applyAttributeChange({
type: 'updateAttribute',
key: 'loyaltyPoints',
value: '100',
}),
},
'Apply 100 loyalty points',
),
);
} else {
root.appendChild(
root.createComponent(
Banner,
{},
'Loyalty points are unavailable',
),
);
}
},
);
```