Shopify Metaobject Analytics in the Admin API
How to make Shopify metaobject data queryable and measurable in the Admin API: definitions, entries, GraphQL queries, pagination, permissions and pitfalls.

Shopify metaobject analytics in the Admin API means storing your custom data as metaobjects and then reading it back through GraphQL so it can be counted, filtered and reported on. Metaobjects let you keep size charts, bundles, lookbooks or spec sheets inside Shopify instead of a spreadsheet, and the Admin API is what turns that data into something you can measure. This guide covers the definitions you need, the queries that work, and the limits that catch teams out.
If you would rather have someone build and maintain the reporting layer for you, our Shopify app development team handles custom apps, private apps and store automation end to end.
What metaobjects are and where merchants actually use them
A metaobject is a custom data type you define in Shopify. You create a definition (the schema: fields, types, whether it is publishable), then create entries that follow it. Entries are structured records, not free text, so they can be referenced from products, collections and other metaobjects.
Typical uses we see:
- Size charts — one entry per product type, referenced from the product.
- Bundles and kits — a bundle entry listing component products and quantities.
- Lookbooks — publishable entries with images and linked products, rendered on the storefront.
- Spec sheets and compliance data — materials, care instructions, certifications.
- Store or warehouse records — internal reference data used by apps and workflows.
The important shift is that this data now lives in Shopify with a schema. That is what makes reporting possible: you can group by a field, count entries, and join them to products and orders in the same API.
What "queryable" means in the Admin API for metaobject data
Queryable means three things in practice:
- You can list entries of a definition with filters and pagination.
- You can follow references from products, orders or other entries to the metaobject, and back.
- You can read typed fields — the API returns values as their declared type, so a number is a number and a reference is an ID you can resolve.
Metaobjects are exposed through the GraphQL Admin API. REST does not cover them the same way, so plan on GraphQL. You will work with the metaobject definition queries, the metaobject entry queries, and the metafields connections on products and orders that point at your entries.
The minimum setup for reporting
Before any analytics work, get the schema right:
- Use specific field types. A price should be a number or money type, not a single-line text field. A status should be a choice list, not free text. Typed fields are what make aggregation reliable.
- Add a stable key field. Give each entry a short human-readable identifier (SKU-like) so exports and dashboards stay readable.
- Reference, do not duplicate. Link entries to products with a metaobject reference field rather than copying product handles into text.
- Decide publishability early. Publishable entries are visible to the Storefront API and themes; internal reporting entries usually should not be.
- Document the definition. Field names become part of your reporting contract. Renaming later breaks queries and dashboards.
Setting up metaobject definitions and entries for reporting
A workable order of operations:
- Model the data on paper. List the questions you want to answer (for example: which bundle entries have no active component products?). Each question should map to a field or a reference.
- Create the definition with the fields, types and capabilities you need. Keep the definition focused; split unrelated data into separate definitions.
- Seed entries through the Admin API or the Shopify admin. For bulk loads, write a small script that creates entries in batches and logs failures.
- Attach entries to products using metafields of type metaobject reference, so each product points at its size chart, bundle or spec record.
- Verify in the admin that entries render as expected before building any reporting on top.
A checklist before you build dashboards
- Every reporting field has a non-text type where possible.
- Every entry has a unique key.
- References resolve to active products.
- Publishable flags are set deliberately.
- You know which app owns each definition (ownership matters for permissions and cleanup).

