shopify.appMetafields returning empty - 2026-04

I have a simple Customer UI Extension in the Order Status page, that uses an app-owned Metafield. It has worked fine on 2025-07 and earlier. We do use the recommended callback shopify.appMetafields.subscribe(...) etc.

Now, I’m updating the extension to 2026-04, with Preact etc. It’s pretty much done, but the problem is:

  1. While in the editor, the callback eventually returns an array with our metafield inside. All works well.
  2. On a live Order Status page, the callback returns an empty array every time only.

I also tested the production version of the extension. This is code we have not touched in several months, only to find that it’s also broken because it doesn’t load the app Metafield anymore. Apparently, the extension we’ve deployed several months ago and have not changed, running on version 2025-07, suddenly stopped working. I don’t know since when.

EDIT: I replaced the subscription callback with shopify.appMetafields.value, which is a “signal” that causes Preact to re-render, but the same problem continues: Metafield eventually populates in the editor, but not in the live page.

Please do not tag Shopify staff members that have not already engaged in a topic, this is outlined in the code of conduct.

Hey @flavio-b - thanks for flagging this, and for the detail.

Can you please share an x-request-id from the page request in the storefront and one from the editor if possible? This trace will give me an idea of some of the specifics of your request and from there I can hopefully pinpoint the root cause.

One thing worth checking on your end in the meantime as well, although it doesn’t explain the checkout editor/live storefront behaviour: as of 2026-04, the value needs to live on the order to show up on Order Status, since the older checkout metafields were removed. A value stored on the cart or checkout won’t reach Order Status until it’s saved onto the order itself. More information in the changelog here:

Thanks!

Thanks, @Wes-Dev-Shopify!

  1. Inside the Editor
    Path: /[omitted]/account/customer/api/unstable/graphql?operation=UiExtensionMetafields
    Request ID: d25a4cb0-10a4-4d20-91b8-344f98f2cec0-1781219088
  1. In a live Order Status page:
    Path: /[omitted]/account/customer/api/unstable/graphql?operation=OrderStatusUiExtensionMetafields
    Request ID: 628a5930-4ae3-412d-869a-02327394c35d-1781219407

Hmm.. I noticed they’re different query params altogether. I checked all the GraphQL requests in the editor and live page and this is what I get (see attached).

By the way, I’m using App metafields, not Order or Checkout metafields. Based on the network calls, it seems like the Live page is not even attempting to fetch the App Metafields.


Hey @flavio-b - thanks for grabbing those, the request IDs made this much easier to dig into.

I traced both. As you mentioned, the editor and the live Order Status page don’t run the same query for your extension’s metafields. The editor looks them up directly by your extension. The live Order Status page was changed fairly recently to resolve them through the order and its targets instead, and that’s the path where yours comes back empty. So your read of the network calls is right. It isn’t that the live page skips app metafields, it’s that it asks for them a different way, and on that path they aren’t being matched.

I believe this lines up with a known issue we’re already tracking on our end, and if so, you’re not missing anything in your own code. Another developer reported the same empty OrderStatusUiExtensionMetafields result there, and you can follow that thread for updates:

One thing that’s worth clarifying: the metafields and targeting blocks from your shopify.extension.toml. Specifically whether the metafield is declared at the extension level ([[extensions.metafields]]) or per target, and which targets you have.

Please send that over and I can compare it against what we’re seeing.

Thanks!

Hi @Wes-Dev-Shopify, these are the details you requested from shopify.extensions.toml:

[[extensions.targeting]]
module = "./src/components/OrderStatusBlock.jsx"
target = "customer-account.order-status.block.render"
default_placement = "ORDER_STATUS2"

[[extensions.targeting]]
module = "./src/components/ThankYouPageBlock.jsx"
target = "purchase.thank-you.block.render"


[[extensions.metafields]]
namespace = "$app"
key = "subscription_active"

This is how we use the app metafield:

class App {
    get isSubscriptionActive() {
        return shopify.appMetafields.value.some(
            ({metafield: {namespace, key, value}}) =>
                namespace === '$app' &&
                key === 'subscription_active' &&
                value === 'true'
        );
    }
}
export const app = new App();

This app instance is then consumed by a Preact component. Things render differently depending on whether the subscription is active. The component can re-render when the metafield has had chance to load properly.

Hey @flavio-b - thanks for the additional context. It looks like this is indeed a bug on our end and not anything in your extension, so no changes are needed to your TOML or code.

Here’s what’s happening. The live Order Status page looks up your extension differently than the editor does, and in that lookup your extension is being missed entirely, so the query returns an empty array before it ever reads the metafield. The trigger is having default_placement set alongside your two targets. That combination trips the live lookup, while the editor uses a different path, which is why it still works there.

This is the same underlying issue in the thread I linked earlier, and a fix is in progress. I don’t have a timeline to share yet, but I’ll post back here once it ships.

Sounds good. Thank you for the clarification!

I hope a fix can be released soon. Apologies for the pressure, but this is rather urgent as it’s impacting merchants on their live stores.

Hi @Wes-Dev-Shopify,

since yesterday, the Metafield is loading correctly on the live pages. I assume this means the team has settled on a stable fix for the issue. I’ll mark this topic as resolved.

Please let me know if things are still in flux and if we need to be on the lookout for anything.

Thanks again for your assistance.