App owned meta object access not working

Hello Shopify Support/Community,

I am building a Shopify app with a theme app extension that uses app-owned metaobjects for dynamic content (a timer block). I have followed all official documentation and community advice, but my app-owned metaobjects are not accessible in Liquid, and my block always shows “No timer found.”

My setup:

  • I am using the latest Shopify API (2025-07).

  • My metaobject definition is created with type: “$app:timer” (confirmed in Admin as app–{app-id}–timer).

  • The definition has publishable: { enabled: true } and onlineStore: { enabled: true }.

  • Metaobject entries are created by my app using the Admin API with type: “$app:timer”.

  • I am not using any publish or status logic, as per the latest API requirements.

  • My theme app extension block is deployed, and the block is added to the product page template in the theme editor.

  • In my Liquid, I use {% assign timers = shop.metaobjects['$app:timer'] %} and loop through timers, but the array is always empty.

  • I have tried hard refreshes and waited for cache, but the data never appears.

  • If I use merchant-owned metaobjects (type: “timer”), they do appear in Liquid, but this is not secure for my use case.

What I have already checked:

  • The app is installed and permissions are correct.

  • The block is present and enabled in the theme.

  • The metaobject entries are visible in Admin under the correct app-owned definition.

  • I have read the official docs (Shopify app-owned metaobjects) and community threads (example), and my setup matches all requirements.

Issue:

  • Despite all of the above, shop.metaobjects['$app:timer'] is always empty in Liquid, and my app block cannot display any data.

Request:

  • Is there a known limitation or bug with app-owned metaobject access in Liquid for theme app extensions?

  • Is there any additional step or workaround to make app-owned metaobjects accessible in Liquid?

  • If this is a platform issue, can you escalate or provide an ETA for a fix?

Thank you for your help!

1 Like

Hi @mawlanafoysal955,

I ran into something similar before with app-owned metaobjects in theme app extensions. From what I learned, they aren’t yet directly accessible in Liquid the same way merchant-owned metaobjects are. Shopify’s docs mention $app: types, but in practice, the access layer for Liquid is still limited — in some cases, only your app’s backend can retrieve and pass that data via an App Proxy or storefront API.

What worked for me:

  1. Use the Storefront API to query the app-owned metaobjects and then render them in your block via JS.

  2. Alternatively, sync the data into a merchant-owned metaobject (just the public parts) for the front-end display, while keeping secure details in the app-owned one.

  3. If you suspect a platform limitation, you can open a ticket directly with Shopify Partner Support — they confirmed to me before that this feature was partially rolled out.

It might not be a coding error on your end — it’s possible Liquid just can’t read $app: types yet.

Hope that helps you move forward until Shopify updates the feature.

1 Like

thanks for your reply ,
I ended up using like this `shop.metaobjects[‘app–272715022337–my_timer’].values` and got the result.

But I’m facing the issue is my all entries are becoming draft after creation so if I active them manually then they are showing on store front but I followed the docs walking path as they say I did here my code-
const DEFINITION_CREATE_MUTATION = `

mutation metaobjectDefinitionCreate($definition: MetaobjectDefinitionCreateInput!) {

metaobjectDefinitionCreate(definition: $definition) {

metaobjectDefinition {

id

name

type

fieldDefinitions { key name type { name } required }

}

userErrors {

field

message

}

}

}

`;

const TIMER_METAOBJECT_DEFINITION = {

name: “Timer”,

type: “$app:timer”,

capabilities: {

publishable: { enabled: true },

renderable: { enabled: true },

translatable: { enabled: false },

onlineStore: { enabled: true }

},

fieldDefinitions: [

{ key: “name”, name: “Name”, type: “single_line_text_field”, required: true },

],
its creating the entries successfully though but here you can see i have to active it manually from admin metaobject settings

so can you give me a example or hint how can i make it automatic to be active upon creation those entries or i have to publish them separetly by adding any active battun i tried sevarel way for this but i am getting Gql error all the time whats your suggestions?

Hi @mawlanafoysal955,

You’ve done a great job outlining your setup and confirming each requirement. Based on your explanation, this doesn’t look like a mistake in your implementation but more likely a limitation in how Shopify currently exposes app-owned metaobjects inside Liquid for theme app extensions.

A couple of things you can double-check:

  • Make sure your extension block is set up to request the correct namespace and type, sometimes Shopify prefixes the $app: types differently depending on the environment.

  • Try accessing the entry by its handle instead of looping through the entire definition — in some cases only handles are available in Liquid.

  • If you need a faster workaround, you can use a proxy API call from your block to fetch the metaobject entries directly from your app, then render them dynamically. It’s not as clean as native Liquid access, but it ensures your block can still show content until Shopify resolves the limitation.

Since this seems to be platform-level, I’d also recommend opening a ticket with Shopify Partner Support to confirm whether this is a bug with app-owned metaobject access.

If you’d like, feel free to reach me directly — I’ve worked with similar setups and can guide you through a tested workaround while Shopify addresses it. You can contact me here: atechdigitalfreelance@gmail.com.

Also, just to clarify — my previous account was unavailable, but I’m still active here and wanted to make sure you got a reply.

Hope this points you in the right direction.