Querying metaobject data alongside products and orders
Reporting usually needs two passes.
Pass one: the metaobject side. Query entries for a definition, page through them, and build a local table of entry ID, key and the fields you care about. Store it in your database or warehouse.
Pass two: the commerce side. Query products (or orders) with their metafields, resolve the referenced entry IDs, and join them to your local table. Now you can answer questions like revenue per bundle, products missing a size chart, or lookbook entries with no linked products.
Practical rules that save time:
- Request only the fields you need. GraphQL lets you shape the response; wide queries on large catalogs get slow and hit cost limits.
- Paginate with cursors. Use forward pagination with
firstandafter, and loop untilhasNextPageis false. Do not assume a fixed page size. - Respect the cost model. GraphQL Admin API calls are cost-weighted. Batch your work, cache definitions, and avoid re-fetching unchanged entries on every run.
- Use bulk operations for full exports. For a complete catalog dump, the bulk operations flow is the right tool rather than thousands of small queries.
- Snapshot over time. Metaobject entries change. If you need trends, store dated snapshots in your own database; the API gives you current state, not history.
Joining to orders
Orders rarely reference metaobjects directly. The usual pattern is: order line item → product → product metafield → metaobject entry. Resolve that chain once per product and cache the mapping, then aggregate order data against it. Trying to resolve the chain per order will be slow and fragile.
Common pitfalls: limits, pagination and permissions
- Assuming REST parity. Metaobject coverage is GraphQL-first. Teams that built on REST often need a rewrite of that part of their integration.
- Free-text fields. If a status or category is stored as text, you get inconsistent values and broken grouping. Fix the schema before the dashboard.
- Silent pagination bugs. Missing the last page or looping forever are both common. Log page counts and total records on every run.
- Permission and scope errors. Custom apps need the right access scopes for metaobjects and metafields. Private apps and admin-created tokens must be configured deliberately; a missing scope shows up as an empty result, not always a clear error.
- Definition ownership. Definitions created by an app belong to that app. If you uninstall or replace the app, plan how the data and definitions survive.
- Orphaned references. Products get deleted; entries still point at them. Add a weekly integrity check.
- No key field. Without a stable identifier, exports and joins become guesswork.
- Treating entries as history. Entries are current state. Any trend reporting needs your own snapshots.
When to build a custom app vs use an existing one
Build a custom app when your reporting questions are specific to your business, when you need joins across metaobjects, products and orders, or when the output feeds an internal warehouse or BI tool. A small private app that runs scheduled exports is often enough, and it is cheaper to maintain than a large platform.
Use an existing app when the need is standard: SEO field management, bundle building, or syncing store data into a CRM. Our SEO Products app is an example of the second path — it audits and fixes product and collection fields in bulk with review before publishing, rather than asking you to build that logic yourself.
A simple decision rule:
| Situation | Better choice |
|---|---|
| Unique reporting questions, internal dashboards | Custom private app |
| Standard SEO or bundle workflows | Existing app |
| Data must land in a warehouse or CRM | Custom app plus scheduled export |
| One-off cleanup of entries | Script plus admin review |
Whichever route you take, keep the principle we use on every build: the system proposes, a human approves. Nothing should be published or overwritten in bulk without a review step.
If you want a second opinion on your schema or a scoped estimate for a reporting app, get in touch and describe the questions you need to answer.
Related reading
Frequently asked questions
Does the Shopify Admin API support metaobjects in REST?
Metaobjects are primarily a GraphQL Admin API feature. Plan your integration around GraphQL queries, cursor pagination and the cost model rather than expecting REST endpoints to cover the same data.
Can I report on metaobject data historically?
Not from Shopify alone. The API returns current entries, not a change history. If you need trends, store dated snapshots of entries and their linked products in your own database or warehouse.
How do I link a metaobject entry to a product?
Create a product metafield of type metaobject reference that points at the entry. That gives you a reliable join path from product to entry, and from order line items to products to entries.
Why does my metaobject query return nothing?
The most common causes are missing access scopes on the app, querying the wrong definition type, or filtering on a field that is stored as free text with different values than expected. Check scopes first, then the definition schema.
Should metaobject fields be text or typed?
Use typed fields wherever possible. Numbers, money, dates and choice lists aggregate reliably; free-text fields produce inconsistent values and break grouping in reports.
When should I use bulk operations instead of normal queries?
Use bulk operations for full catalog or full definition exports. Use normal paginated queries for incremental syncs and small, targeted lookups where you need fresh data quickly.
Need metaobject reporting that actually works?
We build custom Shopify apps, reporting exports and integrations that make your metaobject data queryable and measurable — with review before anything changes.