<aside class="note"> <h4>Functions availability</h4> <ul> <li>Users that have <a href="/docs/storefronts/themes/architecture/layouts/checkout-liquid"><code>checkout.liquid</code></a> customizations need to <a href="https://help.shopify.com/manual/checkout-settings/checkout-extensibility/checkout-upgrade">upgrade to Checkout Extensibility</a> to use Function APIs.</li> <li>Stores on any plan can use public apps that are distributed through the Shopify App Store and contain functions. Only stores on a <a href="https://help.shopify.com/manual/intro-to-shopify/pricing-plans/plans-features/shopify-plus-plan">Shopify Plus plan</a> can use <a href="https://help.shopify.com/manual/apps/app-types/custom-apps">custom apps</a> that contain <a href="/docs/api/functions">Shopify Function APIs</a>.</li> <li>Some Shopify Functions capabilities are available only to stores on a <a href="https://help.shopify.com/manual/intro-to-shopify/pricing-plans/plans-features/shopify-plus-plan">Shopify Plus plan</a>. See <a href="/docs/api/functions#availability-of-shopify-functions">Shopify Function APIs</a> for details.</li> </ul> </aside> Shopify Functions allow developers to customize the backend logic of Shopify. This guide introduces how Shopify Functions work and the benefits of using Shopify Functions. <iframe width="100%" height="500" src="https://www.youtube.com/embed/wNdvxLzWUQg?start=63" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> ## How Shopify Functions work Function [extension targets](/docs/apps/build/app-extensions/configure-app-extensions#targets) inject code into the backend logic of Shopify. The following diagram shows how Shopify invokes a function which has been configured for an extension target: <figure class="figure"><img src="https://cdn.shopify.com/shopifycloud/shopify_dev/assets/api/functions/extension-targets-fd4d16999fcf93df9859a3ab25d2e00e40cee1b59ff2e58c8b0c33a861f30f4f.png" class="lazyload" alt="A diagram showing how Shopify invokes a function which has been configured for an extension target." width="80%" height="2048"></figure> - **Function input:** The [function input](/docs/apps/build/functions/input-output#input) is a JSON object which is the result of a GraphQL input query you define. Input queries allow you to select the specific data you need for your function, such as cart line product data or metafields. - **Function logic:** The function logic is written in any language that can compile a WebAssembly module which meets [function requirements](/docs/apps/build/functions/programming-languages/webassembly-for-functions). Function templates and client libraries are available for [Rust](/docs/apps/build/functions/programming-languages/rust-for-functions) and [JavaScript](/docs/apps/build/functions/programming-languages/javascript-for-functions). > Caution: > Shopify strongly recommends [Rust](/docs/apps/build/functions/programming-languages/rust-for-functions) as the most performant language choice to avoid your function failing with large carts. - **Function output:** The [function output](/docs/apps/build/functions/input-output#output) is a JSON document that describes the operations you'd like Shopify to carry out. GraphQL schemas provided by Shopify specify the targets, available inputs, and expected outputs for a [Functions API](/docs/api/functions). ## Lifecycle of a Shopify Function The following diagram shows an example lifecycle of a Shopify Function: - **App developers** create and deploy apps that contain functions. - **Merchants** install the app on their Shopify store and configure the function. An API call is made with the function configuration. - **Customers** interact with a Shopify store and **Shopify** executes the function. For example, an app developer might create and deploy an app with a function that defines a new discount type. The merchant can then install the app on their Shopify store and create a new discount from a discount type provided by the app. Shopify executes the function to calculate the discount when a customer adds a product to their cart. Shopify Functions are never invoked directly by URL or otherwise. Shopify invokes them as-needed within the customer journey.  ## Getting started Learn how to use Shopify Functions by following one of our use case tutorials: <div class="resource-card-grid"> <div> <a class="resource-card" href="/docs/apps/build/discounts/build-discount-function" data-theme-mode=""> <div class="resource-card__indicator-container"><img src="/assets/resource-cards/heart" data-alt-src="/assets/resource-cards/heart-dark" aria-hidden="true" class="resource-card__icon themed-image"></div> <h3 class="resource-card__title"> Build a discount function </h3> <p class="resource-card__description">Use Shopify Functions to create a new discount type for users.</p> </a> </div></p> <p><div> <a class="resource-card" href="/docs/apps/build/checkout/payments/create-payments-function" data-theme-mode=""> <div class="resource-card__indicator-container"><img src="/assets/resource-cards/coin" data-alt-src="/assets/resource-cards/coin-dark" aria-hidden="true" class="resource-card__icon themed-image"></div> <h3 class="resource-card__title"> Create a payments function </h3> <p class="resource-card__description">Use Shopify Functions to hide a payment option offered to customers at checkout.</p> </a> </div></p> <p><div> <a class="resource-card" href="/docs/apps/build/checkout/delivery-shipping/delivery-options/build-function" data-theme-mode=""> <div class="resource-card__indicator-container"><img src="/assets/resource-cards/globe" data-alt-src="/assets/resource-cards/globe-dark" aria-hidden="true" class="resource-card__icon themed-image"></div> <h3 class="resource-card__title"> Build a delivery options function </h3> <p class="resource-card__description">Use Shopify Functions to rename a delivery option offered to customers at checkout.</p> </a> </div></p> <p><div> <a class="resource-card" href="/docs/apps/build/checkout/cart-checkout-validation/create-server-side-validation-function" data-theme-mode=""> <div class="resource-card__indicator-container"><img src="/assets/resource-cards/storefront" data-alt-src="/assets/resource-cards/storefront-dark" aria-hidden="true" class="resource-card__icon themed-image"></div> <h3 class="resource-card__title"> Create a server-side validation function </h3> <p class="resource-card__description">Use Shopify Functions to block progress on a checkout when the cart line quantities exceed a limit.</p> </a> </div></p> <p><div> <a class="resource-card" href="/docs/apps/build/orders-fulfillment/order-routing-apps/location-rules/build-location-rule-function" data-theme-mode=""> <div class="resource-card__indicator-container"><img src="/assets/resource-cards/growth" data-alt-src="/assets/resource-cards/growth-dark" aria-hidden="true" class="resource-card__icon themed-image"></div> <h3 class="resource-card__title"> Build a location rule function </h3> <p class="resource-card__description">Use Shopify Functions to choose a different order location during checkout.</p> </a> </div></p> <p><div> <a class="resource-card" href="/docs/apps/build/product-merchandising/bundles/add-customized-bundle-function" data-theme-mode=""> <div class="resource-card__indicator-container"><img src="/assets/resource-cards/hearts" data-alt-src="/assets/resource-cards/hearts-dark" aria-hidden="true" class="resource-card__icon themed-image"></div> <h3 class="resource-card__title"> Add a customized bundle function </h3> <p class="resource-card__description">Use Shopify Functions to group products together and sell them as a single unit.</p> </a> </div></p> <p><div> <a class="resource-card" href="/docs/apps/build/orders-fulfillment/order-routing-apps/build-fulfillment-constraints-function" data-theme-mode=""> <div class="resource-card__indicator-container"><img src="/assets/resource-cards/tutorial" data-alt-src="/assets/resource-cards/tutorial-dark" aria-hidden="true" class="resource-card__icon themed-image"></div> <h3 class="resource-card__title"> Build a fulfillment constraints function </h3> <p class="resource-card__description">Use Shopify Functions to customize fulfillment and delivery strategies.</p> </a> </div></p> <p><div> <a class="resource-card" href="/docs/apps/build/orders-fulfillment/order-routing-apps/build-local-pickup-options-function" data-theme-mode=""> <div class="resource-card__indicator-container"><img src="/assets/resource-cards/build" data-alt-src="/assets/resource-cards/build-dark" aria-hidden="true" class="resource-card__icon themed-image"></div> <h3 class="resource-card__title"> Build a local pickup options function </h3> <p class="resource-card__description">Use Shopify Functions to generate local pickup delivery options at checkout.</p> </a> </div></p> <p><div> <a class="resource-card" href="/docs/apps/build/checkout/delivery-shipping/delivery-methods/create-local-pickup-charges-function" data-theme-mode=""> <div class="resource-card__indicator-container"><img src="/assets/resource-cards/gear" data-alt-src="/assets/resource-cards/gear-dark" aria-hidden="true" class="resource-card__icon themed-image"></div> <h3 class="resource-card__title"> Create a local pickup charges function </h3> <p class="resource-card__description">Use Shopify Functions to create local pickup charges at checkout.</p> </a> </div></p> <p><div> <a class="resource-card" href="/docs/apps/build/checkout/delivery-shipping/delivery-methods/generate-pickup-points" data-theme-mode=""> <div class="resource-card__indicator-container"><img src="/assets/resource-cards/gear" data-alt-src="/assets/resource-cards/gear-dark" aria-hidden="true" class="resource-card__icon themed-image"></div> <h3 class="resource-card__title"> Generate a pickup points function </h3> <p class="resource-card__description">Use Shopify Functions to generate pickup point delivery options at checkout.</p> </a> </div> </div> ## Developer tools and resources Explore the developer tools and resources available for Shopify Functions. <div class="resource-card-grid"> <div> <a class="resource-card" href="/docs/api/functions" data-theme-mode=""> <div class="resource-card__indicator-container"><img src="/assets/resource-cards/graphql" data-alt-src="/assets/resource-cards/graphql-dark" aria-hidden="true" class="resource-card__icon themed-image"></div> <h3 class="resource-card__title"> Shopify Function APIs reference </h3> <p class="resource-card__description">Learn about the available APIs for Shopify Functions.</p> </a> </div></p> <p><div> <a class="resource-card" href="/docs/apps/build/functions/programming-languages" data-theme-mode=""> <div class="resource-card__indicator-container"><img src="/assets/resource-cards/rust" data-alt-src="/assets/resource-cards/rust-dark" aria-hidden="true" class="resource-card__icon themed-image"></div> <h3 class="resource-card__title"> Language support </h3> <p class="resource-card__description">Learn about the language support and tooling that are available in Shopify Functions.</p> </a> </div> </div> ## API versions Function APIs are [versioned](/docs/api/usage/versioning). Updates are released quarterly, and you can find details about changes in the [developer changelog](https://shopify.dev/changelog). [Learn how to update to a new version of a Function API](/docs/apps/build/functions/input-output#api-versions). ## Limitations and considerations The following limitations and considerations apply to all functions: - Apps can reference only their own functions in GraphQL Admin API mutations, such as [`discountAutomaticAppCreate`](/docs/api/admin-graphql/latest/mutations/discountAutomaticAppCreate) and [`cartTransformCreate`](/docs/api/admin-graphql/latest/mutations/cartTransformCreate). Referencing a function from another app results in a `Function not found` error. - Shopify doesn't allow nondeterminism in functions, which means that you can't use any randomizing or clock functionality in your functions. - You can't debug your function by printing out `STDOUT`, which is reserved for function output. Use `STDERR` instead. - Apps that provide dynamic editing and execution of function code aren't permitted on the Shopify App Store. - Network access is supported for some functions, refer to [network access](/docs/apps/build/functions/input-output/network-access) for more information. You can also pre-populate data by using metafields on products and customers, or passing data using cart attributes. ## Resource limits > Note: > Function resource limits treat 1 kilobyte (kB) as 1000 bytes. ### Fixed limits The following resource limits apply to all functions: | Resource | Limit | |-|-| | Compiled binary size | 256 kB | | Runtime linear memory | 10,000 kB | | Runtime stack memory | 512 kB | | Logs written to `STDERR` | 1 kB (truncated) | ### Dynamic limits Certain limits are dynamic and scale based on the number of line items in a cart. The following resource limits apply to all functions for carts with up to 200 line items: | Resource | Limit (up to 200 line items) | |-|-| | Execution [instruction count](https://webassembly.github.io/spec/core/syntax/instructions.html) | 11 million instructions | | Function input | 128 kB | | Function output | 20 kB | For carts with more than 200 line items, these values will scale proportionally as the number of cart lines increases. Calculated limits for a function execution are available in your Partner Dashboard and can be [tested with Shopify CLI](/docs/apps/build/functions/test-debug-functions#execute-the-function-locally-using-shopify-cli). ## Deleting functions To delete a Shopify Function, you need to remove the relevant files from your app's `/extensions` directory, and then redeploy your app. [Learn more about removing a Shopify Function](/docs/apps/build/app-extensions/remove-app-extension#remove-a-cli-managed-app-extension). When you delete a function, the following behavior occurs: - The function, including all associated [function owners](/docs/apps/build/functions/input-output/metafields-for-input-queries#how-it-works), is permanently deleted. - The function no longer runs, and becomes inaccessible to any Shopify stores that have your app installed. ## Next steps - Learn about how data is [input to and output from Shopify Functions](/docs/apps/build/functions/input-output). - Explore [the references for each Function API](/docs/api/functions).