Paginate on a list.metaobject_reference metafield works for the custom namespace but returns only the first 50 for $app

I tested paginate on a list.metaobject_reference product metafield from a theme app extension, on a development store, on 2026-10-10. This is a follow-up to topic 34188, where the advice was to split references across several metafields of 50.

Two metafields of the same type, holding the same 120 metaobjects ($app:rubik_swatch, each with a distinct colour):

  • $app.rubik_swatch, defined in shopify.app.toml with access.storefront = "public_read"
  • custom.rubik_paginate_test, created with metafieldDefinitionCreate with storefront access PUBLIC_READ, later grown to 252 entries

Liquid used (the custom version only changes the path):

{%- assign n = 0 -%}
{%- paginate product.metafields["$app"].rubik_swatch.value by 250 -%}
  {%- for swatch in product.metafields["$app"].rubik_swatch.value -%}
    {%- assign n = n | plus: 1 -%}
  {%- endfor -%}
  <!-- looped={{ n }} items={{ paginate.items }} page_size={{ paginate.page_size }} current_page={{ paginate.current_page }} pages={{ paginate.pages }} param={{ paginate.page_param }} -->
{%- endpaginate -%}

Other pages were requested with the paginate.page_param key, for example ?page_e5f1aecc=2.

Results:

Metafield Entries paginate Page Loop iterations paginate.items paginate.pages
$app.rubik_swatch 120 none - 50 - -
$app.rubik_swatch 120 by 250 1 50 120 1
$app.rubik_swatch 120 by 50 1, 2, 3 50, 50, 50 (always entries 1 to 50) 120 3
product.metafields["app--<app id>"].rubik_swatch 120 by 250 1 50 120 1
custom.rubik_paginate_test 120 by 250 1 120 120 1
custom.rubik_paginate_test 252 by 250 1, 2, 3 250, 2, 0 252 2
custom.rubik_paginate_test 252 by 50 1, 2, 3 250, 2, 0 252 6

value.size returns the full count for both metafields. No Liquid errors in any render.

What this shows:

  1. For an app-owned $app list, paginate changes nothing. The loop gets the first 50 entries on every page, while paginate.items and paginate.pages are computed. The same happens through the real app--<app id> namespace.
  2. For a custom list, paginate works, but a page is always 250 entries whatever by says, and paginate.pages reports a different count.
  3. Definitions in shopify.app.toml can only live in $app, so an app cannot use this. More than 50 references per product still needs several metafields.
  4. The Metaobject limits page says paginate returns 250 per page. The paginate tag reference does not list metafield lists.

Not tested: sections or snippets inside the theme itself, the app has no write_themes scope.

Ask: make paginate work for $app lists the way it works for custom lists, or document the difference. For a product page or a product card, a way to read the whole list in one render would be best, since an app embed cannot send the shopper to page 2.

cc: @David-Shopify