Chat

Join Our Latest Webinar: Warehouse-Free Returns: Optimizing U.S. Logistics for Global Brands on Wednesday (12/04) @ 2-3pm EST!

Register for Event

February 17, 2024

8

min read

Shopify Development Hacks : Environment Variable in Checkout UI Extension

Aisya Aziz

Director of Engineering

Checkout UI Extension does not support environment variables since the extension runs in a sandbox on the browser. This becomes super frustrating as there are so many cases where we would need to modify the variables based on the environment. Here's a way to do it Shopify-style!

Checkout UI Extension

Hello!

It has been a super frustrating couple of weeks figuring out how to include some sort of "env variables" in the Checkout UI Extension.

Luckily for you, I've gone through several blogs and posts and have finally figured out the best way to do it! The Checkout UI extension is a little different from the normal Shopify app. It runs in a sandbox on the browser and thus doesn't have access to the environment variables in the app. If you use Remix to build your extension, you could see that your codes will be compiled into one js file which would then be placed at the placeholder on the Checkout page.

So What's The Hack?

I started off using settings. (Read more here: https://shopify.dev/docs/api/checkout-ui-extensions/2023-07/configuration#settings-definition ). The thing about settings is that it's user-defined (i.e. merchant will need to set the value at the checkout editor). So if you're trying to set something like the App URL, it works, but it will be prone to issues like wrongly set URL, etc.

What works for me, is the Metafields.

So what is a Metafield? (Read more here: https://shopify.dev/docs/api/checkout-ui-extensions/2023-07/configuration#metafields))

While a Metafield is usually used to add additional property to products, customers, companies, etc, there is also an option to add a Metafield to the shop. However, this would require the Admin GraphQL API.

  1. From your app (not your Checkout UI Extension), you could set the Metafield, here's a snapshot of the GraphQL mutation:

await graphql(

` mutation metafieldsSet($metafields: [MetafieldsSetInput!]!) {

   metafieldsSet(metafields: $metafields) {

     metafields {

       key

       namespace

       value

       createdAt

       updatedAt

     }

     userErrors {

       field

       message

     }

   }

 }`,

 {

   variables: {

     metafields: \[

       {

         key: "your-key",

         namespace: "your-namespace",

         ownerId: shop.id,

         type: "url",

         value: "your-value",

       },

     ],

   },

 },

);

You could call this during installation, or any point you find appropriate!

(Side note: you can use the same mutation to set the metafield for product, etc. Just make sure you supply the respective id to "ownerId" property)

  1. Once this is set, in your .toml file, you would need to add the metafield. Here's an example of how it looks like. Remember to position it under [[extensions.targeting]] block:

[[extensions.targeting]]

module = "./src/your-file.jsx"

target = "purchase.checkout.reductions.render-after"

[[extensions.targeting.metafields]]

namespace = "your-namespace"

key = "your-key"

Once this is done, you are super close to getting the value!

  1. In your Checkout UI Extension file, remember to:

a) Import useAppMetafields

import {useAppMetafields,} from "@shopify/ui-extensions-react/checkout";

b) Get the value:

const metaFields = useAppMetafields();

const metaField = metaFields.find((x) => x.metafield.namespace == "your-namespace" && x.metafield.key == "your-key")?.metafield;

const metaFieldValue = metaField.value;

That's it! Super easy and quick.

Let me know if this approach works for you (or doesn't)!

If you are a retailer in need of a return management solution, check us out at https://apps.shopify.com/liquidonate.

Till the next hack!

Let’s Connect

LiquiDonate is the first returns platform designed for sustainability. We connect returns directly to nonprofits, upcycle, or resell to reduce waste.

Contact Us