What Are Metaobjects?
Metaobjects are custom data structures that Shopify introduced in 2023 to let merchants store arbitrary data on products, collections, and custom objects. Before metaobjects, adding custom fields to products required a custom app or third-party tool. Metaobjects changed that—they're built into Shopify as a first-class citizen.
Think of metaobjects as lightweight databases inside Shopify. A beauty brand selling skincare can create a "Ingredients" metaobject containing fields like ingredient name, concentration %, benefit, and sourcing info. Link that metaobject to each product. Now every product page shows live ingredient data, queryable via GraphQL, customizable in your theme.
For most use cases, metaobjects are cheaper and faster to implement than building a custom app. They're built into Shopify, don't require external servers, and are accessible through the Shopify GraphQL API and theme code.
Core Concepts: Metaobject Types & Fields
A metaobject is defined by its type. Common types:
- Product Metaobject: Linked to individual products. Example: "Sustainability Credentials" type with fields for carbon footprint, recyclable packaging, fair-trade certification.
- Collection Metaobject: Linked to collections. Example: "Seasonal Campaign" type with fields for campaign name, hero image, launch date, discount code.
- Page Metaobject: Linked to custom pages. Example: "FAQ Block" type with Q&A pairs.
- Order Metaobject: Custom data associated with orders. Example: "Gift Message" type.
- Custom Standalone Metaobject: Not linked to products or collections. Example: "Blog Posts" type for custom blog articles, "Testimonials" type for customer reviews.
Each metaobject type defines a set of fields. Field types include:
- Single Line Text: Up to 255 characters (product SKU, ingredient name)
- Multi-line Text: Unlimited (product description, instructions)
- Number: Integer or decimal (concentration %, weight in grams)
- Boolean: Yes/no (recyclable, vegan)
- Date: For scheduling (launch date, expiration)
- URL: Web links with validation
- JSON: Arbitrary structured data (complex data without predefined fields)
- File Reference: Images or documents
- Rich Text: Formatted text with markdown/HTML
You can also link metaobjects to other metaobjects or to core Shopify resources (products, collections).
When to Use Metaobjects (vs. Custom Apps)
Metaobjects are powerful but not a replacement for custom apps. Know the tradeoff.
Use Metaobjects if:
- You need structured data on products or collections (ingredients, specs, comparisons)
- You want team members to edit data via Shopify admin UI
- You don't need real-time integrations with external systems
- You want to query data via GraphQL without building an API
Use Custom Apps if:
- You need to integrate with external services (sync inventory to a third-party warehouse system)
- You need webhooks and real-time event processing
- You need custom automation or business logic beyond data storage
- You need to modify Shopify's native behavior (override checkout, alter product pricing)
Example: A vitamins brand needs to store supplement facts on products. That's a metaobject (structured data, admin edit, theme display). But they also need to sync batch numbers and expiration dates to a warehouse management system in real-time. That requires a custom app with webhook handling, not just metaobjects.
Design Pattern: Product Comparison Metaobject
Here's a real design: a $2M fitness apparel brand wants to show detailed product comparisons on collection pages.
Step 1: Define the Metaobject Type
Create a metaobject type called "Product Comparison Matrix":
| Field Name | Field Type | Purpose |
|---|---|---|
| Comparison Name | Single Line Text | e.g., "Fit" |
| Comparison Value | Single Line Text | e.g., "True to Size" |
| Comparison Category | Select | Fit / Material / Durability / Price / Sustainability |
| Is Primary | Boolean | Show in quick compare, or details only |
Step 2: Create Entries
For each product, add comparison data:
- Product: "Performance Running Shorts"
- Entries:
- Fit: "True to Size" (Primary: yes)
- Material: "100% Nylon with spandex" (Primary: yes)
- Durability: "50 wash cycles tested" (Primary: no)
Step 3: Query via GraphQL
In your Shopify theme or custom app, fetch comparison data:
query {
product(id: "gid://shopify/Product/12345") {
metaobject(type: "product_comparison_matrix") {
fields {
key
value
}
}
}
}
Step 4: Render on Product Pages
Use Liquid or JavaScript to loop through metaobject fields and display in a table or comparison widget.
Step 5: Scale to Collections
Create a custom collection template that queries all products' comparison data and renders a full comparison matrix. Customers can now compare 5 products side-by-side without leaving Shopify.
Result: A custom product comparison feature, zero custom app code, managed entirely through Shopify admin.
Implementation: Building a Skincare Ingredient List
A cosmetics brand needs ingredient lists on product pages that include sourcing info, concentrations, and benefits.
Metaobject Type: "Ingredient"
| Field | Type | Required |
|---|---|---|
| Ingredient Name | Text | Yes |
| Concentration (%) | Number | No |
| Sourcing | Text | No |
| Benefit | Rich Text | No |
| Allergen | Boolean | No |
Admin Workflow:
- Store admin opens Product > Edit
- Scrolls to "Ingredients" metaobject section
- Clicks "Add Ingredient" → fills in 5 fields
- Repeats for each ingredient in the product
- Publishes product
Theme Implementation:
Liquid code fetches ingredients and renders as a collapsible list:
{% if product.metaobjects.ingredients %}
<div class="ingredient-list">
{% for ingredient in product.metaobjects.ingredients %}
<div class="ingredient">
<h4>{{ ingredient.ingredient_name }}</h4>
{% if ingredient.concentration %}
<p>Concentration: {{ ingredient.concentration }}%</p>
{% endif %}
<p>{{ ingredient.benefit }}</p>
{% if ingredient.allergen %}
<span class="badge">Allergen</span>
{% endif %}
</div>
{% endfor %}
</div>
{% endif %}
Team members can edit ingredients without touching theme code. Shopify handles version control and publishing.
Performance & Limitations
Metaobjects are fast—Shopify hosts them on its global CDN. Query times: sub-100ms for most reads. But there are limits:
Limits to know:
- Max 25 fields per metaobject type (design around this with JSON fields if needed)
- Max 10MB per metaobject entry (total JSON size)
- Max 100 metaobject types per store (rarely hit)
- GraphQL API rate limits apply (same as other Shopify API calls: 2 calls/second for standard plans)
For most use cases, these limits are not reached. A product with 20 ingredients (20 metaobject entries linked to a product) queries in <50ms.
Real-World Example: A $800K DTC Home Goods Store
Bloom Home sells furniture and home decor, $800K annual revenue. They wanted to show care instructions, assembly guides, and warranty info on every product—but without hiring a developer.
Solution: Two Metaobject Types
-
"Care Instructions" (linked to products)
- Care Type: Cleaning method (Vacuum / Wipe / Wash)
- Instructions: Step-by-step text
- Warning: Belt for safety notes
-
"Assembly Guide" (linked to products)
- Has Tools: Boolean
- Time Required: Number (minutes)
- Guide File: PDF or image
- Video URL: Optional instructional video
Implementation:
- Hired theme developer ($2K) to build template that queries metaobjects
- Trained ops team to fill in metaobject data in admin (1 day training)
- Automated: Any new product gets care/assembly data filled during product import
Results:
- Reduced customer support emails about care by 35% (self-service care instructions)
- Returns decreased 8% (customers followed assembly guides correctly)
- Product pages became authority-heavy—search rankings improved 15% (more structured content)
Cost: $2K dev + $50/month Shopify (metaobjects included in all plans). ROI: Positive within 3 months.
Ready to Build Custom Content Types?
Metaobjects enable scalable, team-friendly data management without custom code. Build product comparisons, ingredient lists, care guides, or custom business objects—all within Shopify.
Contact tenten.co/contact to design your metaobject architecture.
Explore more advanced Shopify development in our custom Shopify dashboard Admin API guide to see how to build complex data applications on top of Shopify.
Editorial Note: Metaobjects are one of Shopify's most underrated features. Teams that master custom content structures gain compounding advantages: faster feature development, better team scalability, and richer product experiences.
Frequently Asked Questions
What's the difference between metaobjects and custom fields?
Custom fields (now called "metafields" in older Shopify terminology) store single key-value pairs. Metaobjects are full data types with multiple fields, relationships, and admin UIs. Metaobjects are more powerful and easier for non-technical teams.
Can I migrate existing metafield data to metaobjects?
Yes. Shopify provides APIs for reading metafields and writing metaobject data. For most stores, a simple script or Zapier integration can migrate data in bulk. Contact a Shopify partner for help if data is complex.
Are metaobjects queryable in the GraphQL API?
Yes. Metaobjects appear in both the storefront GraphQL API (read-only, for themes) and the admin GraphQL API (read-write, for apps). You can filter, sort, and paginate metaobject queries.
Can metaobjects link to other metaobjects?
Yes. A field type can be "Metaobject Reference", allowing you to link one metaobject to another. Example: A "Recipe" metaobject can link to multiple "Ingredient" metaobjects, creating a one-to-many relationship.
What if I need to collect metaobject data from customers in a form?
Metaobjects store merchant data, not customer input. If you need customer input (e.g., custom engraving, personalization), use a custom app with a checkout extension or third-party service (Gorgias, Tapcart) to capture that data and link it to orders.