--- title: Update discount codes description: Use a cart handler to apply discount codes. source_url: html: 'https://shopify.dev/docs/storefronts/headless/hydrogen/cart/discount-codes' md: >- https://shopify.dev/docs/storefronts/headless/hydrogen/cart/discount-codes.md --- ExpandOn this page * [Requirements](https://shopify.dev/docs/storefronts/headless/hydrogen/cart/discount-codes.md#requirements) * [Step 1: Create a discount code form](https://shopify.dev/docs/storefronts/headless/hydrogen/cart/discount-codes.md#step-1-create-a-discount-code-form) * [Step 2: Handle the discount code form request](https://shopify.dev/docs/storefronts/headless/hydrogen/cart/discount-codes.md#step-2-handle-the-discount-code-form-request) * [Next steps](https://shopify.dev/docs/storefronts/headless/hydrogen/cart/discount-codes.md#next-steps) # Update discount codes This guide shows you how to use a cart handler to apply discount codes to a cart. *** ## Requirements * You've completed the [quickstart guide](https://shopify.dev/docs/storefronts/headless/hydrogen/getting-started). * You've [set up a cart handler](https://shopify.dev/docs/storefronts/headless/hydrogen/cart/setup). *** ## Step 1: Create a discount code form Use the [`CartForm`](https://shopify.dev/docs/api/hydrogen/latest/components/cartform) to create a discount code form. You can use this component anywhere in the app. It will submit a form request to the `/cart` route's action when a visitor submits a discount code. ## File ## /app/components/DiscountCodeForm.jsx ```jsx import {CartForm} from '@shopify/hydrogen'; export default function DiscountCodeForm({discountCodes}) { const codes: string[] = discountCodes ?.filter((discount) => discount.applicable) ?.map(({code}) => code) || [] return ( ); } ``` ```jsx import {CartForm} from '@shopify/hydrogen'; import type {Cart} from '@shopify/hydrogen/storefront-api-types'; export default function DiscountCodeForm({discountCodes}: { discountCodes: Cart['discountCodes']; }) { const codes: string[] = discountCodes ?.filter((discount) => discount.applicable) ?.map(({code}) => code) || [] return ( ); } ``` ##### JavaScript ``` import {CartForm} from '@shopify/hydrogen'; export default function DiscountCodeForm({discountCodes}) { const codes: string[] = discountCodes ?.filter((discount) => discount.applicable) ?.map(({code}) => code) || [] return ( ); } ``` ##### TypeScript ``` import {CartForm} from '@shopify/hydrogen'; import type {Cart} from '@shopify/hydrogen/storefront-api-types'; export default function DiscountCodeForm({discountCodes}: { discountCodes: Cart['discountCodes']; }) { const codes: string[] = discountCodes ?.filter((discount) => discount.applicable) ?.map(({code}) => code) || [] return ( ); } ``` *** ## Step 2: Handle the discount code form request Handle the discount code form request in an `action`. Use the `cart`, created from [`createCartHandler`](https://shopify.dev/docs/api/hydrogen/latest/utilities/createcarthandler), to handle cart mutation requests to the Storefront API. ## File ## /app/routes/cart.jsx ```jsx import {CartForm} from '@shopify/hydrogen'; import invariant from 'tiny-invariant'; export async function action({request, context}) { const {cart} = context; const formData = await request.formData(); const {action, inputs} = CartForm.getFormInput(formData); let result; switch(action) { case CartForm.ACTIONS.DiscountCodesUpdate: const formDiscountCode = formData.get('discountCode'); // User inputted discount code const discountCodes = ( formDiscountCode ? [formDiscountCode] : [] ) as string[]; // Combine with discount codes already applied on cart discountCodes.push(...inputs.discountCodes); result = await cart.updateDiscountCodes(discountCodes); break; default: invariant(false, `${action} cart action is not defined`); } // The Cart ID might change after each mutation, so update it each time. const headers = cart.setCartId(result.cart.id); return json( result, {status: 200, headers}, ); } ``` ```jsx import { type CartQueryData, CartForm, } from '@shopify/hydrogen'; import invariant from 'tiny-invariant'; export async function action({request, context}: ActionArgs) { const {cart} = context; const formData = await request.formData(); const {action, inputs} = CartForm.getFormInput(formData); let result: CartQueryData; switch(action) { case CartForm.ACTIONS.DiscountCodesUpdate: const formDiscountCode = formData.get('discountCode'); // User inputted discount code const discountCodes = ( formDiscountCode ? [formDiscountCode] : [] ) as string[]; // Combine with discount codes already applied on cart discountCodes.push(...inputs.discountCodes); result = await cart.updateDiscountCodes(discountCodes); break; default: invariant(false, `${action} cart action is not defined`); } // The Cart ID might change after each mutation, so update it each time. const headers = cart.setCartId(result.cart.id); return json( result, {status: 200, headers}, ); } ``` ##### JavaScript ``` import {CartForm} from '@shopify/hydrogen'; import invariant from 'tiny-invariant'; export async function action({request, context}) { const {cart} = context; const formData = await request.formData(); const {action, inputs} = CartForm.getFormInput(formData); let result; switch(action) { case CartForm.ACTIONS.DiscountCodesUpdate: const formDiscountCode = formData.get('discountCode'); // User inputted discount code const discountCodes = ( formDiscountCode ? [formDiscountCode] : [] ) as string[]; // Combine with discount codes already applied on cart discountCodes.push(...inputs.discountCodes); result = await cart.updateDiscountCodes(discountCodes); break; default: invariant(false, `${action} cart action is not defined`); } // The Cart ID might change after each mutation, so update it each time. const headers = cart.setCartId(result.cart.id); return json( result, {status: 200, headers}, ); } ``` ##### TypeScript ``` import { type CartQueryData, CartForm, } from '@shopify/hydrogen'; import invariant from 'tiny-invariant'; export async function action({request, context}: ActionArgs) { const {cart} = context; const formData = await request.formData(); const {action, inputs} = CartForm.getFormInput(formData); let result: CartQueryData; switch(action) { case CartForm.ACTIONS.DiscountCodesUpdate: const formDiscountCode = formData.get('discountCode'); // User inputted discount code const discountCodes = ( formDiscountCode ? [formDiscountCode] : [] ) as string[]; // Combine with discount codes already applied on cart discountCodes.push(...inputs.discountCodes); result = await cart.updateDiscountCodes(discountCodes); break; default: invariant(false, `${action} cart action is not defined`); } // The Cart ID might change after each mutation, so update it each time. const headers = cart.setCartId(result.cart.id); return json( result, {status: 200, headers}, ); } ``` *** ## Next steps * Learn how to [apply selected delivery options](https://shopify.dev/docs/storefronts/headless/hydrogen/cart/selected-delivery-options). *** * [Requirements](https://shopify.dev/docs/storefronts/headless/hydrogen/cart/discount-codes.md#requirements) * [Step 1: Create a discount code form](https://shopify.dev/docs/storefronts/headless/hydrogen/cart/discount-codes.md#step-1-create-a-discount-code-form) * [Step 2: Handle the discount code form request](https://shopify.dev/docs/storefronts/headless/hydrogen/cart/discount-codes.md#step-2-handle-the-discount-code-form-request) * [Next steps](https://shopify.dev/docs/storefronts/headless/hydrogen/cart/discount-codes.md#next-steps)