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 inshopify.app.tomlwithaccess.storefront = "public_read"custom.rubik_paginate_test, created withmetafieldDefinitionCreatewith storefront accessPUBLIC_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:
- For an app-owned
$applist,paginatechanges nothing. The loop gets the first 50 entries on every page, whilepaginate.itemsandpaginate.pagesare computed. The same happens through the realapp--<app id>namespace. - For a
customlist,paginateworks, but a page is always 250 entries whateverbysays, andpaginate.pagesreports a different count. - Definitions in
shopify.app.tomlcan only live in$app, so an app cannot use this. More than 50 references per product still needs several metafields. - The Metaobject limits page says
paginatereturns 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