<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.

![A diagram showing the creating and deploying phases in Shopify Functions](/assets/api/functions/create-test-deploy.png)

## 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).