Shopify metaobjects give merchants and developers a structured way to define, store, and display custom content types that don't fit neatly into products, collections, or pages. Think author profiles, ingredient lists, store locations, testimonials, or FAQ sets — content that has its own schema, multiple fields, and needs to be referenced across many places in your theme. If you've hit the limits of what metafields alone can do, Shopify metaobjects are the next tool to reach for.
This guide covers everything from how metaobjects work under the hood, to real Liquid and GraphQL code you can use today. Whether you're a theme developer or a technical merchant who wants more control over structured content, you'll leave with a clear picture of when and how to use Shopify metaobjects effectively.
Metaobjects vs Metafields: The Key Difference
Before diving deeper, it helps to be precise about what separates metaobjects from Shopify metafields.
Metafields attach extra data to an existing Shopify resource — a product, variant, customer, order, etc. They're great for extending a known object. A product metafield for "material composition" makes perfect sense because it belongs to that specific product.
Shopify metaobjects, by contrast, are standalone objects. They don't attach to anything by default — they exist independently and can be referenced from multiple resources. An "Author" metaobject entry might be referenced by dozens of blog posts. A "Store Location" metaobject might appear in a footer, a map page, and a contact block simultaneously.
| Feature | Metafields | Metaobjects |
|---|---|---|
| Attached to a resource | Yes (product, order, etc.) | No — standalone |
| Multiple fields per entry | One value per metafield | Yes — structured schema |
| Reusable across resources | No | Yes — reference from anywhere |
| Defined by merchant/dev | Yes | Yes |
| Queryable via Storefront API | Yes | Yes |
In short: metafields extend existing resources; metaobjects define entirely new content types.
How Shopify Metaobjects Work
Per the official Shopify metaobjects documentation, the Shopify metaobjects system has three layers: definitions, entries, and fields.
Definitions
Shopify metaobject definitions are the schema — the blueprint for a content type. When you create a definition, you specify a name (e.g., "Author"), a unique API handle (e.g., author), and the list of fields each entry will contain. Definitions live at the store level and are shared across all entries of that type.
Entries
Shopify metaobject entries are the actual data records that conform to a definition. If your definition is "Author", then each individual author (Jane Smith, Tom Baker, etc.) is an entry. Entries can be created in the Shopify admin, via the Admin API, or via bulk import.
Fields
Each definition specifies which fields its entries will have. Supported field types include: single-line text, multi-line text, integer, decimal, date, date and time, true/false (boolean), color, URL, file reference, product reference, collection reference, metaobject reference (nesting), and more. Field types map closely to what you already know from metafield types.
Where They Live in Admin
In the Shopify admin, navigate to Content > Metaobjects. From here you can manage definitions (each definition shows up as a section) and add, edit, or delete individual entries. The UI is straightforward — merchants can manage content without touching code once a developer has set up the definition.
Real-World Use Cases for Shopify Metaobjects
The flexibility of Shopify metaobjects becomes clear when you look at the content problems real stores face every day.
Author/Creator Profiles for Blog Posts
Shopify's native blog doesn't have author profiles. With a metaobject definition for "Author" (fields: name, bio, photo, social links), you can create entries for each contributor, then reference them from a blog post metafield. Your theme Liquid can then pull in the full profile wherever it's needed — bylines, about-the-author boxes, or author archive pages.
FAQ Content on Product Pages
Instead of hardcoding FAQ copy into product descriptions, define a "FAQ Item" metaobject with question and answer fields, then create a list metafield on products that references multiple FAQ entries. This gives content editors a clean interface and makes FAQ content reusable across products.
Testimonials and Case Studies
A "Testimonial" definition might have fields for customer name, company, quote, star rating, and photo. Entries are managed in the admin, and your theme pulls them into any section — homepage, product pages, or a dedicated testimonials archive — without duplicating data.
Store Locations / Branches
Multi-location retailers can define a "Store Location" type with address, phone, hours, map coordinates, and a featured image. Each branch becomes an entry. A store finder page then queries all entries and renders them in a consistent layout.
Ingredient Lists / Product Specs
For cosmetics, food, or supplements, an "Ingredient" metaobject can carry INCI name, description, source, and allergen flags. Products reference the ingredients they contain. This separates content from formatting — change an ingredient description once, and it updates everywhere.
Recipe Cards / How-To Guides
A "Recipe" definition (prep time, cook time, servings, difficulty, steps, ingredients list) lets editorial teams build recipe content in a structured way. The theme renders it consistently, and rich snippet markup for Google becomes much easier to generate because the data is already typed and structured.
Custom Landing Page Components
Combined with custom Shopify sections development, metaobjects power modular landing page builders. A "Feature Card" definition or "Icon Block" type lets marketers assemble landing pages from reusable, schema-validated pieces rather than free-form HTML in page content fields.
Setting Up Shopify Metaobjects: Step-by-Step
1. Create a Definition
- Go to Shopify Admin > Content > Metaobjects.
- Click Add definition.
- Give it a name (e.g., Testimonial). Shopify auto-generates an API handle (e.g.,
testimonial) — you can customise it before saving. - Optionally enable Storefront access if you need to query entries via the Storefront API or Liquid.
2. Add Fields
- Inside the definition, click Add field.
- Choose a type (e.g., Single line text for "Customer Name").
- Set a name and API identifier (e.g.,
customer_name). - Mark fields as required if entries should always have a value.
- Repeat for each field in your schema: quote, star rating (Integer), photo (File reference).
3. Create Entries
- From the definition page, click Add entry.
- Fill in all field values for the first record.
- Save. Repeat for each additional entry.
Entries can also be created in bulk via the Shopify metaobjects API using metaobjectCreate mutations — useful when migrating data from a spreadsheet or legacy CMS.
4. Reference Them in Theme Liquid
To use entries in your theme, you first need to connect them to a Shopify resource. For example, add a metafield of type metaobject reference (or list of metaobject references) to products, blog posts, or pages. Then in Liquid, dereference the metafield to access the entry's fields.
Querying Metaobjects in Liquid with Code Examples
Once a metaobject reference metafield is set on a resource, accessing it in Liquid is straightforward.
Example: Rendering a single testimonial referenced from a product
{% assign testimonial = product.metafields.custom.testimonial.value %}
{% if testimonial %}
<blockquote>
{{ testimonial.quote.value }}
<footer><strong>{{ testimonial.customer_name.value }}</strong> {% if testimonial.company.value %} — {{ testimonial.company.value }} {% endif %}</footer>
</blockquote>
{% endif %}Example: Rendering a list of FAQ entries referenced from a product
{% assign faqs = product.metafields.custom.faqs.value %}
{% if faqs.size > 0 %}
<section class="product-faqs">
<h2>Frequently Asked Questions</h2>
<dl>
{% for faq in faqs %}
<dt>{{ faq.question.value }}</dt>
<dd>{{ faq.answer.value }}</dd>
{% endfor %}
</dl>
</section>
{% endif %}Example: Fetching all entries of a type using metaobject_list
{%- assign locations = shop.metaobjects.store_location.values -%}
<ul class="store-locations">
{%- for location in locations -%}
<li>
<strong>{{ location.name.value }}</strong>
{{ location.address.value }}
{{ location.phone.value }}
</li>
{%- endfor -%}
</ul>Note: the shop.metaobjects.{handle}.values pattern requires Storefront access to be enabled on the definition and works in Online Store Liquid contexts.
Accessing Metaobjects via the Storefront API
For headless storefronts, PWAs, or custom apps, the Shopify metaobjects API exposes entries via GraphQL. The Storefront API supports querying both individual entries by handle and paginated lists of all entries for a given type.
Query: Fetch all testimonial entries
query GetTestimonials {
metaobjects(type: "testimonial", first: 10) {
edges {
node {
id
handle
fields {
key
value
}
}
}
}
}Query: Fetch a single entry by handle
query GetLocation($handle: MetaobjectHandleInput!) {
metaobject(handle: $handle) {
id
fields {
key
value
reference {
... on MediaImage {
image {
url
altText
width
height
}
}
}
}
}
}
# Variables:
# {
# "handle": { "type": "store_location", "handle": "london-office" }
# }The reference field is crucial when you have file, product, or nested metaobject field types — it lets you resolve the referenced resource in the same query.
The Admin API exposes its own set of Shopify metaobjects API mutations (metaobjectCreate, metaobjectUpdate, metaobjectDelete, metaobjectBulkDelete) and queries (metaobjects, metaobjectDefinitions) for programmatic management — essential for Shopify app development that manages structured content at scale.
Shopify Metaobjects Limits and Best Practices
Understanding platform limits prevents unpleasant surprises at scale.
- Definition count: Up to 25 metaobject definitions per store (as of 2025). Plan your schema carefully — don't create a new type for every minor variation.
- Fields per definition: Up to 30 fields per Shopify metaobject definition. Prioritise. If you find yourself hitting 30, consider whether some fields should be metafields on the resource that references the entry instead.
- Entries per definition: No hard published cap per definition, but API rate limits apply. Bulk operations should use cursor-based pagination.
- API rate limits: The Storefront API uses a cost-based leaky bucket. Complex queries with many resolved references cost more. Cache aggressively, and avoid querying all entries on every page load.
- Storefront access: Must be explicitly enabled per definition. If entries aren't showing up in Liquid or Storefront API responses, check this setting first.
- Nesting depth: Metaobject references can be nested (a metaobject referencing another metaobject), but keep nesting shallow — deep nesting makes GraphQL queries verbose and increases query cost.
- Handles are permanent: The API handle of a Shopify metaobject definition cannot be changed after creation without deleting and recreating the definition. Choose handles deliberately.
Common Mistakes to Avoid
- Duplicating content type logic in metafields and metaobjects simultaneously. Decide upfront: if data is standalone and reusable, it belongs in a metaobject. If it's intrinsically part of one product or resource, a metafield is fine.
- Forgetting to enable Storefront access. Definitions are private by default. Storefront API queries and Liquid access both require Storefront access to be toggled on.
- Hardcoding handles in Liquid. Use theme settings or metafield references to connect entries to resources, rather than looking up entries by a hardcoded handle string. Hardcoded handles break if content editors rename entries.
- Ignoring field validation. Shopify enforces required fields and type constraints at save time in the admin, but Admin API mutations can bypass required field validation if you're not careful. Always validate on the app side too.
- Creating too many definitions early. With a 25-definition limit, don't create a new type for every edge case during early development. Group similar content into one definition with optional fields where appropriate.
- Not planning for localization. If your store serves multiple languages, build translation workflows around metaobject entries from the start. Shopify's Translate & Adapt app supports metaobject fields, but retrofitting this later adds friction.
When to Use Metaobjects vs Metafields vs Apps
The decision tree is simpler than it might appear:
| Scenario | Best Fit |
|---|---|
| Extra data for a specific product (e.g., care instructions) | Metafield on product |
| A content type referenced across many resources | Shopify metaobjects |
| Data that needs its own admin UI, complex relationships, or external sync | Custom app with own DB |
| One-off configuration values | Metafield on shop/theme |
| Structured content with <25 types, managed by non-devs | Shopify metaobjects |
| Thousands of records with complex queries or reporting needs | Custom app |
Shopify metaobjects hit a sweet spot: they're fully native (no app install required), editable by non-technical merchants via a clean admin UI, queryable via both Liquid and API, and versioned alongside your store's data. For content that fits within the definition and entry limits, they're almost always the right choice over a third-party app or a DIY solution with metafields alone.
That said, if your use case requires more than 25 content types, complex relational queries, scheduled publishing, or two-way sync with an external CMS, a dedicated headless CMS or a custom-built Shopify app will serve you better. The platform limits aren't a flaw — they reflect the scope metaobjects are designed for.
Conclusion
Shopify metaobjects are one of the most powerful content modelling tools Shopify has shipped in recent years. They fill a genuine gap between simple metafields and full custom-app development, giving stores a native, structured, API-accessible way to define and manage any content type a merchant needs. From Shopify metaobject definitions and Shopify metaobject entries to Liquid rendering and GraphQL queries via the Shopify metaobjects API, the system is well-designed for real-world use cases.
Used correctly, Shopify metaobjects reduce content duplication, keep your theme maintainable, and give non-technical team members a clean interface to manage structured content without touching code. The key is planning your definitions thoughtfully before you start, staying within the platform's limits, and knowing when a more powerful solution is the right call.
If you're building out a complex Shopify theme or need help architecting a Shopify custom content types strategy with metaobjects at its core, the team at Mgroup works with growing Shopify stores every day to design scalable, maintainable storefronts that get results.
FAQ
What are Shopify metaobjects used for?
Shopify metaobjects are for structured content that needs its own fields and can be reused across resources, such as authors, FAQs, store locations, or testimonials.
How are Shopify metaobject definitions different from entries?
Shopify metaobject definitions are the schema for a content type, while Shopify metaobject entries are the individual records that follow that schema.
Can Shopify metaobjects be referenced from products or pages?
Yes. You can add a metaobject reference or list of references metafield to products, blog posts, or pages, then use the linked Shopify metaobject entries in Liquid.
How do I access Shopify metaobjects in the Storefront API?
The Shopify metaobjects API supports GraphQL queries for a list of entries or a single entry by handle. Storefront access must be enabled on the definition first.
When should I use Shopify metaobjects instead of metafields?
Use Shopify metaobjects when the content is standalone, reusable, and has multiple fields. Use metafields for extra data tied to one specific resource.


